RDMA/hns: Adjust the order in which irq are requested and enabled
authorWenpeng Liang <liangwenpeng@huawei.com>
Thu, 26 Aug 2021 13:37:34 +0000 (21:37 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 26 Aug 2021 15:12:20 +0000 (12:12 -0300)
It should first alloc workqueue and request irq, and finally enable irq.

Link: https://lore.kernel.org/r/1629985056-57004-6-git-send-email-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 85ad937..c27dc68 100644 (file)
@@ -6114,35 +6114,32 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
 
                ret = hns_roce_v2_create_eq(hr_dev, eq, eq_cmd);
                if (ret) {
-                       dev_err(dev, "eq create failed.\n");
+                       dev_err(dev, "failed to create eq.\n");
                        goto err_create_eq_fail;
                }
        }
 
-       /* enable irq */
-       hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE);
+       hr_dev->irq_workq = alloc_ordered_workqueue("hns_roce_irq_workq", 0);
+       if (!hr_dev->irq_workq) {
+               dev_err(dev, "failed to create irq workqueue.\n");
+               ret = -ENOMEM;
+               goto err_create_eq_fail;
+       }
 
-       ret = __hns_roce_request_irq(hr_dev, irq_num, comp_num,
-                                    aeq_num, other_num);
+       ret = __hns_roce_request_irq(hr_dev, irq_num, comp_num, aeq_num,
+                                    other_num);
        if (ret) {
-               dev_err(dev, "Request irq failed.\n");
+               dev_err(dev, "failed to request irq.\n");
                goto err_request_irq_fail;
        }
 
-       hr_dev->irq_workq = alloc_ordered_workqueue("hns_roce_irq_workq", 0);
-       if (!hr_dev->irq_workq) {
-               dev_err(dev, "Create irq workqueue failed!\n");
-               ret = -ENOMEM;
-               goto err_create_wq_fail;
-       }
+       /* enable irq */
+       hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE);
 
        return 0;
 
-err_create_wq_fail:
-       __hns_roce_free_irq(hr_dev);
-
 err_request_irq_fail:
-       hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
+       destroy_workqueue(hr_dev->irq_workq);
 
 err_create_eq_fail:
        for (i -= 1; i >= 0; i--)