ixgb: fix race on rx_buffer_len in mtu change
authorJesse Brandeburg <jesse.brandeburg@intel.com>
Tue, 8 Jul 2008 22:51:42 +0000 (15:51 -0700)
committerJeff Garzik <jgarzik@redhat.com>
Fri, 11 Jul 2008 05:20:27 +0000 (01:20 -0400)
some random coverage testing found that when changing mtu
under heavy traffic load, NAPI would use the rx_buffer_len variable
after it had been changed by change_mtu.

Similar to e1000 bugs found long ago.

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/net/ixgb/ixgb_main.c

index 4bf6bbc6582250659578dcf8b4eb941cbae2519a..c3234c45104381fd23fc627ceb149253a24c22ce 100644 (file)
@@ -1573,14 +1573,18 @@ ixgb_change_mtu(struct net_device *netdev, int new_mtu)
                return -EINVAL;
        }
 
+       if (old_max_frame == max_frame)
+               return 0;
+
+       if (netif_running(netdev))
+               ixgb_down(adapter, true);
+
        adapter->rx_buffer_len = max_frame + 8; /* + 8 for errata */
 
        netdev->mtu = new_mtu;
 
-       if ((old_max_frame != max_frame) && netif_running(netdev)) {
-               ixgb_down(adapter, true);
+       if (netif_running(netdev))
                ixgb_up(adapter);
-       }
 
        return 0;
 }