From: Takashi Iwai <tiwai@suse.de>
To: torvalds@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Subject: [PATCH 02/16] [ALSA] race between disconnect and error handling in usbmidi
Date: Fri, 22 Feb 2008 18:34:44 +0100 [thread overview]
Message-ID: <s5hk5kwyjwr.wl%tiwai@suse.de> (raw)
In-Reply-To: <s5hoda8yjza.wl%tiwai@suse.de>
The driver resubmits URBs from an error handler and schedules the error
handler from the URBs' completion handlers. To reliably kill the cycle
a flag must be used.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/usb/usbmidi.c | 19 ++++++++++++++++++-
1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
index 750e929..6676a17 100644
--- a/sound/usb/usbmidi.c
+++ b/sound/usb/usbmidi.c
@@ -104,12 +104,14 @@ struct snd_usb_midi {
struct usb_protocol_ops* usb_protocol_ops;
struct list_head list;
struct timer_list error_timer;
+ spinlock_t disc_lock;
struct snd_usb_midi_endpoint {
struct snd_usb_midi_out_endpoint *out;
struct snd_usb_midi_in_endpoint *in;
} endpoints[MIDI_MAX_ENDPOINTS];
unsigned long input_triggered;
+ unsigned char disconnected;
};
struct snd_usb_midi_out_endpoint {
@@ -306,6 +308,11 @@ static void snd_usbmidi_error_timer(unsigned long data)
struct snd_usb_midi *umidi = (struct snd_usb_midi *)data;
int i;
+ spin_lock(&umidi->disc_lock);
+ if (umidi->disconnected) {
+ spin_unlock(&umidi->disc_lock);
+ return;
+ }
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
struct snd_usb_midi_in_endpoint *in = umidi->endpoints[i].in;
if (in && in->error_resubmit) {
@@ -316,6 +323,7 @@ static void snd_usbmidi_error_timer(unsigned long data)
if (umidi->endpoints[i].out)
snd_usbmidi_do_output(umidi->endpoints[i].out);
}
+ spin_unlock(&umidi->disc_lock);
}
/* helper function to send static data that may not DMA-able */
@@ -1049,7 +1057,14 @@ void snd_usbmidi_disconnect(struct list_head* p)
int i;
umidi = list_entry(p, struct snd_usb_midi, list);
- del_timer_sync(&umidi->error_timer);
+ /*
+ * an URB's completion handler may start the timer and
+ * a timer may submit an URB. To reliably break the cycle
+ * a flag under lock must be used
+ */
+ spin_lock_irq(&umidi->disc_lock);
+ umidi->disconnected = 1;
+ spin_unlock_irq(&umidi->disc_lock);
for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
struct snd_usb_midi_endpoint* ep = &umidi->endpoints[i];
if (ep->out)
@@ -1062,6 +1077,7 @@ void snd_usbmidi_disconnect(struct list_head* p)
if (ep->in)
usb_kill_urb(ep->in->urb);
}
+ del_timer_sync(&umidi->error_timer);
}
static void snd_usbmidi_rawmidi_free(struct snd_rawmidi *rmidi)
@@ -1685,6 +1701,7 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip,
umidi->quirk = quirk;
umidi->usb_protocol_ops = &snd_usbmidi_standard_ops;
init_timer(&umidi->error_timer);
+ spin_lock_init(&umidi->disc_lock);
umidi->error_timer.function = snd_usbmidi_error_timer;
umidi->error_timer.data = (unsigned long)umidi;
--
1.5.3.8
next prev parent reply other threads:[~2008-02-22 17:35 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-22 17:33 [PATCH 0/16] ALSA fixes for 2.6.25-rc2 Takashi Iwai
2008-02-22 17:34 ` [PATCH 01/16] [ALSA] opl3 - Fix compilation without sequencer support Takashi Iwai
2008-02-22 17:34 ` Takashi Iwai [this message]
2008-02-22 17:35 ` [PATCH 03/16] [ALSA] oxygen - Fix section mismatch Takashi Iwai
2008-02-22 17:35 ` [PATCH 04/16] [ALSA] hdsp " Takashi Iwai
2008-02-22 17:36 ` [PATCH 05/16] [ALSA] HDA - enable snoop on SCH Takashi Iwai
2008-02-22 17:36 ` [PATCH 06/16] [ALSA] hda-codec - Fix SPDIF output on Conexant 5045 codec Takashi Iwai
2008-02-22 17:40 ` [PATCH 07/16] [ALSA] oxygen: fix line-in recording selection Takashi Iwai
2008-02-22 17:41 ` [PATCH 08/16] [ALSA] soc - duplicate strcasecmp test for "rj-master" in mpc8610_hpcd_probe() Takashi Iwai
2008-02-22 17:43 ` [PATCH 09/16] [ALSA] hda-codec - Fix race condition in generic bound volume/swtich controls Takashi Iwai
2008-02-22 17:43 ` [PATCH 10/16] [ALSA] hda-codec - Don't create vmaster if no slaves found Takashi Iwai
2008-02-22 17:44 ` [PATCH 11/16] [ALSA] hda-codec - Fix wrong capture source selection for ALC883 codec Takashi Iwai
2008-02-22 17:45 ` [PATCH 12/16] [ALSA] hda-codec - Fix ALC882 capture source selection Takashi Iwai
2008-02-22 17:46 ` [PATCH 13/16] [ALSA] hda-codec - Fix amp-in values for pin widgets Takashi Iwai
2008-02-22 17:46 ` [PATCH 14/16] [ALSA] caiaq - fix section mismatch warning Takashi Iwai
2008-02-22 18:31 ` Sam Ravnborg
2008-02-23 10:23 ` Takashi Iwai
2008-02-22 17:47 ` [PATCH 15/16] [ALSA] hda-intel - Fix Oops with ATI HDMI devices Takashi Iwai
2008-02-22 17:47 ` [PATCH 16/16] [ALSA] bt87X: fix freeing of shared interrupt Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=s5hk5kwyjwr.wl%tiwai@suse.de \
--to=tiwai@suse.de \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®