mtu change needs to stop RX
PATCH v2 1/1 mtu change needs to stop RX
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.
drivers/net/usb/usbnet.c +5 -1
@@ -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 */
@@ -1509,6 +1512,7 @@ static void usbnet_bh (unsigned long param) netif_device_present (dev->net) && netif_carrier_ok(dev->net) && !timer_pending (&dev->delay) && + !test_bit (EVENT_RX_PAUSED, &dev->flags) && !test_bit (EVENT_RX_HALT, &dev->flags)) {int temp = dev->rxq.qlen;
PATCH 1/1 mtu change needs to stop RX
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.
drivers/net/usb/usbnet.c +5 -1
@@ -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 */
@@ -1509,6 +1512,7 @@ static void usbnet_bh (unsigned long param) netif_device_present (dev->net) && netif_carrier_ok(dev->net) && !timer_pending (&dev->delay) && + !test_bit (EVENT_RX_PAUSED, &dev->flags) && !test_bit (EVENT_RX_HALT, &dev->flags)) {int temp = dev->rxq.qlen;
David Miller
maintainerFrom: Soohoon Lee <[email protected]>
Date: Fri, 24 Jun 2016 00:30:16 +0000
Quoted 6 lines
When MTU is changed
unlink_urbs()flushes RX Q but mean whileusbnet_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 <[email protected]>Reviewed-by Kimball Murray <[email protected]>
This patch is mangled by your email client, the TAB characters have been converted into spaces.
Please do not resubmit this patah until you can successfully email the patch to yourself and apply it cleanly.
Also, your subject line should be formatted like:
[PATCH net v2.x] usbnet: ....
Thanks.