e1000e: panic caused by Rx traffic arriving while interface going down
authorBruce Allan <bruce.w.allan@intel.com>
Sat, 20 Apr 2013 05:37:29 +0000 (05:37 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 26 Apr 2013 01:39:56 +0000 (18:39 -0700)
An "unable to handle kernel paging request" panic can occur when receiving
traffic while the interface is going down.  Wait for NAPI to be done with
current context after disabling interrupts and then disable NAPI.

See https://bugzilla.vyatta.com/show_bug.cgi?id=8837.

Reported-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/netdev.c

index da7f2fad5ba4815672dff09d3d78af6bccd82393..a27e3bcc3249f129c71930d5f1966b4ccf732796 100644 (file)
@@ -4016,6 +4016,8 @@ void e1000e_down(struct e1000_adapter *adapter)
 
        e1000_irq_disable(adapter);
 
+       napi_synchronize(&adapter->napi);
+
        del_timer_sync(&adapter->watchdog_timer);
        del_timer_sync(&adapter->phy_info_timer);
 
@@ -4372,12 +4374,13 @@ static int e1000_close(struct net_device *netdev)
 
        pm_runtime_get_sync(&pdev->dev);
 
-       napi_disable(&adapter->napi);
-
        if (!test_bit(__E1000_DOWN, &adapter->state)) {
                e1000e_down(adapter);
                e1000_free_irq(adapter);
        }
+
+       napi_disable(&adapter->napi);
+
        e1000_power_down_phy(adapter);
 
        e1000e_free_tx_resources(adapter->tx_ring);