crypto: hisilicon/qm - flush all work before driver removed
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>
This commit is contained in:
@ -954,6 +954,11 @@ static irqreturn_t qm_mb_cmd_irq(int irq, void *data)
|
|||||||
if (!val)
|
if (!val)
|
||||||
return IRQ_NONE;
|
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);
|
schedule_work(&qm->cmd_process);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
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))
|
test_bit(QM_RESETTING, &qm->misc_ctl))
|
||||||
msleep(WAIT_PERIOD);
|
msleep(WAIT_PERIOD);
|
||||||
|
|
||||||
|
if (test_bit(QM_SUPPORT_MB_COMMAND, &qm->caps))
|
||||||
|
flush_work(&qm->cmd_process);
|
||||||
|
|
||||||
udelay(REMOVE_WAIT_DELAY);
|
udelay(REMOVE_WAIT_DELAY);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hisi_qm_wait_task_finish);
|
EXPORT_SYMBOL_GPL(hisi_qm_wait_task_finish);
|
||||||
|
Reference in New Issue
Block a user