mirror of https://gitee.com/openkylin/linux.git
sfc: Hold the RTNL lock for more of the suspend/resume cycle
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>
This commit is contained in:
parent
f16aeea0e6
commit
61da026d86
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue