mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-27 04:30:49 +07:00
5063452ecb
cpia2_usb_disconnect() seems to be missing a memory barrier which might cause the waker to not notice the waiter and miss sending a wake_up as in the following figure. cpia2_usb_disconnect sync ------------------------------------------------------------------------ mutex_unlock(&cam->v4l2_lock); if (waitqueue_active(&cam->wq_stream)) /* The CPU might reorder the test for the waitqueue up here, before prior writes complete */ /* wait_event_interruptible */ /* __wait_event_interruptible */ /* ___wait_event */ long __int = prepare_to_wait_event( &wq, &__wait, state); if (!cam->streaming || frame->status == FRAME_READY) cam->curbuff->status = FRAME_READY; cam->curbuff->length = 0; schedule() ------------------------------------------------------------------------ The attached patch removes the call to waitqueue_active() leaving just wake_up() behind. This fixes the problem because the call to spin_lock_irqsave() in wake_up() will be an ACQUIRE operation. I found this issue when I was looking through the linux source code for places calling waitqueue_active() before wake_up*(), but without preceding memory barriers, after sending a patch to fix a similar issue in drivers/tty/n_tty.c (Details about the original issue can be found here: https://lkml.org/lkml/2015/9/28/849). Signed-off-by: Kosuke Tatsukawa <tatsu@ab.jp.nec.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> |
||
---|---|---|
.. | ||
airspy | ||
as102 | ||
au0828 | ||
b2c2 | ||
cpia2 | ||
cx231xx | ||
dvb-usb | ||
dvb-usb-v2 | ||
em28xx | ||
go7007 | ||
gspca | ||
hackrf | ||
hdpvr | ||
msi2500 | ||
pvrusb2 | ||
pwc | ||
s2255 | ||
siano | ||
stk1160 | ||
stkwebcam | ||
tm6000 | ||
ttusb-budget | ||
ttusb-dec | ||
usbtv | ||
usbvision | ||
uvc | ||
zr364xx | ||
Kconfig | ||
Makefile |