mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
octeontx2-vf: fix workqueue and netdev race in probe/remove
Initialize the VF workqueue before register_netdev() so ndo_set_rx_mode
does not queue work on a NULL workqueue. Unregister the netdev before
destroying the workqueue, and add proper probe error cleanup.
Fixes: cbc100aa22 ("octeontx2-nicvf: add ndo_set_rx_mode support for multicast & promisc")
Signed-off-by: Nitin Shetty J <nshettyj@marvell.com>
Signed-off-by: Anshumali Gaur <agaur@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260820083634.1641740-1-nshettyj@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
4d5df98369
commit
3ba97ff4f8
|
|
@ -737,16 +737,16 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
if (err)
|
||||
goto err_ptp_destroy;
|
||||
|
||||
err = otx2_vf_wq_init(vf);
|
||||
if (err)
|
||||
goto err_ipsec_clean;
|
||||
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to register netdevice\n");
|
||||
goto err_ipsec_clean;
|
||||
goto err_wq_destroy;
|
||||
}
|
||||
|
||||
err = otx2_vf_wq_init(vf);
|
||||
if (err)
|
||||
goto err_unreg_netdev;
|
||||
|
||||
otx2vf_set_ethtool_ops(netdev);
|
||||
|
||||
err = otx2vf_mcam_flow_init(vf);
|
||||
|
|
@ -789,6 +789,10 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
otx2_shutdown_tc(vf);
|
||||
err_unreg_netdev:
|
||||
unregister_netdev(netdev);
|
||||
err_wq_destroy:
|
||||
cancel_work_sync(&vf->reset_task);
|
||||
cancel_work_sync(&vf->rx_mode_work);
|
||||
destroy_workqueue(vf->otx2_wq);
|
||||
err_ipsec_clean:
|
||||
cn10k_ipsec_clean(vf);
|
||||
err_ptp_destroy:
|
||||
|
|
@ -836,11 +840,13 @@ static void otx2vf_remove(struct pci_dev *pdev)
|
|||
}
|
||||
#endif
|
||||
|
||||
cancel_work_sync(&vf->reset_task);
|
||||
otx2_unregister_dl(vf);
|
||||
unregister_netdev(netdev);
|
||||
if (vf->otx2_wq)
|
||||
if (vf->otx2_wq) {
|
||||
cancel_work_sync(&vf->reset_task);
|
||||
cancel_work_sync(&vf->rx_mode_work);
|
||||
destroy_workqueue(vf->otx2_wq);
|
||||
}
|
||||
cn10k_ipsec_clean(vf);
|
||||
otx2_ptp_destroy(vf);
|
||||
otx2_mcam_flow_del(vf);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user