crypto: qat - add misc workqueue
authorWojciech Ziemba <wojciech.ziemba@intel.com>
Thu, 10 Feb 2022 13:38:25 +0000 (13:38 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Feb 2022 05:21:09 +0000 (16:21 +1100)
In an effort to reduce the amount of workqueues, scattered across
the QAT driver, introduce the misc workqueue. This queue will be used
to handle bottom halves, Power Management and more in the future.

The function adf_misc_wq_queue_work() has been added to simplify
the enqueuing of jobs.

Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qat/qat_common/adf_common_drv.h
drivers/crypto/qat/qat_common/adf_ctl_drv.c
drivers/crypto/qat/qat_common/adf_isr.c

index 76f4f96ec5eb00c4412c032f6c1b4cc3cb636436..0775491768797fb21fca552cb8581fb7256da739 100644 (file)
@@ -188,6 +188,9 @@ int qat_uclo_map_obj(struct icp_qat_fw_loader_handle *handle,
                     void *addr_ptr, u32 mem_size, char *obj_name);
 int qat_uclo_set_cfg_ae_mask(struct icp_qat_fw_loader_handle *handle,
                             unsigned int cfg_ae_mask);
+int adf_init_misc_wq(void);
+void adf_exit_misc_wq(void);
+bool adf_misc_wq_queue_work(struct work_struct *work);
 #if defined(CONFIG_PCI_IOV)
 int adf_sriov_configure(struct pci_dev *pdev, int numvfs);
 void adf_disable_sriov(struct adf_accel_dev *accel_dev);
index 6f64aa6931461d2d8642a763b1cfebd0ff1caab7..e8ac932bbaab6aeb799d48609df46a604029f56d 100644 (file)
@@ -419,6 +419,9 @@ static int __init adf_register_ctl_device_driver(void)
        if (adf_chr_drv_create())
                goto err_chr_dev;
 
+       if (adf_init_misc_wq())
+               goto err_misc_wq;
+
        if (adf_init_aer())
                goto err_aer;
 
@@ -440,6 +443,8 @@ err_vf_wq:
 err_pf_wq:
        adf_exit_aer();
 err_aer:
+       adf_exit_misc_wq();
+err_misc_wq:
        adf_chr_drv_destroy();
 err_chr_dev:
        mutex_destroy(&adf_ctl_lock);
@@ -449,6 +454,7 @@ err_chr_dev:
 static void __exit adf_unregister_ctl_device_driver(void)
 {
        adf_chr_drv_destroy();
+       adf_exit_misc_wq();
        adf_exit_aer();
        adf_exit_vf_wq();
        adf_exit_pf_wq();
index 4ca482aa69f7ca931100e2cbb6bba0e9dfc8e4d5..803b89ba9670c2019b309a77c88c87998818d0f8 100644 (file)
@@ -16,6 +16,7 @@
 #include "adf_transport_internal.h"
 
 #define ADF_MAX_NUM_VFS        32
+static struct workqueue_struct *adf_misc_wq;
 
 static int adf_enable_msix(struct adf_accel_dev *accel_dev)
 {
@@ -341,3 +342,30 @@ err_out:
        return ret;
 }
 EXPORT_SYMBOL_GPL(adf_isr_resource_alloc);
+
+/**
+ * adf_init_misc_wq() - Init misc workqueue
+ *
+ * Function init workqueue 'qat_misc_wq' for general purpose.
+ *
+ * Return: 0 on success, error code otherwise.
+ */
+int __init adf_init_misc_wq(void)
+{
+       adf_misc_wq = alloc_workqueue("qat_misc_wq", WQ_MEM_RECLAIM, 0);
+
+       return !adf_misc_wq ? -ENOMEM : 0;
+}
+
+void adf_exit_misc_wq(void)
+{
+       if (adf_misc_wq)
+               destroy_workqueue(adf_misc_wq);
+
+       adf_misc_wq = NULL;
+}
+
+bool adf_misc_wq_queue_work(struct work_struct *work)
+{
+       return queue_work(adf_misc_wq, work);
+}