Commit 61da026d authored by Ben Hutchings's avatar Ben Hutchings
Browse files

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: default avatarBen Hutchings <bhutchings@solarflare.com>
parent f16aeea0
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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);