static struct hnae3_ae_algo ae_algo;
 
+static struct workqueue_struct *hclge_wq;
+
 static const struct pci_device_id ae_algo_pci_tbl[] = {
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_GE), 0},
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE), 0},
        if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
            !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
                mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
-                                   system_wq, &hdev->service_task, 0);
+                                   hclge_wq, &hdev->service_task, 0);
 }
 
 static void hclge_reset_task_schedule(struct hclge_dev *hdev)
        if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
            !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state))
                mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
-                                   system_wq, &hdev->service_task, 0);
+                                   hclge_wq, &hdev->service_task, 0);
 }
 
 void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
 {
        if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state))
                mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
-                                   system_wq, &hdev->service_task,
+                                   hclge_wq, &hdev->service_task,
                                    delay_time);
 }
 
 {
        pr_info("%s is initializing\n", HCLGE_NAME);
 
+       hclge_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGE_NAME);
+       if (!hclge_wq) {
+               pr_err("%s: failed to create workqueue\n", HCLGE_NAME);
+               return -ENOMEM;
+       }
+
        hnae3_register_ae_algo(&ae_algo);
 
        return 0;
 static void hclge_exit(void)
 {
        hnae3_unregister_ae_algo(&ae_algo);
+       destroy_workqueue(hclge_wq);
 }
 module_init(hclge_init);
 module_exit(hclge_exit);
 
 static int hclgevf_reset_hdev(struct hclgevf_dev *hdev);
 static struct hnae3_ae_algo ae_algovf;
 
+static struct workqueue_struct *hclgevf_wq;
+
 static const struct pci_device_id ae_algovf_pci_tbl[] = {
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_VF), 0},
        {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_DCB_PFC_VF), 0},
        if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&
            !test_and_set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED,
                              &hdev->state))
-               mod_delayed_work(system_wq, &hdev->service_task, 0);
+               mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);
 }
 
 void hclgevf_mbx_task_schedule(struct hclgevf_dev *hdev)
        if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) &&
            !test_and_set_bit(HCLGEVF_STATE_MBX_SERVICE_SCHED,
                              &hdev->state))
-               mod_delayed_work(system_wq, &hdev->service_task, 0);
+               mod_delayed_work(hclgevf_wq, &hdev->service_task, 0);
 }
 
 static void hclgevf_task_schedule(struct hclgevf_dev *hdev,
                                  unsigned long delay)
 {
        if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state))
-               mod_delayed_work(system_wq, &hdev->service_task, delay);
+               mod_delayed_work(hclgevf_wq, &hdev->service_task, delay);
 }
 
 static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
 {
        pr_info("%s is initializing\n", HCLGEVF_NAME);
 
+       hclgevf_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, HCLGEVF_NAME);
+       if (!hclgevf_wq) {
+               pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME);
+               return -ENOMEM;
+       }
+
        hnae3_register_ae_algo(&ae_algovf);
 
        return 0;
 static void hclgevf_exit(void)
 {
        hnae3_unregister_ae_algo(&ae_algovf);
+       destroy_workqueue(hclgevf_wq);
 }
 module_init(hclgevf_init);
 module_exit(hclgevf_exit);