ixgbe: release lock for the duration of ixgbe_suspend_close()
authorPavel Tatashin <pasha.tatashin@oracle.com>
Thu, 3 May 2018 03:59:30 +0000 (23:59 -0400)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 17 May 2018 16:04:15 +0000 (09:04 -0700)
Currently, during device_shutdown() ixgbe holds rtnl_lock for the duration
of lengthy ixgbe_close_suspend(). On machines with multiple ixgbe cards
this lock prevents scaling if device_shutdown() function is multi-threaded.

It is not necessary to hold this lock during ixgbe_close_suspend()
as it is not held when ixgbe_close() is called also during shutdown but for
kexec case.

Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index a52d92e182eea431458e6398a21cf5b0164b923b..5ddfb93ed491083857f7bcd7b507954c9a39c292 100644 (file)
@@ -6698,8 +6698,15 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
        rtnl_lock();
        netif_device_detach(netdev);
 
-       if (netif_running(netdev))
+       if (netif_running(netdev)) {
+               /* Suspend takes a long time, device_shutdown may be
+                * parallelized this function, so drop lock for the
+                * duration of this call.
+                */
+               rtnl_unlock();
                ixgbe_close_suspend(adapter);
+               rtnl_lock();
+       }
 
        ixgbe_clear_interrupt_scheme(adapter);
        rtnl_unlock();