Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfb8c3aa authored by Benjamin Poirier's avatar Benjamin Poirier Committed by David S. Miller
Browse files

igb: fix rtnl race in PM resume path



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.

Signed-off-by: default avatarBenjamin Poirier <bpoirier@suse.de>
Tested-by: default avatarJeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dccd9ecc
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -1111,9 +1111,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,
	err = netif_set_real_num_rx_queues(adapter->netdev,
		adapter->num_rx_queues);
	rtnl_unlock();
	return err;
}

/**
@@ -6796,18 +6799,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;
	}