]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtlwifi: destroy workqueue at rtl_deinit_core
authorThadeu Lima de Souza Cascardo <cascardo@igalia.com>
Fri, 6 Dec 2024 17:37:11 +0000 (14:37 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:46:47 +0000 (12:46 +0100)
[ Upstream commit d8ece6fc3694657e4886191b32ca1690af11adda ]

rtl_wq is allocated at rtl_init_core, so it makes more sense to destroy it
at rtl_deinit_core. In the case of USB, where _rtl_usb_init does not
require anything to be undone, that is fine. But for PCI, rtl_pci_init,
which is called after rtl_init_core, needs to deallocate data, but only if
it has been called.

That means that destroying the workqueue needs to be done whether
rtl_pci_init has been called or not. And since rtl_pci_deinit was doing it,
it has to be moved out of there.

It makes more sense to move it to rtl_deinit_core and have it done in both
cases, USB and PCI.

Since this is a requirement for a followup memory leak fix, mark this as
fixing such memory leak.

Fixes: 0c8173385e54 ("rtl8192ce: Add new driver")
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241206173713.3222187-3-cascardo@igalia.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/realtek/rtlwifi/base.c
drivers/net/wireless/realtek/rtlwifi/pci.c
drivers/net/wireless/realtek/rtlwifi/usb.c

index c14d7cbaa647250dca0067db1a5421282b9eba11..775f0c181fece3f9cf8772f1df77da49e5a6d7f6 100644 (file)
@@ -576,9 +576,15 @@ static void rtl_free_entries_from_ack_queue(struct ieee80211_hw *hw,
 
 void rtl_deinit_core(struct ieee80211_hw *hw)
 {
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+
        rtl_c2hcmd_launcher(hw, 0);
        rtl_free_entries_from_scan_list(hw);
        rtl_free_entries_from_ack_queue(hw, false);
+       if (rtlpriv->works.rtl_wq) {
+               destroy_workqueue(rtlpriv->works.rtl_wq);
+               rtlpriv->works.rtl_wq = NULL;
+       }
 }
 EXPORT_SYMBOL_GPL(rtl_deinit_core);
 
index c0a201f1b74e500102163d803e9cf750f3c0d3e7..84f2669f201ab0609574fa2749882f435573eb8c 100644 (file)
@@ -1657,8 +1657,6 @@ static void rtl_pci_deinit(struct ieee80211_hw *hw)
        synchronize_irq(rtlpci->pdev->irq);
        tasklet_kill(&rtlpriv->works.irq_tasklet);
        cancel_work_sync(&rtlpriv->works.lps_change_work);
-
-       destroy_workqueue(rtlpriv->works.rtl_wq);
 }
 
 static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev)
index 08ab2482c00cc6cba4b4b35ae90203e6b0d02f49..be17498b5515f4999d802e1b844ae65d37327b37 100644 (file)
@@ -680,11 +680,6 @@ static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw)
        tasklet_kill(&rtlusb->rx_work_tasklet);
        cancel_work_sync(&rtlpriv->works.lps_change_work);
 
-       if (rtlpriv->works.rtl_wq) {
-               destroy_workqueue(rtlpriv->works.rtl_wq);
-               rtlpriv->works.rtl_wq = NULL;
-       }
-
        skb_queue_purge(&rtlusb->rx_queue);
 
        while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {