• Takashi Iwai's avatar
    ALSA: usb-audio: Fix possible race at sync of urb completions · 86a42ad0
    Takashi Iwai authored
    USB-audio driver tries to sync with the clear of all pending URBs in
    wait_clear_urbs(), and it waits for all bits in active_mask getting
    cleared.  This works fine for the normal operations, but when a stream
    is managed in the implicit feedback mode, there is still a very thin
    race window: namely, in snd_complete_usb(), the active_mask bit for
    the current URB is once cleared before re-submitted in
    queue_pending_output_urbs().  If wait_clear_urbs() is called during
    that period, it may pass the test and go forward even though there may
    be a still pending URB.
    
    For covering it, this patch adds a new counter to each endpoint to
    keep the number of in-flight URBs, and changes wait_clear_urbs()
    checking this number instead.  The counter is decremented at the end
    of URB complete, hence the reference is kept as long as the URB
    complete is in process.
    
    Link: https://lore.kernel.org/r/20210929080844.11583-3-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    86a42ad0
card.h 8.07 KB