[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