Re: [PATCH v2] usb: gadget: function: printer: avoid wrong list handling in printer_write()

2018-05-21 Thread Felipe Balbi

Hi Greg,

Yoshihiro Shimoda  writes:
> When printer_write() calls usb_ep_queue(), a udc driver (e.g.
> renesas_usbhs driver) may call usb_gadget_giveback_request() in
> the udc .queue ops immediately. Then, printer_write() calls
> list_add(>list, >tx_reqs_active) wrongly. After that,
> if we do unbind the printer driver, WARN_ON() happens in
> printer_func_unbind() because the list entry is not removed.
>
> So, this patch moves list_add(>list, >tx_reqs_active)
> calling before usb_ep_queue().
>
> Signed-off-by: Yoshihiro Shimoda 
> Acked-by: Felipe Balbi 

I'm not sure if you're still taking bug fixes for current -rc cycle, but
if you are, please take this directly. If you're done with v4.17, please
apply this on top of my pull request which I sent an hour or so ago.

Thanks

-- 
balbi


signature.asc
Description: PGP signature


[PATCH v2] usb: gadget: function: printer: avoid wrong list handling in printer_write()

2018-05-21 Thread Yoshihiro Shimoda
When printer_write() calls usb_ep_queue(), a udc driver (e.g.
renesas_usbhs driver) may call usb_gadget_giveback_request() in
the udc .queue ops immediately. Then, printer_write() calls
list_add(>list, >tx_reqs_active) wrongly. After that,
if we do unbind the printer driver, WARN_ON() happens in
printer_func_unbind() because the list entry is not removed.

So, this patch moves list_add(>list, >tx_reqs_active)
calling before usb_ep_queue().

Signed-off-by: Yoshihiro Shimoda 
Acked-by: Felipe Balbi 
---
 Changes from RFC (v1):
  - Modify the implementation to fix the issue.
  - Add "Acked-by Felipe Balbi".
  - Remove RFC.
  - Revise commit log.

 drivers/usb/gadget/function/f_printer.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/gadget/function/f_printer.c 
b/drivers/usb/gadget/function/f_printer.c
index d359efe..9c7ed25 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -631,19 +631,19 @@ static void tx_complete(struct usb_ep *ep, struct 
usb_request *req)
return -EAGAIN;
}
 
+   list_add(>list, >tx_reqs_active);
+
/* here, we unlock, and only unlock, to avoid deadlock. */
spin_unlock(>lock);
value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC);
spin_lock(>lock);
if (value) {
+   list_del(>list);
list_add(>list, >tx_reqs);
spin_unlock_irqrestore(>lock, flags);
mutex_unlock(>lock_printer_io);
return -EAGAIN;
}
-
-   list_add(>list, >tx_reqs_active);
-
}
 
spin_unlock_irqrestore(>lock, flags);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html