RDMA/hns: Refactor code about SRQ Context
authorWenpeng Liang <liangwenpeng@huawei.com>
Sat, 30 Jan 2021 08:58:05 +0000 (16:58 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 8 Feb 2021 23:37:35 +0000 (19:37 -0400)
Reduce parameter numbers of write_srqc() and move some related code into
it from alloc_srqc().

Link: https://lore.kernel.org/r/1611997090-48820-8-git-send-email-liweihang@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_srq.c

index b325b9c4b4858a627553752e3815778b7d9b38f5..d51641af934216364d5eff70d9e7fa5b2e7e3eff 100644 (file)
@@ -953,11 +953,7 @@ struct hns_roce_hw {
        int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
        int (*init_eq)(struct hns_roce_dev *hr_dev);
        void (*cleanup_eq)(struct hns_roce_dev *hr_dev);
-       void (*write_srqc)(struct hns_roce_dev *hr_dev,
-                          struct hns_roce_srq *srq, void *mb_buf,
-                          u64 *mtts_wqe, u64 *mtts_idx,
-                          dma_addr_t dma_handle_wqe,
-                          dma_addr_t dma_handle_idx);
+       int (*write_srqc)(struct hns_roce_srq *srq, void *mb_buf);
        int (*modify_srq)(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr,
                       enum ib_srq_attr_mask srq_attr_mask,
                       struct ib_udata *udata);
index ec2d64c9111482a625d8758734b71f79859d6b87..dd5f7b57f007ee675afbc1b21444ebeeb1cab9d3 100644 (file)
@@ -5227,17 +5227,38 @@ out:
        return ret;
 }
 
-static void hns_roce_v2_write_srqc(struct hns_roce_dev *hr_dev,
-                                  struct hns_roce_srq *srq, void *mb_buf,
-                                  u64 *mtts_wqe, u64 *mtts_idx,
-                                  dma_addr_t dma_handle_wqe,
-                                  dma_addr_t dma_handle_idx)
+static int hns_roce_v2_write_srqc(struct hns_roce_srq *srq, void *mb_buf)
 {
+       struct ib_device *ibdev = srq->ibsrq.device;
+       struct hns_roce_dev *hr_dev = to_hr_dev(ibdev);
        struct hns_roce_srq_context *srq_context;
+       u64 mtts_wqe[MTT_MIN_COUNT] = {};
+       u64 mtts_idx[MTT_MIN_COUNT] = {};
+       dma_addr_t dma_handle_wqe = 0;
+       dma_addr_t dma_handle_idx = 0;
+       int ret;
 
        srq_context = mb_buf;
        memset(srq_context, 0, sizeof(*srq_context));
 
+       /* Get the physical address of srq buf */
+       ret = hns_roce_mtr_find(hr_dev, &srq->buf_mtr, 0, mtts_wqe,
+                               ARRAY_SIZE(mtts_wqe), &dma_handle_wqe);
+       if (ret < 1) {
+               ibdev_err(ibdev, "failed to find mtr for SRQ WQE, ret = %d.\n",
+                         ret);
+               return -ENOBUFS;
+       }
+
+       /* Get physical address of idx que buf */
+       ret = hns_roce_mtr_find(hr_dev, &srq->idx_que.mtr, 0, mtts_idx,
+                               ARRAY_SIZE(mtts_idx), &dma_handle_idx);
+       if (ret < 1) {
+               ibdev_err(ibdev, "failed to find mtr for SRQ idx, ret = %d.\n",
+                         ret);
+               return -ENOBUFS;
+       }
+
        roce_set_field(srq_context->byte_4_srqn_srqst, SRQC_BYTE_4_SRQ_ST_M,
                       SRQC_BYTE_4_SRQ_ST_S, 1);
 
@@ -5319,6 +5340,8 @@ static void hns_roce_v2_write_srqc(struct hns_roce_dev *hr_dev,
 
        roce_set_bit(srq_context->db_record_addr_record_en,
                     SRQC_BYTE_60_SRQ_RECORD_EN_S, 0);
+
+       return 0;
 }
 
 static int hns_roce_v2_modify_srq(struct ib_srq *ibsrq,
index 5069b8103b98f69d1dadfefe31cc8a340d803a4c..d5a6de0e70956571198f12ce1e41d31a4994fc6c 100644 (file)
@@ -82,34 +82,11 @@ static int alloc_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
        struct hns_roce_srq_table *srq_table = &hr_dev->srq_table;
        struct ib_device *ibdev = &hr_dev->ib_dev;
        struct hns_roce_cmd_mailbox *mailbox;
-       u64 mtts_wqe[MTT_MIN_COUNT] = { 0 };
-       u64 mtts_idx[MTT_MIN_COUNT] = { 0 };
-       dma_addr_t dma_handle_wqe = 0;
-       dma_addr_t dma_handle_idx = 0;
        int ret;
 
-       /* Get the physical address of srq buf */
-       ret = hns_roce_mtr_find(hr_dev, &srq->buf_mtr, 0, mtts_wqe,
-                               ARRAY_SIZE(mtts_wqe), &dma_handle_wqe);
-       if (ret < 1) {
-               ibdev_err(ibdev, "failed to find mtr for SRQ WQE, ret = %d.\n",
-                         ret);
-               return -ENOBUFS;
-       }
-
-       /* Get physical address of idx que buf */
-       ret = hns_roce_mtr_find(hr_dev, &srq->idx_que.mtr, 0, mtts_idx,
-                               ARRAY_SIZE(mtts_idx), &dma_handle_idx);
-       if (ret < 1) {
-               ibdev_err(ibdev, "failed to find mtr for SRQ idx, ret = %d.\n",
-                         ret);
-               return -ENOBUFS;
-       }
-
        ret = hns_roce_bitmap_alloc(&srq_table->bitmap, &srq->srqn);
        if (ret) {
-               ibdev_err(ibdev,
-                         "failed to alloc SRQ number, ret = %d.\n", ret);
+               ibdev_err(ibdev, "failed to alloc SRQ number.\n");
                return -ENOMEM;
        }
 
@@ -127,31 +104,36 @@ static int alloc_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
 
        mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
        if (IS_ERR_OR_NULL(mailbox)) {
-               ret = -ENOMEM;
                ibdev_err(ibdev, "failed to alloc mailbox for SRQC.\n");
+               ret = -ENOMEM;
                goto err_xa;
        }
 
-       hr_dev->hw->write_srqc(hr_dev, srq, mailbox->buf, mtts_wqe, mtts_idx,
-                              dma_handle_wqe, dma_handle_idx);
+       ret = hr_dev->hw->write_srqc(srq, mailbox->buf);
+       if (ret) {
+               ibdev_err(ibdev, "failed to write SRQC.\n");
+               goto err_mbox;
+       }
 
        ret = hns_roce_hw_create_srq(hr_dev, mailbox, srq->srqn);
-       hns_roce_free_cmd_mailbox(hr_dev, mailbox);
        if (ret) {
                ibdev_err(ibdev, "failed to config SRQC, ret = %d.\n", ret);
-               goto err_xa;
+               goto err_mbox;
        }
 
+       hns_roce_free_cmd_mailbox(hr_dev, mailbox);
+
        return 0;
 
+err_mbox:
+       hns_roce_free_cmd_mailbox(hr_dev, mailbox);
 err_xa:
        xa_erase(&srq_table->xa, srq->srqn);
-
 err_put:
        hns_roce_table_put(hr_dev, &srq_table->table, srq->srqn);
-
 err_out:
        hns_roce_bitmap_free(&srq_table->bitmap, srq->srqn, BITMAP_NO_RR);
+
        return ret;
 }