Skip to content

Commit add08d7

Browse files
Christoph Hellwigdledford
authored andcommitted
IB/mlx5: Convert UMR CQ to new CQ API
Simplifies the code, and makes it more fair vs other users by using a softirq for polling. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Haggai Eran <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent d2370e0 commit add08d7

File tree

3 files changed

+27
-40
lines changed

3 files changed

+27
-40
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,7 +1861,7 @@ static void destroy_umrc_res(struct mlx5_ib_dev *dev)
18611861
mlx5_ib_warn(dev, "mr cache cleanup failed\n");
18621862

18631863
mlx5_ib_destroy_qp(dev->umrc.qp);
1864-
ib_destroy_cq(dev->umrc.cq);
1864+
ib_free_cq(dev->umrc.cq);
18651865
ib_dealloc_pd(dev->umrc.pd);
18661866
}
18671867

@@ -1876,7 +1876,6 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
18761876
struct ib_pd *pd;
18771877
struct ib_cq *cq;
18781878
struct ib_qp *qp;
1879-
struct ib_cq_init_attr cq_attr = {};
18801879
int ret;
18811880

18821881
attr = kzalloc(sizeof(*attr), GFP_KERNEL);
@@ -1893,15 +1892,12 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
18931892
goto error_0;
18941893
}
18951894

1896-
cq_attr.cqe = 128;
1897-
cq = ib_create_cq(&dev->ib_dev, mlx5_umr_cq_handler, NULL, NULL,
1898-
&cq_attr);
1895+
cq = ib_alloc_cq(&dev->ib_dev, NULL, 128, 0, IB_POLL_SOFTIRQ);
18991896
if (IS_ERR(cq)) {
19001897
mlx5_ib_dbg(dev, "Couldn't create CQ for sync UMR QP\n");
19011898
ret = PTR_ERR(cq);
19021899
goto error_2;
19031900
}
1904-
ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
19051901

19061902
init_attr->send_cq = cq;
19071903
init_attr->recv_cq = cq;
@@ -1968,7 +1964,7 @@ static int create_umr_res(struct mlx5_ib_dev *dev)
19681964
mlx5_ib_destroy_qp(qp);
19691965

19701966
error_3:
1971-
ib_destroy_cq(cq);
1967+
ib_free_cq(cq);
19721968

19731969
error_2:
19741970
ib_dealloc_pd(pd);

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -468,16 +468,11 @@ struct mlx5_ib_mw {
468468
};
469469

470470
struct mlx5_ib_umr_context {
471+
struct ib_cqe cqe;
471472
enum ib_wc_status status;
472473
struct completion done;
473474
};
474475

475-
static inline void mlx5_ib_init_umr_context(struct mlx5_ib_umr_context *context)
476-
{
477-
context->status = -1;
478-
init_completion(&context->done);
479-
}
480-
481476
struct umr_common {
482477
struct ib_pd *pd;
483478
struct ib_cq *cq;
@@ -762,7 +757,6 @@ int mlx5_ib_get_cqe_size(struct mlx5_ib_dev *dev, struct ib_cq *ibcq);
762757
int mlx5_mr_cache_init(struct mlx5_ib_dev *dev);
763758
int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev);
764759
int mlx5_mr_ib_cont_pages(struct ib_umem *umem, u64 addr, int *count, int *shift);
765-
void mlx5_umr_cq_handler(struct ib_cq *cq, void *cq_context);
766760
int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
767761
struct ib_mr_status *mr_status);
768762

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -836,26 +836,20 @@ static struct ib_umem *mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
836836
return umem;
837837
}
838838

839-
void mlx5_umr_cq_handler(struct ib_cq *cq, void *cq_context)
839+
static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc)
840840
{
841-
struct mlx5_ib_umr_context *context;
842-
struct ib_wc wc;
843-
int err;
841+
struct mlx5_ib_umr_context *context =
842+
container_of(wc->wr_cqe, struct mlx5_ib_umr_context, cqe);
844843

845-
while (1) {
846-
err = ib_poll_cq(cq, 1, &wc);
847-
if (err < 0) {
848-
pr_warn("poll cq error %d\n", err);
849-
return;
850-
}
851-
if (err == 0)
852-
break;
844+
context->status = wc->status;
845+
complete(&context->done);
846+
}
853847

854-
context = (struct mlx5_ib_umr_context *) (unsigned long) wc.wr_id;
855-
context->status = wc.status;
856-
complete(&context->done);
857-
}
858-
ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
848+
static inline void mlx5_ib_init_umr_context(struct mlx5_ib_umr_context *context)
849+
{
850+
context->cqe.done = mlx5_ib_umr_done;
851+
context->status = -1;
852+
init_completion(&context->done);
859853
}
860854

861855
static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
@@ -896,12 +890,13 @@ static struct mlx5_ib_mr *reg_umr(struct ib_pd *pd, struct ib_umem *umem,
896890
if (err)
897891
goto free_mr;
898892

893+
mlx5_ib_init_umr_context(&umr_context);
894+
899895
memset(&umrwr, 0, sizeof(umrwr));
900-
umrwr.wr.wr_id = (u64)(unsigned long)&umr_context;
896+
umrwr.wr.wr_cqe = &umr_context.cqe;
901897
prep_umr_reg_wqe(pd, &umrwr.wr, &sg, dma, npages, mr->mmkey.key,
902898
page_shift, virt_addr, len, access_flags);
903899

904-
mlx5_ib_init_umr_context(&umr_context);
905900
down(&umrc->sem);
906901
err = ib_post_send(umrc->qp, &umrwr.wr, &bad);
907902
if (err) {
@@ -1013,8 +1008,10 @@ int mlx5_ib_update_mtt(struct mlx5_ib_mr *mr, u64 start_page_index, int npages,
10131008

10141009
dma_sync_single_for_device(ddev, dma, size, DMA_TO_DEVICE);
10151010

1011+
mlx5_ib_init_umr_context(&umr_context);
1012+
10161013
memset(&wr, 0, sizeof(wr));
1017-
wr.wr.wr_id = (u64)(unsigned long)&umr_context;
1014+
wr.wr.wr_cqe = &umr_context.cqe;
10181015

10191016
sg.addr = dma;
10201017
sg.length = ALIGN(npages * sizeof(u64),
@@ -1031,7 +1028,6 @@ int mlx5_ib_update_mtt(struct mlx5_ib_mr *mr, u64 start_page_index, int npages,
10311028
wr.mkey = mr->mmkey.key;
10321029
wr.target.offset = start_page_index;
10331030

1034-
mlx5_ib_init_umr_context(&umr_context);
10351031
down(&umrc->sem);
10361032
err = ib_post_send(umrc->qp, &wr.wr, &bad);
10371033
if (err) {
@@ -1204,11 +1200,12 @@ static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
12041200
struct ib_send_wr *bad;
12051201
int err;
12061202

1203+
mlx5_ib_init_umr_context(&umr_context);
1204+
12071205
memset(&umrwr.wr, 0, sizeof(umrwr));
1208-
umrwr.wr.wr_id = (u64)(unsigned long)&umr_context;
1206+
umrwr.wr.wr_cqe = &umr_context.cqe;
12091207
prep_umr_unreg_wqe(dev, &umrwr.wr, mr->mmkey.key);
12101208

1211-
mlx5_ib_init_umr_context(&umr_context);
12121209
down(&umrc->sem);
12131210
err = ib_post_send(umrc->qp, &umrwr.wr, &bad);
12141211
if (err) {
@@ -1246,7 +1243,9 @@ static int rereg_umr(struct ib_pd *pd, struct mlx5_ib_mr *mr, u64 virt_addr,
12461243
int size;
12471244
int err;
12481245

1249-
umrwr.wr.wr_id = (u64)(unsigned long)&umr_context;
1246+
mlx5_ib_init_umr_context(&umr_context);
1247+
1248+
umrwr.wr.wr_cqe = &umr_context.cqe;
12501249
umrwr.wr.send_flags = MLX5_IB_SEND_UMR_FAIL_IF_FREE;
12511250

12521251
if (flags & IB_MR_REREG_TRANS) {
@@ -1273,8 +1272,6 @@ static int rereg_umr(struct ib_pd *pd, struct mlx5_ib_mr *mr, u64 virt_addr,
12731272
umrwr.wr.send_flags |= MLX5_IB_SEND_UMR_UPDATE_ACCESS;
12741273
}
12751274

1276-
mlx5_ib_init_umr_context(&umr_context);
1277-
12781275
/* post send request to UMR QP */
12791276
down(&umrc->sem);
12801277
err = ib_post_send(umrc->qp, &umrwr.wr, &bad);

0 commit comments

Comments
 (0)