svcrdma: Modify the RPC recv path to use FRMR when available
Subsystems (3)
RFC PATCH 7/9 svcrdma: Modify the RPC recv path to use FRMR when available
RPCRDMA requests that specify a read-list are fetched with RDMA_READ. Using an FRMR to map the data sink improves NFSRDMA security on transports that place the RDMA_READ data sink LKEY on the wire because the valid lifetime of the MR is only the duration of the RDMA_READ. The LKEY is invalidated when the last RDMA_READ WR completes.
Mapping the data sink also allows for very large amounts to data to be fetched with a single WR, so if the client is also using FRMR, the entire RPC read-list can be fetched with a single WR.
Signed-off-by Tom Tucker <[email protected]>
--- include/linux/sunrpc/svc_rdma.h | 1 + net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 187 ++++++++++++++++++++++++++---- net/sunrpc/xprtrdma/svc_rdma_transport.c | 5 +- 3 files changed, 171 insertions(+), 22 deletions(-)
include/linux/sunrpc/svc_rdma.h +1 -0
@@ -217,6 +217,7 @@ extern int svc_rdma_post_recv(struct svcxprt_rdma *);extern int svc_rdma_create_listen (struct svc_serv *,int ,struct sockaddr *);extern struct svc_rdma_op_ctxt *svc_rdma_get_context (struct svcxprt_rdma *);extern void svc_rdma_put_context (struct svc_rdma_op_ctxt *,int ); +extern void svc_rdma_unmap_dma (struct svc_rdma_op_ctxt *ctxt);extern struct svc_rdma_req_map *svc_rdma_get_req_map (void );extern void svc_rdma_put_req_map (struct svc_rdma_req_map *);extern int svc_rdma_fastreg (struct svcxprt_rdma *,struct svc_rdma_fastreg_mr *);
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +166 -21
250 lines not on this page · raw message
net/sunrpc/xprtrdma/svc_rdma_transport.c +4 -1
@@ -105,7 +105,7 @@ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)return ctxt; } -static void svc_rdma_unmap_dma (struct svc_rdma_op_ctxt *ctxt) +void svc_rdma_unmap_dma (struct svc_rdma_op_ctxt *ctxt) {struct svcxprt_rdma *xprt = ctxt->xprt;int i;
@@ -367,9 +367,12 @@ static void sq_cq_reap(struct svcxprt_rdma *xprt)break ;case IB_WR_RDMA_READ : +case IB_WR_RDMA_READ_WITH_INV :if (test_bit (RDMACTXT_F_LAST_CTXT , &ctxt->flags)) {struct svc_rdma_op_ctxt *read_hdr = ctxt->read_hdr;BUG_ON (!read_hdr); +if (test_bit (RDMACTXT_F_FAST_UNREG , &ctxt->flags)) +svc_rdma_put_frmr (xprt, ctxt->frmr);spin_lock_bh (&xprt->sc_rq_dto_lock);set_bit (XPT_DATA , &xprt->sc_xprt.xpt_flags); list_add_tail(&read_hdr->dto_q,