sfc: Hold the RTNL lock for more of the suspend/resume cycle
authorBen Hutchings <bhutchings@solarflare.com>
Fri, 27 Jul 2012 18:35:39 +0000 (19:35 +0100)
committerBen Hutchings <bhutchings@solarflare.com>
Fri, 24 Aug 2012 19:10:19 +0000 (20:10 +0100)
I don't think these PM functions can race with userland net device
operations, but it's much easier to reason about locking if state is
consistently guarded by the same lock.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/efx.c

index 9f88ad86f4e39ca905155688c02db3da5707b519..e5f3a17349af5c8b93ed886b7aea90d659fe50bd 100644 (file)
@@ -2727,6 +2727,8 @@ static int efx_pm_freeze(struct device *dev)
 {
        struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev));
 
+       rtnl_lock();
+
        efx->state = STATE_UNINIT;
 
        netif_device_detach(efx->net_dev);
@@ -2734,6 +2736,8 @@ static int efx_pm_freeze(struct device *dev)
        efx_stop_all(efx);
        efx_stop_interrupts(efx, false);
 
+       rtnl_unlock();
+
        return 0;
 }
 
@@ -2741,6 +2745,8 @@ static int efx_pm_thaw(struct device *dev)
 {
        struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev));
 
+       rtnl_lock();
+
        efx_start_interrupts(efx, false);
 
        mutex_lock(&efx->mac_lock);
@@ -2755,6 +2761,8 @@ static int efx_pm_thaw(struct device *dev)
 
        efx->type->resume_wol(efx);
 
+       rtnl_unlock();
+
        /* Reschedule any quenched resets scheduled during efx_pm_freeze() */
        queue_work(reset_workqueue, &efx->reset_work);