Skip to content

Commit

Permalink
igc: fix deadlock caused by taking RTNL in RPM resume path
Browse files Browse the repository at this point in the history
It was reported a RTNL deadlock in the igc driver that was causing
problems during suspend/resume.

The solution is similar to commit ac8c58f ("igb: fix deadlock
caused by taking RTNL in RPM resume path").

Reported-by: James Hogan <jhogan@kernel.org>
Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
  • Loading branch information
vcgomes authored and intel-lab-lkp committed Aug 11, 2022
1 parent ae68625 commit 61ed7ed
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions drivers/net/ethernet/intel/igc/igc_main.c
Expand Up @@ -6638,7 +6638,7 @@ static void igc_deliver_wake_packet(struct net_device *netdev)
netif_rx(skb);
}

static int __maybe_unused igc_resume(struct device *dev)
static int __maybe_unused __igc_resume(struct device *dev, bool rpm)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct net_device *netdev = pci_get_drvdata(pdev);
Expand Down Expand Up @@ -6680,23 +6680,30 @@ static int __maybe_unused igc_resume(struct device *dev)

wr32(IGC_WUS, ~0);

rtnl_lock();
if (!rpm)
rtnl_lock();
if (!err && netif_running(netdev))
err = __igc_open(netdev, true);

if (!err)
netif_device_attach(netdev);
rtnl_unlock();
if (!rpm)
rtnl_unlock();

return err;
}

static int __maybe_unused igc_runtime_resume(struct device *dev)
{
return igc_resume(dev);
return __igc_resume(dev, true);
}

static int __maybe_unused igc_resume(struct device *dev)
{
return __igc_resume(dev, false);
}

static int __maybe_unused igc_suspend(struct device *dev)
static int __maybe_unused __igc_suspend(struct device *dev)
{
return __igc_shutdown(to_pci_dev(dev), NULL, 0);
}
Expand Down Expand Up @@ -6757,7 +6764,7 @@ static pci_ers_result_t igc_io_error_detected(struct pci_dev *pdev,
* @pdev: Pointer to PCI device
*
* Restart the card from scratch, as if from a cold-boot. Implementation
* resembles the first-half of the igc_resume routine.
* resembles the first-half of the __igc_resume routine.
**/
static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev)
{
Expand Down Expand Up @@ -6796,7 +6803,7 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev)
*
* This callback is called when the error recovery driver tells us that
* its OK to resume normal operation. Implementation resembles the
* second-half of the igc_resume routine.
* second-half of the __igc_resume routine.
*/
static void igc_io_resume(struct pci_dev *pdev)
{
Expand Down

0 comments on commit 61ed7ed

Please sign in to comment.