[v2] USB: cdc-wdm: don't enable interrupts in USB-giveback
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: 2018-06-13 20:28:09
On 2018-06-13 19:43:55 [+0200], Oliver Neukum wrote:
On Mi, 2018-06-13 at 18:28 +0200, Sebastian Andrzej Siewior wrote:quoted
The function service_outstanding_interrupt() will unconditionally enable interrupts during unlock and invoke usb_submit_urb() with GFP_KERNEL. If the HCD completes in BH (like ehci does) then the context remains atomic due local_bh_disable() and enabling interrupts does not change this.Hi,
Hi Oliver,
I am just looking at your patch and I am wondering why wdm_in_callback() won't just call service_outstanding_interrupt() again and again? OK, maybe I am dense and it may well be present now, but it just looks to me that way.
But this part didn't change, did it? The user blocks in wdmw_read()
waiting for the WDM_READ to be set and a wakeup. After rhe wakeup it
clears the ->rerr.
| static ssize_t wdm_read
| (struct file *file, char __user *buffer, size_t count, loff_t *ppos)
| {
|…
| rv = wait_event_interruptible(desc->wait,
| test_bit(WDM_READ, &desc->flags));
|…
|
| if (desc->rerr) { /* read completed, error happened */
| rv = usb_translate_errors(desc->rerr);
| desc->rerr = 0;
| spin_unlock_irq(&desc->iuspin);
| goto err;
| }
Maybe we should delay the WDM_READ flag in the error case until the
worker is done (before the wakeup).
Regards Oliver
Sebastian --- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html