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:
Anshumali Gaur 2026-08-20 14:06:34 +05:30 committed by Jakub Kicinski
parent 4d5df98369
commit 3ba97ff4f8

View File

@ -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);