mirror of
https://github.com/torvalds/linux.git
synced 2026-09-19 00:58:02 +02:00
pwc_isoc_init() submits its isochronous URBs with
usb_submit_urb(.., GFP_KERNEL) in a loop. After the first URB is
submitted, its completion handler pwc_isoc_handler() can run on another
CPU before the loop finishes:
start_streaming()
pwc_isoc_init()
usb_submit_urb(urbs[0], GFP_KERNEL)
pwc_isoc_handler(urbs[0])
pdev->fill_buf =
pwc_get_next_fill_buf(pdev)
usb_submit_urb(urbs[i>0], ..) -> fails
pwc_isoc_cleanup(pdev) /* kills URBs */
return ret;
pwc_cleanup_queued_bufs(pdev, VB2_BUF_STATE_QUEUED)
pwc_get_next_fill_buf() detaches a buffer from pdev->queued_bufs and
stores it in pdev->fill_buf. The error path in start_streaming() only
drains pdev->queued_bufs, so the buffer parked in pdev->fill_buf is
leaked. vb2_start_streaming() then triggers
WARN_ON(owned_by_drv_count).
stop_streaming() already handles this since commit
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| pwc-ctrl.c | ||
| pwc-dec1.c | ||
| pwc-dec1.h | ||
| pwc-dec23.c | ||
| pwc-dec23.h | ||
| pwc-if.c | ||
| pwc-kiara.c | ||
| pwc-kiara.h | ||
| pwc-misc.c | ||
| pwc-nala.h | ||
| pwc-timon.c | ||
| pwc-timon.h | ||
| pwc-uncompress.c | ||
| pwc-v4l.c | ||
| pwc.h | ||