mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
e752dbc59e
The usb3_start_pipen() is called by renesas_usb3_ep_queue() and
usb3_request_done_pipen() so that usb3_start_pipen() is possible
to cause a race when getting usb3_first_req like below:
renesas_usb3_ep_queue()
spin_lock_irqsave()
list_add_tail()
spin_unlock_irqrestore()
usb3_start_pipen()
usb3_first_req = usb3_get_request() --- [1]
--- interrupt ---
usb3_irq_dma_int()
usb3_request_done_pipen()
usb3_get_request()
usb3_start_pipen()
usb3_first_req = usb3_get_request()
...
(the req is possible to be finished in the interrupt)
The usb3_first_req [1] above may have been finished after the interrupt
ended so that this driver caused to start a transfer wrongly. To fix this
issue, getting/checking the usb3_first_req are under spin_lock_irqsave()
in the same section.
Fixes:
|
||
---|---|---|
.. | ||
function | ||
legacy | ||
udc | ||
composite.c | ||
config.c | ||
configfs.c | ||
configfs.h | ||
epautoconf.c | ||
functions.c | ||
Kconfig | ||
Makefile | ||
u_f.c | ||
u_f.h | ||
u_os_desc.h | ||
usbstring.c |