]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
ionic: no double destroy workqueue
authorShannon Nelson <shannon.nelson@amd.com>
Thu, 12 Dec 2024 21:31:56 +0000 (13:31 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sun, 15 Dec 2024 22:33:31 +0000 (14:33 -0800)
There are some FW error handling paths that can cause us to
try to destroy the workqueue more than once, so let's be sure
we're checking for that.

The case where this popped up was in an AER event where the
handlers got called in such a way that ionic_reset_prepare()
and thus ionic_dev_teardown() got called twice in a row.
The second time through the workqueue was already destroyed,
and destroy_workqueue() choked on the bad wq pointer.

We didn't hit this in AER handler testing before because at
that time we weren't using a private workqueue.  Later we
replaced the use of the system workqueue with our own private
workqueue but hadn't rerun the AER handler testing since then.

Fixes: 9e25450da700 ("ionic: add private workqueue per-device")
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20241212213157.12212-3-shannon.nelson@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/pensando/ionic/ionic_dev.c

index 9e42d599840ded0c05013280a8f0dc138258ccec..57edcde9e6f8c64dd9bfb0f2db7fcf6f3f1d529c 100644 (file)
@@ -277,7 +277,10 @@ void ionic_dev_teardown(struct ionic *ionic)
        idev->phy_cmb_pages = 0;
        idev->cmb_npages = 0;
 
-       destroy_workqueue(ionic->wq);
+       if (ionic->wq) {
+               destroy_workqueue(ionic->wq);
+               ionic->wq = NULL;
+       }
        mutex_destroy(&idev->cmb_inuse_lock);
 }