]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: wangxun: reorder timer and work sync cancellations
authorJiawen Wu <jiawenwu@trustnetic.com>
Tue, 7 Apr 2026 02:56:13 +0000 (10:56 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sun, 12 Apr 2026 15:42:28 +0000 (08:42 -0700)
When removing the device, timer_delete_sync(&wx->service_timer) is
called in .ndo_stop() after cancel_work_sync(&wx->service_task). This
may cause new work to be queued after device down.

Move unregister_netdev() before cancel_work_sync(), and use
timer_shutdown_sync() to prevent the timer from being re-armed.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Link: https://patch.msgid.link/20260407025616.33652-7-jiawenwu@trustnetic.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/wangxun/libwx/wx_vf_common.c
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c

index 75a6f0898afe1234524ec77eb0ee11655b99b999..29cdbed2e5ecd3840b47dd4d4749da17b33f8c14 100644 (file)
@@ -48,9 +48,10 @@ void wxvf_remove(struct pci_dev *pdev)
        struct wx *wx = pci_get_drvdata(pdev);
        struct net_device *netdev;
 
-       cancel_work_sync(&wx->service_task);
        netdev = wx->netdev;
        unregister_netdev(netdev);
+       timer_shutdown_sync(&wx->service_timer);
+       cancel_work_sync(&wx->service_task);
        kfree(wx->vfinfo);
        kfree(wx->rss_key);
        kfree(wx->mac_table);
index 00726605628b9a358532babefa6c466091d9218f..0dd128aa18da949fc6e609457481629ecf63caf5 100644 (file)
@@ -946,12 +946,13 @@ static void txgbe_remove(struct pci_dev *pdev)
        struct txgbe *txgbe = wx->priv;
        struct net_device *netdev;
 
-       cancel_work_sync(&wx->service_task);
-
        netdev = wx->netdev;
        wx_disable_sriov(wx);
        unregister_netdev(netdev);
 
+       timer_shutdown_sync(&wx->service_timer);
+       cancel_work_sync(&wx->service_task);
+
        txgbe_remove_phy(txgbe);
        wx_free_isb_resources(wx);