diff mbox

[2/2] ixgbe: add missing rtnl_lock in PM resume path

Message ID 1333638664-17062-2-git-send-email-bpoirier@suse.de
State Awaiting Upstream, archived
Delegated to: David Miller
Headers show

Commit Message

Benjamin Poirier April 5, 2012, 3:11 p.m. UTC
Upon resume from standby, ixgbe may trigger the ASSERT_RTNL() in
netif_set_real_num_tx_queues(). The call stack is:
	netif_set_real_num_tx_queues
	ixgbe_set_num_queues
	ixgbe_init_interrupt_scheme
	ixgbe_resume

Signed-off-by: Benjamin Poirier <bpoirier@suse.de>

---
Unlike patch 1 for igb, we cannot lock rtnl closer to the point where
netif_set_real_num_tx_queues() is called because ixgbe_init_interrupt_scheme()
is also called by the dcb code, already under rtnl.
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

Comments

Kirsher, Jeffrey T April 5, 2012, 11:03 p.m. UTC | #1
On Thu, 2012-04-05 at 11:11 -0400, Benjamin Poirier wrote:
> Upon resume from standby, ixgbe may trigger the ASSERT_RTNL() in
> netif_set_real_num_tx_queues(). The call stack is:
>         netif_set_real_num_tx_queues
>         ixgbe_set_num_queues
>         ixgbe_init_interrupt_scheme
>         ixgbe_resume
> 
> Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
> 
> ---
> Unlike patch 1 for igb, we cannot lock rtnl closer to the point where
> netif_set_real_num_tx_queues() is called because
> ixgbe_init_interrupt_scheme()
> is also called by the dcb code, already under rtnl.
> ---
>  drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-) 

Thanks Benjamin, I will add the patch to my igb queue of patches.
diff mbox

Patch

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 3e26b1f..ff6edab 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -4836,7 +4836,9 @@  static int ixgbe_resume(struct pci_dev *pdev)
 
 	pci_wake_from_d3(pdev, false);
 
+	rtnl_lock();
 	err = ixgbe_init_interrupt_scheme(adapter);
+	rtnl_unlock();
 	if (err) {
 		e_dev_err("Cannot initialize interrupts for device\n");
 		return err;