crypto: hisilicon/qm - move alloc qm->wq to qm.c
authorWeili Qian <qianweili@huawei.com>
Thu, 9 Jun 2022 12:31:18 +0000 (20:31 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 17 Jun 2022 09:19:20 +0000 (17:19 +0800)
Before stopping the function, the driver needs to flush all the remaining
work about event irq. Therefore, accelerator drivers use a private
workqueue(qm->wq) to handle event irq instead of the system workqueue.
This patch moves alloc workqueue from sec_main.c and zip_main.c to qm.c.

Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c
drivers/crypto/hisilicon/sec2/sec_main.c
drivers/crypto/hisilicon/zip/zip_main.c

index 903896ab5be5d9758e3d514972da5388d6a2eaf9..f8d36b68494e78196e8d05ed5f3258e81ff569ad 100644 (file)
@@ -959,10 +959,7 @@ static irqreturn_t do_qm_irq(int irq, void *data)
        struct hisi_qm *qm = (struct hisi_qm *)data;
 
        /* the workqueue created by device driver of QM */
-       if (qm->wq)
-               queue_work(qm->wq, &qm->work);
-       else
-               schedule_work(&qm->work);
+       queue_work(qm->wq, &qm->work);
 
        return IRQ_HANDLED;
 }
@@ -3134,11 +3131,8 @@ static int qm_stop_qp_nolock(struct hisi_qp *qp)
        if (ret)
                dev_err(dev, "Failed to drain out data for stopping!\n");
 
-       if (qp->qm->wq)
-               flush_workqueue(qp->qm->wq);
-       else
-               flush_work(&qp->qm->work);
 
+       flush_workqueue(qp->qm->wq);
        if (unlikely(qp->is_resetting && atomic_read(&qp->qp_status.used)))
                qp_stop_fail_cb(qp);
 
@@ -3672,6 +3666,11 @@ static void qm_last_regs_uninit(struct hisi_qm *qm)
        debug->qm_last_words = NULL;
 }
 
+static void hisi_qm_unint_work(struct hisi_qm *qm)
+{
+       destroy_workqueue(qm->wq);
+}
+
 static void hisi_qm_memory_uninit(struct hisi_qm *qm)
 {
        struct device *dev = &qm->pdev->dev;
@@ -3698,6 +3697,7 @@ void hisi_qm_uninit(struct hisi_qm *qm)
        qm_last_regs_uninit(qm);
 
        qm_cmd_uninit(qm);
+       hisi_qm_unint_work(qm);
        down_write(&qm->qps_lock);
 
        if (!qm_avail_state(qm, QM_CLOSE)) {
@@ -6022,7 +6022,7 @@ err_disable_pcidev:
        return ret;
 }
 
-static void hisi_qm_init_work(struct hisi_qm *qm)
+static int hisi_qm_init_work(struct hisi_qm *qm)
 {
        INIT_WORK(&qm->work, qm_work_process);
        if (qm->fun_type == QM_HW_PF)
@@ -6030,6 +6030,16 @@ static void hisi_qm_init_work(struct hisi_qm *qm)
 
        if (qm->ver > QM_HW_V2)
                INIT_WORK(&qm->cmd_process, qm_cmd_process);
+
+       qm->wq = alloc_workqueue("%s", WQ_HIGHPRI | WQ_MEM_RECLAIM |
+                                WQ_UNBOUND, num_online_cpus(),
+                                pci_name(qm->pdev));
+       if (!qm->wq) {
+               pci_err(qm->pdev, "failed to alloc workqueue!\n");
+               return -ENOMEM;
+       }
+
+       return 0;
 }
 
 static int hisi_qp_alloc_memory(struct hisi_qm *qm)
@@ -6180,7 +6190,10 @@ int hisi_qm_init(struct hisi_qm *qm)
        if (ret)
                goto err_alloc_uacce;
 
-       hisi_qm_init_work(qm);
+       ret = hisi_qm_init_work(qm);
+       if (ret)
+               goto err_free_qm_memory;
+
        qm_cmd_init(qm);
        atomic_set(&qm->status.flags, QM_INIT);
 
@@ -6188,6 +6201,8 @@ int hisi_qm_init(struct hisi_qm *qm)
 
        return 0;
 
+err_free_qm_memory:
+       hisi_qm_memory_uninit(qm);
 err_alloc_uacce:
        if (qm->use_sva) {
                uacce_remove(qm->uacce);
index 4d85d2cbf37672fe6696cd236a499bbadda7a965..bdb690aaed12ac9dfef5691e01e4991b5e4b871e 100644 (file)
@@ -1002,8 +1002,6 @@ static int sec_pf_probe_init(struct sec_dev *sec)
 
 static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
 {
-       int ret;
-
        qm->pdev = pdev;
        qm->ver = pdev->revision;
        qm->algs = "cipher\ndigest\naead";
@@ -1029,25 +1027,7 @@ static int sec_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
                qm->qp_num = SEC_QUEUE_NUM_V1 - SEC_PF_DEF_Q_NUM;
        }
 
-       /*
-        * WQ_HIGHPRI: SEC request must be low delayed,
-        * so need a high priority workqueue.
-        * WQ_UNBOUND: SEC task is likely with long
-        * running CPU intensive workloads.
-        */
-       qm->wq = alloc_workqueue("%s", WQ_HIGHPRI | WQ_MEM_RECLAIM |
-                                WQ_UNBOUND, num_online_cpus(),
-                                pci_name(qm->pdev));
-       if (!qm->wq) {
-               pci_err(qm->pdev, "fail to alloc workqueue\n");
-               return -ENOMEM;
-       }
-
-       ret = hisi_qm_init(qm);
-       if (ret)
-               destroy_workqueue(qm->wq);
-
-       return ret;
+       return hisi_qm_init(qm);
 }
 
 static void sec_qm_uninit(struct hisi_qm *qm)
@@ -1078,8 +1058,6 @@ static int sec_probe_init(struct sec_dev *sec)
 static void sec_probe_uninit(struct hisi_qm *qm)
 {
        hisi_qm_dev_err_uninit(qm);
-
-       destroy_workqueue(qm->wq);
 }
 
 static void sec_iommu_used_check(struct sec_dev *sec)
index 9c925e9c0a2d180c7e2123ad87070989c7cadcf2..c3303d99acac7b679d7428aaf226ee03930bd192 100644 (file)
@@ -990,8 +990,6 @@ static int hisi_zip_pf_probe_init(struct hisi_zip *hisi_zip)
 
 static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
 {
-       int ret;
-
        qm->pdev = pdev;
        qm->ver = pdev->revision;
        if (pdev->revision >= QM_HW_V3)
@@ -1021,25 +1019,12 @@ static int hisi_zip_qm_init(struct hisi_qm *qm, struct pci_dev *pdev)
                qm->qp_num = HZIP_QUEUE_NUM_V1 - HZIP_PF_DEF_Q_NUM;
        }
 
-       qm->wq = alloc_workqueue("%s", WQ_HIGHPRI | WQ_MEM_RECLAIM |
-                                WQ_UNBOUND, num_online_cpus(),
-                                pci_name(qm->pdev));
-       if (!qm->wq) {
-               pci_err(qm->pdev, "fail to alloc workqueue\n");
-               return -ENOMEM;
-       }
-
-       ret = hisi_qm_init(qm);
-       if (ret)
-               destroy_workqueue(qm->wq);
-
-       return ret;
+       return hisi_qm_init(qm);
 }
 
 static void hisi_zip_qm_uninit(struct hisi_qm *qm)
 {
        hisi_qm_uninit(qm);
-       destroy_workqueue(qm->wq);
 }
 
 static int hisi_zip_probe_init(struct hisi_zip *hisi_zip)