crypto: hisilicon/qm - flush all work before driver removed
authorWeili Qian <qianweili@huawei.com>
Fri, 14 Jul 2023 11:41:35 +0000 (19:41 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 22 Jul 2023 01:59:38 +0000 (13:59 +1200)
Before removing the driver, flush inter-function communication
work, and subsequent communication work is not processed.
This prevents communication threads from accessing released memory.

Fixes: ("crypto: hisilicon/qm - enable PF and VFs communication")
Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c

index edc6fd4..81c21ca 100644 (file)
@@ -954,6 +954,11 @@ static irqreturn_t qm_mb_cmd_irq(int irq, void *data)
        if (!val)
                return IRQ_NONE;
 
+       if (test_bit(QM_DRIVER_REMOVING, &qm->misc_ctl)) {
+               dev_warn(&qm->pdev->dev, "Driver is down, message cannot be processed!\n");
+               return IRQ_HANDLED;
+       }
+
        schedule_work(&qm->cmd_process);
 
        return IRQ_HANDLED;
@@ -2743,6 +2748,9 @@ void hisi_qm_wait_task_finish(struct hisi_qm *qm, struct hisi_qm_list *qm_list)
               test_bit(QM_RESETTING, &qm->misc_ctl))
                msleep(WAIT_PERIOD);
 
+       if (test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps))
+               flush_work(&qm->cmd_process);
+
        udelay(REMOVE_WAIT_DELAY);
 }
 EXPORT_SYMBOL_GPL(hisi_qm_wait_task_finish);