diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2012-07-27 14:35:39 -0400 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2012-08-24 15:10:19 -0400 |
commit | 61da026d86517def727eb67d7cb8ee5657a12dd9 (patch) | |
tree | 4d7785c6aa2620d0940462cebecaca7e2a417583 /drivers | |
parent | f16aeea0e679d5fd43fc02e99569c52d77d5e5d3 (diff) |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/sfc/efx.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 9f88ad86f4e3..e5f3a17349af 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -2727,6 +2727,8 @@ static int efx_pm_freeze(struct device *dev) | |||
2727 | { | 2727 | { |
2728 | struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev)); | 2728 | struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev)); |
2729 | 2729 | ||
2730 | rtnl_lock(); | ||
2731 | |||
2730 | efx->state = STATE_UNINIT; | 2732 | efx->state = STATE_UNINIT; |
2731 | 2733 | ||
2732 | netif_device_detach(efx->net_dev); | 2734 | netif_device_detach(efx->net_dev); |
@@ -2734,6 +2736,8 @@ static int efx_pm_freeze(struct device *dev) | |||
2734 | efx_stop_all(efx); | 2736 | efx_stop_all(efx); |
2735 | efx_stop_interrupts(efx, false); | 2737 | efx_stop_interrupts(efx, false); |
2736 | 2738 | ||
2739 | rtnl_unlock(); | ||
2740 | |||
2737 | return 0; | 2741 | return 0; |
2738 | } | 2742 | } |
2739 | 2743 | ||
@@ -2741,6 +2745,8 @@ static int efx_pm_thaw(struct device *dev) | |||
2741 | { | 2745 | { |
2742 | struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev)); | 2746 | struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev)); |
2743 | 2747 | ||
2748 | rtnl_lock(); | ||
2749 | |||
2744 | efx_start_interrupts(efx, false); | 2750 | efx_start_interrupts(efx, false); |
2745 | 2751 | ||
2746 | mutex_lock(&efx->mac_lock); | 2752 | mutex_lock(&efx->mac_lock); |
@@ -2755,6 +2761,8 @@ static int efx_pm_thaw(struct device *dev) | |||
2755 | 2761 | ||
2756 | efx->type->resume_wol(efx); | 2762 | efx->type->resume_wol(efx); |
2757 | 2763 | ||
2764 | rtnl_unlock(); | ||
2765 | |||
2758 | /* Reschedule any quenched resets scheduled during efx_pm_freeze() */ | 2766 | /* Reschedule any quenched resets scheduled during efx_pm_freeze() */ |
2759 | queue_work(reset_workqueue, &efx->reset_work); | 2767 | queue_work(reset_workqueue, &efx->reset_work); |
2760 | 2768 | ||