|
@@ -169,6 +169,51 @@ out_err:
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * rpcrdma_bc_marshal_reply - Send backwards direction reply
|
|
|
+ * @rqst: buffer containing RPC reply data
|
|
|
+ *
|
|
|
+ * Returns zero on success.
|
|
|
+ */
|
|
|
+int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)
|
|
|
+{
|
|
|
+ struct rpc_xprt *xprt = rqst->rq_xprt;
|
|
|
+ struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
|
|
|
+ struct rpcrdma_req *req = rpcr_to_rdmar(rqst);
|
|
|
+ struct rpcrdma_msg *headerp;
|
|
|
+ size_t rpclen;
|
|
|
+
|
|
|
+ headerp = rdmab_to_msg(req->rl_rdmabuf);
|
|
|
+ headerp->rm_xid = rqst->rq_xid;
|
|
|
+ headerp->rm_vers = rpcrdma_version;
|
|
|
+ headerp->rm_credit =
|
|
|
+ cpu_to_be32(r_xprt->rx_buf.rb_bc_srv_max_requests);
|
|
|
+ headerp->rm_type = rdma_msg;
|
|
|
+ headerp->rm_body.rm_chunks[0] = xdr_zero;
|
|
|
+ headerp->rm_body.rm_chunks[1] = xdr_zero;
|
|
|
+ headerp->rm_body.rm_chunks[2] = xdr_zero;
|
|
|
+
|
|
|
+ rpclen = rqst->rq_svec[0].iov_len;
|
|
|
+
|
|
|
+ pr_info("RPC: %s: rpclen %zd headerp 0x%p lkey 0x%x\n",
|
|
|
+ __func__, rpclen, headerp, rdmab_lkey(req->rl_rdmabuf));
|
|
|
+ pr_info("RPC: %s: RPC/RDMA: %*ph\n",
|
|
|
+ __func__, (int)RPCRDMA_HDRLEN_MIN, headerp);
|
|
|
+ pr_info("RPC: %s: RPC: %*ph\n",
|
|
|
+ __func__, (int)rpclen, rqst->rq_svec[0].iov_base);
|
|
|
+
|
|
|
+ req->rl_send_iov[0].addr = rdmab_addr(req->rl_rdmabuf);
|
|
|
+ req->rl_send_iov[0].length = RPCRDMA_HDRLEN_MIN;
|
|
|
+ req->rl_send_iov[0].lkey = rdmab_lkey(req->rl_rdmabuf);
|
|
|
+
|
|
|
+ req->rl_send_iov[1].addr = rdmab_addr(req->rl_sendbuf);
|
|
|
+ req->rl_send_iov[1].length = rpclen;
|
|
|
+ req->rl_send_iov[1].lkey = rdmab_lkey(req->rl_sendbuf);
|
|
|
+
|
|
|
+ req->rl_niovs = 2;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* xprt_rdma_bc_destroy - Release resources for handling backchannel requests
|
|
|
* @xprt: transport associated with these backchannel resources
|