aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/e1000e/netdev.c
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2013-04-20 01:37:29 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-04-25 21:39:56 -0400
commita3b87a4c69619f5366b7225aafbf7983eed31a9a (patch)
tree00f2ca9dd83a136c47d2d4d93a753d0f822f304e /drivers/net/ethernet/intel/e1000e/netdev.c
parent73e3dd6b45c4c870fc2641eb04c24e3f12dab1e0 (diff)
e1000e: panic caused by Rx traffic arriving while interface going down
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>
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index da7f2fad5ba4..a27e3bcc3249 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -4016,6 +4016,8 @@ void e1000e_down(struct e1000_adapter *adapter)
4016 4016
4017 e1000_irq_disable(adapter); 4017 e1000_irq_disable(adapter);
4018 4018
4019 napi_synchronize(&adapter->napi);
4020
4019 del_timer_sync(&adapter->watchdog_timer); 4021 del_timer_sync(&adapter->watchdog_timer);
4020 del_timer_sync(&adapter->phy_info_timer); 4022 del_timer_sync(&adapter->phy_info_timer);
4021 4023
@@ -4372,12 +4374,13 @@ static int e1000_close(struct net_device *netdev)
4372 4374
4373 pm_runtime_get_sync(&pdev->dev); 4375 pm_runtime_get_sync(&pdev->dev);
4374 4376
4375 napi_disable(&adapter->napi);
4376
4377 if (!test_bit(__E1000_DOWN, &adapter->state)) { 4377 if (!test_bit(__E1000_DOWN, &adapter->state)) {
4378 e1000e_down(adapter); 4378 e1000e_down(adapter);
4379 e1000_free_irq(adapter); 4379 e1000_free_irq(adapter);
4380 } 4380 }
4381
4382 napi_disable(&adapter->napi);
4383
4381 e1000_power_down_phy(adapter); 4384 e1000_power_down_phy(adapter);
4382 4385
4383 e1000e_free_tx_resources(adapter->tx_ring); 4386 e1000e_free_tx_resources(adapter->tx_ring);