From 387c46e49f67cc1d9b97850b1a30c6f4e10cc21e Mon Sep 17 00:00:00 2001 From: "Mintz, Yuval" Date: Mon, 20 Feb 2017 22:43:35 +0200 Subject: [PATCH] qede: Free netdevice only after stoping slowpath Orabug: 25477939 qed needs to be informed of the removal of the qede interface prior to its actual removal, as qede has some registered callbacks that might get called async to the removal flow. Signed-off-by: Yuval Mintz Signed-off-by: David S. Miller (cherry picked from commit 885185dfc49bde35b45046bb6b7384eca68e404f) Signed-off-by: Brian Maly Conflicts: drivers/net/ethernet/qlogic/qede/qede_main.c --- drivers/net/ethernet/qlogic/qede/qede_main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 1134ee10372c..57267e54c69e 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -2738,14 +2738,20 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode) pci_set_drvdata(pdev, NULL); - free_netdev(ndev); - /* Use global ops since we've freed edev */ qed_ops->common->slowpath_stop(cdev); if (system_state == SYSTEM_POWER_OFF) return; qed_ops->common->remove(cdev); + /* Since this can happen out-of-sync with other flows, + * don't release the netdevice until after slowpath stop + * has been called to guarantee various other contexts + * [e.g., QED register callbacks] won't break anything when + * accessing the netdevice. + */ + free_netdev(ndev); + dev_info(&pdev->dev, "Ending qede_remove successfully\n"); } -- 2.50.1