diff options
-rw-r--r-- | net/sunrpc/xprtrdma/frwr_ops.c | 38 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/xprt_rdma.h | 4 |
2 files changed, 24 insertions, 18 deletions
diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c index 88cf9e7269c2..31a45786137b 100644 --- a/net/sunrpc/xprtrdma/frwr_ops.c +++ b/net/sunrpc/xprtrdma/frwr_ops.c | |||
@@ -319,7 +319,7 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg, | |||
319 | struct rpcrdma_mw *mw; | 319 | struct rpcrdma_mw *mw; |
320 | struct rpcrdma_frmr *frmr; | 320 | struct rpcrdma_frmr *frmr; |
321 | struct ib_mr *mr; | 321 | struct ib_mr *mr; |
322 | struct ib_reg_wr reg_wr; | 322 | struct ib_reg_wr *reg_wr; |
323 | struct ib_send_wr *bad_wr; | 323 | struct ib_send_wr *bad_wr; |
324 | int rc, i, n, dma_nents; | 324 | int rc, i, n, dma_nents; |
325 | u8 key; | 325 | u8 key; |
@@ -336,6 +336,7 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg, | |||
336 | frmr = &mw->r.frmr; | 336 | frmr = &mw->r.frmr; |
337 | frmr->fr_state = FRMR_IS_VALID; | 337 | frmr->fr_state = FRMR_IS_VALID; |
338 | mr = frmr->fr_mr; | 338 | mr = frmr->fr_mr; |
339 | reg_wr = &frmr->fr_regwr; | ||
339 | 340 | ||
340 | if (nsegs > ia->ri_max_frmr_depth) | 341 | if (nsegs > ia->ri_max_frmr_depth) |
341 | nsegs = ia->ri_max_frmr_depth; | 342 | nsegs = ia->ri_max_frmr_depth; |
@@ -381,19 +382,19 @@ frwr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg, | |||
381 | key = (u8)(mr->rkey & 0x000000FF); | 382 | key = (u8)(mr->rkey & 0x000000FF); |
382 | ib_update_fast_reg_key(mr, ++key); | 383 | ib_update_fast_reg_key(mr, ++key); |
383 | 384 | ||
384 | reg_wr.wr.next = NULL; | 385 | reg_wr->wr.next = NULL; |
385 | reg_wr.wr.opcode = IB_WR_REG_MR; | 386 | reg_wr->wr.opcode = IB_WR_REG_MR; |
386 | reg_wr.wr.wr_id = (uintptr_t)mw; | 387 | reg_wr->wr.wr_id = (uintptr_t)mw; |
387 | reg_wr.wr.num_sge = 0; | 388 | reg_wr->wr.num_sge = 0; |
388 | reg_wr.wr.send_flags = 0; | 389 | reg_wr->wr.send_flags = 0; |
389 | reg_wr.mr = mr; | 390 | reg_wr->mr = mr; |
390 | reg_wr.key = mr->rkey; | 391 | reg_wr->key = mr->rkey; |
391 | reg_wr.access = writing ? | 392 | reg_wr->access = writing ? |
392 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : | 393 | IB_ACCESS_REMOTE_WRITE | IB_ACCESS_LOCAL_WRITE : |
393 | IB_ACCESS_REMOTE_READ; | 394 | IB_ACCESS_REMOTE_READ; |
394 | 395 | ||
395 | DECR_CQCOUNT(&r_xprt->rx_ep); | 396 | DECR_CQCOUNT(&r_xprt->rx_ep); |
396 | rc = ib_post_send(ia->ri_id->qp, ®_wr.wr, &bad_wr); | 397 | rc = ib_post_send(ia->ri_id->qp, ®_wr->wr, &bad_wr); |
397 | if (rc) | 398 | if (rc) |
398 | goto out_senderr; | 399 | goto out_senderr; |
399 | 400 | ||
@@ -423,23 +424,24 @@ frwr_op_unmap(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg) | |||
423 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | 424 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; |
424 | struct rpcrdma_mw *mw = seg1->rl_mw; | 425 | struct rpcrdma_mw *mw = seg1->rl_mw; |
425 | struct rpcrdma_frmr *frmr = &mw->r.frmr; | 426 | struct rpcrdma_frmr *frmr = &mw->r.frmr; |
426 | struct ib_send_wr invalidate_wr, *bad_wr; | 427 | struct ib_send_wr *invalidate_wr, *bad_wr; |
427 | int rc, nsegs = seg->mr_nsegs; | 428 | int rc, nsegs = seg->mr_nsegs; |
428 | 429 | ||
429 | dprintk("RPC: %s: FRMR %p\n", __func__, mw); | 430 | dprintk("RPC: %s: FRMR %p\n", __func__, mw); |
430 | 431 | ||
431 | seg1->rl_mw = NULL; | 432 | seg1->rl_mw = NULL; |
432 | frmr->fr_state = FRMR_IS_INVALID; | 433 | frmr->fr_state = FRMR_IS_INVALID; |
434 | invalidate_wr = &mw->r.frmr.fr_invwr; | ||
433 | 435 | ||
434 | memset(&invalidate_wr, 0, sizeof(invalidate_wr)); | 436 | memset(invalidate_wr, 0, sizeof(*invalidate_wr)); |
435 | invalidate_wr.wr_id = (unsigned long)(void *)mw; | 437 | invalidate_wr->wr_id = (uintptr_t)mw; |
436 | invalidate_wr.opcode = IB_WR_LOCAL_INV; | 438 | invalidate_wr->opcode = IB_WR_LOCAL_INV; |
437 | invalidate_wr.ex.invalidate_rkey = frmr->fr_mr->rkey; | 439 | invalidate_wr->ex.invalidate_rkey = frmr->fr_mr->rkey; |
438 | DECR_CQCOUNT(&r_xprt->rx_ep); | 440 | DECR_CQCOUNT(&r_xprt->rx_ep); |
439 | 441 | ||
440 | ib_dma_unmap_sg(ia->ri_device, frmr->sg, frmr->sg_nents, seg1->mr_dir); | 442 | ib_dma_unmap_sg(ia->ri_device, frmr->sg, frmr->sg_nents, seg1->mr_dir); |
441 | read_lock(&ia->ri_qplock); | 443 | read_lock(&ia->ri_qplock); |
442 | rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr); | 444 | rc = ib_post_send(ia->ri_id->qp, invalidate_wr, &bad_wr); |
443 | read_unlock(&ia->ri_qplock); | 445 | read_unlock(&ia->ri_qplock); |
444 | if (rc) | 446 | if (rc) |
445 | goto out_err; | 447 | goto out_err; |
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h index ac7f8d4f632a..5c1e0c600faf 100644 --- a/net/sunrpc/xprtrdma/xprt_rdma.h +++ b/net/sunrpc/xprtrdma/xprt_rdma.h | |||
@@ -207,6 +207,10 @@ struct rpcrdma_frmr { | |||
207 | enum rpcrdma_frmr_state fr_state; | 207 | enum rpcrdma_frmr_state fr_state; |
208 | struct work_struct fr_work; | 208 | struct work_struct fr_work; |
209 | struct rpcrdma_xprt *fr_xprt; | 209 | struct rpcrdma_xprt *fr_xprt; |
210 | union { | ||
211 | struct ib_reg_wr fr_regwr; | ||
212 | struct ib_send_wr fr_invwr; | ||
213 | }; | ||
210 | }; | 214 | }; |
211 | 215 | ||
212 | struct rpcrdma_fmr { | 216 | struct rpcrdma_fmr { |