aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sunrpc/xprtrdma/frwr_ops.c38
-rw-r--r--net/sunrpc/xprtrdma/xprt_rdma.h4
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, &reg_wr.wr, &bad_wr); 397 rc = ib_post_send(ia->ri_id->qp, &reg_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
212struct rpcrdma_fmr { 216struct rpcrdma_fmr {