Re: [PATCH net v3] usbnet: Stop RX Q on MTU change

2016-06-30 Thread David Miller
From: soohoon@f5.com
Date: Wed, 29 Jun 2016 15:07:21 -0400

> When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh()
> can fill up the Q at the same time.
> Depends on which HCD is down there unlink takes long time then the flush
> never ends.
> 
> Signed-off-by: Soohoon Lee 
> Reviewed-by: Kimball Murray 

Applied.


[PATCH net v3] usbnet: Stop RX Q on MTU change

2016-06-29 Thread soohoon . lee


When MTU is changed unlink_urbs() flushes RX Q but mean while usbnet_bh()
can fill up the Q at the same time.
Depends on which HCD is down there unlink takes long time then the flush
never ends.

Signed-off-by: Soohoon Lee 
Reviewed-by: Kimball Murray 

---

 drivers/net/usb/usbnet.c |   10 +++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 61ba464..6086a01 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -395,8 +395,11 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
dev->hard_mtu = net->mtu + net->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
-   if (dev->rx_urb_size > old_rx_urb_size)
+   if (dev->rx_urb_size > old_rx_urb_size) {
+   usbnet_pause_rx(dev);
usbnet_unlink_rx_urbs(dev);
+   usbnet_resume_rx(dev);
+   }
}
 
/* max qlen depend on hard_mtu and rx_urb_size */
@@ -1508,8 +1511,9 @@ static void usbnet_bh (unsigned long param)
} else if (netif_running (dev->net) &&
   netif_device_present (dev->net) &&
   netif_carrier_ok(dev->net) &&
-  !timer_pending (>delay) &&
-  !test_bit (EVENT_RX_HALT, >flags)) {
+  !timer_pending(>delay) &&
+  !test_bit(EVENT_RX_PAUSED, >flags) &&
+  !test_bit(EVENT_RX_HALT, >flags)) {
int temp = dev->rxq.qlen;
 
if (temp < RX_QLEN(dev)) {