[alsa-devel] [PATCH REPOST 2/2] ALSA: usb-midi: use irqsave() in USB's complete callback
Clemens Ladisch
clemens at ladisch.de
Sun Jul 1 22:12:14 CEST 2018
Sebastian Andrzej Siewior wrote:
> From: John Ogness <john.ogness at linutronix.de>
>
> The USB completion callback does not disable interrupts while acquiring
> the lock. We want to remove the local_irq_disable() invocation from
> __usb_hcd_giveback_urb() and therefore it is required for the callback
> handler to disable the interrupts while acquiring the lock.
> The callback may be invoked either in IRQ or BH context depending on the
> USB host controller.
> Use the _irqsave() variant of the locking primitives.
>
> Cc: Clemens Ladisch <clemens at ladisch.de>
> Cc: Jaroslav Kysela <perex at perex.cz>
> Cc: Takashi Iwai <tiwai at suse.com>
> Signed-off-by: John Ogness <john.ogness at linutronix.de>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
Acked-by: Clemens Ladisch <clemens at ladisch.de>
> ---
> sound/usb/midi.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/sound/usb/midi.c b/sound/usb/midi.c
> index 2c1aaa3292bf..dcfc546d81b9 100644
> --- a/sound/usb/midi.c
> +++ b/sound/usb/midi.c
> @@ -281,15 +281,16 @@ static void snd_usbmidi_out_urb_complete(struct urb *urb)
> struct out_urb_context *context = urb->context;
> struct snd_usb_midi_out_endpoint *ep = context->ep;
> unsigned int urb_index;
> + unsigned long flags;
>
> - spin_lock(&ep->buffer_lock);
> + spin_lock_irqsave(&ep->buffer_lock, flags);
> urb_index = context - ep->urbs;
> ep->active_urbs &= ~(1 << urb_index);
> if (unlikely(ep->drain_urbs)) {
> ep->drain_urbs &= ~(1 << urb_index);
> wake_up(&ep->drain_wait);
> }
> - spin_unlock(&ep->buffer_lock);
> + spin_unlock_irqrestore(&ep->buffer_lock, flags);
> if (urb->status < 0) {
> int err = snd_usbmidi_urb_error(urb);
> if (err < 0) {
More information about the Alsa-devel
mailing list