lkml.org 
[lkml]   [2019]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 011/422] ALSA: usb-audio: not submit urb for stopped endpoint
    Date
    From: Henry Lin <henryl@nvidia.com>

    commit 528699317dd6dc722dccc11b68800cf945109390 upstream.

    While output urb's snd_complete_urb() is executing, calling
    prepare_outbound_urb() may cause endpoint stopped before
    prepare_outbound_urb() returns and result in next urb submitted
    to stopped endpoint. usb-audio driver cannot re-use it afterwards as
    the urb is still hold by usb stack.

    This change checks EP_FLAG_RUNNING flag after prepare_outbound_urb() again
    to let snd_complete_urb() know the endpoint already stopped and does not
    submit next urb. Below kind of error will be fixed:

    [ 213.153103] usb 1-2: timeout: still 1 active urbs on EP #1
    [ 213.164121] usb 1-2: cannot submit urb 0, error -16: unknown error

    Signed-off-by: Henry Lin <henryl@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20191113021420.13377-1-henryl@nvidia.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    sound/usb/endpoint.c | 3 +++
    1 file changed, 3 insertions(+)

    --- a/sound/usb/endpoint.c
    +++ b/sound/usb/endpoint.c
    @@ -401,6 +401,9 @@ static void snd_complete_urb(struct urb
    }

    prepare_outbound_urb(ep, ctx);
    + /* can be stopped during prepare callback */
    + if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags)))
    + goto exit_clear;
    } else {
    retire_inbound_urb(ep, ctx);
    /* can be stopped during retire callback */

    \
     
     \ /
      Last update: 2019-11-19 06:25    [W:4.062 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site