patch "cdc-acm: close race betrween suspend() and acm_softint" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
cdc-acm: close race betrween suspend() and acm_softint
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 0afccd7601514c4b83d8cc58c740089cc447051d Mon Sep 17 00:00:00 2001
From: Oliver Neukum <[email protected]>
Date: Wed, 15 Apr 2020 17:13:57 +0200
Subject: cdc-acm: close race betrween suspend() and acm_softint
Suspend increments a counter, then kills the URBs, then kills the scheduled work. The scheduled work, however, may reschedule the URBs. Fix this by having the work check the counter.
--- drivers/usb/class/cdc-acm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/class/cdc-acm.c +3 -3
@@ -557,14 +557,14 @@ static void acm_softint(struct work_struct *work) struct acm *acm = container_of(work, struct acm, work);if (test_bit (EVENT_RX_STALL , &acm->flags)) { -if (!(usb_autopm_get_interface (acm->data))) { +smp_mb ();/* against acm_suspend() */ +if (!acm->susp_count) {for (i =0 ; i < acm->rx_buflimit; i++)usb_kill_urb (acm->read_urbs[i]);usb_clear_halt (acm->dev, acm->in);acm_submit_read_urbs (acm,GFP_KERNEL ); -usb_autopm_put_interface (acm->data); +clear_bit (EVENT_RX_STALL , &acm->flags); } -clear_bit (EVENT_RX_STALL , &acm->flags); }if (test_and_clear_bit (EVENT_TTY_WAKEUP , &acm->flags))
Signature · 1 line
2.26.1