]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
igb: fix rtnl race in PM resume path
authorBenjamin Poirier <bpoirier@suse.de>
Thu, 10 May 2012 15:38:37 +0000 (15:38 +0000)
committerJoe Jin <joe.jin@oracle.com>
Thu, 17 May 2012 13:17:35 +0000 (21:17 +0800)
Since the caller (PM resume code) is not the one holding rtnl, when taking the
'else' branch rtnl may be released at any moment, thereby defeating the whole
purpose of this code block.

(cherry picked from commit cfb8c3aa59302636c69890be10b2ef23a7ca83b2)
Signed-off-by: Benjamin Poirier <bpoirier@suse.de>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/igb/igb_main.c

index b86acf45bc28d5587a4467a89f82b4c531afd261..4f23ab0796516f32a95df185930d4aa737556841 100644 (file)
@@ -1106,9 +1106,12 @@ msi_only:
                adapter->flags |= IGB_FLAG_HAS_MSI;
 out:
        /* Notify the stack of the (possibly) reduced queue counts. */
+       rtnl_lock();
        netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues);
-       return netif_set_real_num_rx_queues(adapter->netdev,
-                                           adapter->num_rx_queues);
+       err = netif_set_real_num_rx_queues(adapter->netdev,
+               adapter->num_rx_queues);
+       rtnl_unlock();
+       return err;
 }
 
 /**
@@ -6747,18 +6750,7 @@ static int igb_resume(struct device *dev)
        pci_enable_wake(pdev, PCI_D3hot, 0);
        pci_enable_wake(pdev, PCI_D3cold, 0);
 
-       if (!rtnl_is_locked()) {
-               /*
-                * shut up ASSERT_RTNL() warning in
-                * netif_set_real_num_tx/rx_queues.
-                */
-               rtnl_lock();
-               err = igb_init_interrupt_scheme(adapter);
-               rtnl_unlock();
-       } else {
-               err = igb_init_interrupt_scheme(adapter);
-       }
-       if (err) {
+       if (igb_init_interrupt_scheme(adapter)) {
                dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
                return -ENOMEM;
        }