]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ixgbe: Reorder Tx/Rx shutdown to reduce time needed to stop device
authorAlexander Duyck <alexander.h.duyck@intel.com>
Fri, 20 Jul 2018 22:29:29 +0000 (18:29 -0400)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 26 Jul 2018 16:04:06 +0000 (09:04 -0700)
This change is meant to help reduce the time needed to shutdown the
transmit and receive paths for the device. Specifically what we now do
after this patch is disable the transmit path first at the netdev level,
and then work on disabling the Rx. This way while we are waiting on the Rx
queues to be disabled the Tx queues have an opportunity to drain out.

In addition I have dropped the 10ms timeout that was left in the ixgbe_down
function that seems to have been carried through from back in e1000 as far
as I can tell. We shouldn't need it since we don't actually disable the Tx
until much later and we have additional logic in place for verifying the Tx
queues have been disabled.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Don Buchholz <donald.buchholz@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index c42256e9199710dc772f230da145a4b8cdac5f49..aa4f05c36260e3cfb238c1287167fc4ade37186f 100644 (file)
@@ -5814,6 +5814,13 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
        if (test_and_set_bit(__IXGBE_DOWN, &adapter->state))
                return; /* do nothing if already down */
 
+       /* Shut off incoming Tx traffic */
+       netif_tx_stop_all_queues(netdev);
+
+       /* call carrier off first to avoid false dev_watchdog timeouts */
+       netif_carrier_off(netdev);
+       netif_tx_disable(netdev);
+
        /* disable receives */
        hw->mac.ops.disable_rx(hw);
 
@@ -5822,16 +5829,9 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
                /* this call also flushes the previous write */
                ixgbe_disable_rx_queue(adapter, adapter->rx_ring[i]);
 
-       usleep_range(10000, 20000);
-
        /* synchronize_sched() needed for pending XDP buffers to drain */
        if (adapter->xdp_ring[0])
                synchronize_sched();
-       netif_tx_stop_all_queues(netdev);
-
-       /* call carrier off first to avoid false dev_watchdog timeouts */
-       netif_carrier_off(netdev);
-       netif_tx_disable(netdev);
 
        ixgbe_irq_disable(adapter);