Message ID | 20191108104230.9833-1-manishc@marvell.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net,1/1] qede: fix NULL pointer deref in __qede_remove() | expand |
From: Manish Chopra <manishc@marvell.com> Date: Fri, 8 Nov 2019 02:42:30 -0800 > While rebooting the system with SR-IOV vfs enabled leads > to below crash due to recurrence of __qede_remove() on the VF > devices (first from .shutdown() flow of the VF itself and > another from PF's .shutdown() flow executing pci_disable_sriov()) > > This patch adds a safeguard in __qede_remove() flow to fix this, > so that driver doesn't attempt to remove "already removed" devices. ... > Signed-off-by: Manish Chopra <manishc@marvell.com> > Signed-off-by: Ariel Elior <aelior@marvell.com> > Signed-off-by: Sudarsana Kalluru <skalluru@marvell.com> There should probably be a cleaner, more structural, way to prevent this sequence. But for now this fix is good enough. Applied and queued up for -stable.
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 8d1c208f778f..7e1cf2ead873 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -1208,8 +1208,16 @@ enum qede_remove_mode { static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode) { struct net_device *ndev = pci_get_drvdata(pdev); - struct qede_dev *edev = netdev_priv(ndev); - struct qed_dev *cdev = edev->cdev; + struct qede_dev *edev; + struct qed_dev *cdev; + + if (!ndev) { + dev_info(&pdev->dev, "Device has already been removed\n"); + return; + } + + edev = netdev_priv(ndev); + cdev = edev->cdev; DP_INFO(edev, "Starting qede_remove\n");