ixgbe: ixgbe_down needs to stop dev_watchdog
Subsystems (2)
PATCH 1/1 ixgbe: ixgbe_down needs to stop dev_watchdog
From: John Fastabend <[email protected]>
There is a small race between when the tx queues are stopped and when netif_carrier_off() is called in ixgbe_down. If the dev_watchdog() timer fires during this time it is possible for a false tx timeout to occur.
This patch moves the netif_carrier_off() so that it is called before the tx queues are stopped preventing the dev_watchdog timer from detecting false tx timeouts. The race is seen occosionally when FCoE or DCB settings are being configured or changed.
Testing note, running ifconfig up/down will not reproduce this issue because dev_open/dev_close call dev_deactivate() and then dev_activate().
---
drivers/net/ixgbe/ixgbe_main.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +7 -8
@@ -3291,22 +3291,23 @@ void ixgbe_down(struct ixgbe_adapter *adapter) rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL );IXGBE_WRITE_REG (hw,IXGBE_RXCTRL , rxctrl & ~IXGBE_RXCTRL_RXEN ); -netif_tx_disable (netdev); -IXGBE_WRITE_FLUSH (hw);msleep (10 );netif_tx_stop_all_queues (netdev); -ixgbe_irq_disable (adapter); - -ixgbe_napi_disable_all (adapter); -clear_bit (__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state);del_timer_sync (&adapter->sfp_timer);del_timer_sync (&adapter->watchdog_timer);cancel_work_sync (&adapter->watchdog_task); +netif_carrier_off (netdev); +netif_tx_disable (netdev); + +ixgbe_irq_disable (adapter); + +ixgbe_napi_disable_all (adapter); +if (adapter->flags &IXGBE_FLAG_FDIR_HASH_CAPABLE || adapter->flags &IXGBE_FLAG_FDIR_PERFECT_CAPABLE )cancel_work_sync (&adapter->fdir_reinit_task);
@@ -3324,8 +3325,6 @@ void ixgbe_down(struct ixgbe_adapter *adapter) (IXGBE_READ_REG (hw,IXGBE_DMATXCTL ) & ~IXGBE_DMATXCTL_TE)); -netif_carrier_off (netdev); -/* clear n-tuple filters that are cached */ ethtool_ntuple_flush (netdev);
From: Jeff Kirsher <[email protected]>
Date: Tue, 27 Apr 2010 05:13:39 -0700
Quoted 12 lines
From: John Fastabend <[email protected]>
There is a small race between when the tx queues are stopped and when
netif_carrier_off()is called inixgbe_down. If thedev_watchdog()timer fires during this time it is possible for a false tx timeout to occur.This patch moves the
netif_carrier_off()so that it is called before the tx queues are stopped preventing thedev_watchdogtimer from detecting false tx timeouts. The race is seen occosionally when FCoE or DCB settings are being configured or changed.
Quoted 7 lines
Testing note, running ifconfig up/down will not reproduce this issue because dev_open/dev_close call
dev_deactivate()and thendev_activate().Signed-off-by John Fastabend <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.