]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
svcrdma: Clean up RPC-over-RDMA backchannel reply processing
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Apr 2017 17:06:49 +0000 (13:06 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 25 Apr 2017 21:25:55 +0000 (17:25 -0400)
Replace C structure-based XDR decoding with pointer arithmetic.
Pointer arithmetic is considered more portable.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_backchannel.c
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c

index a770d200f6076931a1bc6bcd6aa8ca39fa92c247..44d642bbfce68c6cf4114d66ce1a76f0ed805df7 100644 (file)
@@ -204,7 +204,7 @@ static inline void svc_rdma_count_mappings(struct svcxprt_rdma *rdma,
 
 /* svc_rdma_backchannel.c */
 extern int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt,
-                                   struct rpcrdma_msg *rmsgp,
+                                   __be32 *rdma_resp,
                                    struct xdr_buf *rcvbuf);
 
 /* svc_rdma_marshal.c */
index bf185b79c98fb502bced8d5fcda7868222fee78f..c676ed0efb5af2cceb6ed59e238a0f7a0109f916 100644 (file)
 
 #undef SVCRDMA_BACKCHANNEL_DEBUG
 
-int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
+/**
+ * svc_rdma_handle_bc_reply - Process incoming backchannel reply
+ * @xprt: controlling backchannel transport
+ * @rdma_resp: pointer to incoming transport header
+ * @rcvbuf: XDR buffer into which to decode the reply
+ *
+ * Returns:
+ *     %0 if @rcvbuf is filled in, xprt_complete_rqst called,
+ *     %-EAGAIN if server should call ->recvfrom again.
+ */
+int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
                             struct xdr_buf *rcvbuf)
 {
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
@@ -27,13 +37,13 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
 
        p = (__be32 *)src->iov_base;
        len = src->iov_len;
-       xid = rmsgp->rm_xid;
+       xid = *rdma_resp;
 
 #ifdef SVCRDMA_BACKCHANNEL_DEBUG
        pr_info("%s: xid=%08x, length=%zu\n",
                __func__, be32_to_cpu(xid), len);
        pr_info("%s: RPC/RDMA: %*ph\n",
-               __func__, (int)RPCRDMA_HDRLEN_MIN, rmsgp);
+               __func__, (int)RPCRDMA_HDRLEN_MIN, rdma_resp);
        pr_info("%s:      RPC: %*ph\n",
                __func__, (int)len, p);
 #endif
@@ -53,7 +63,7 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
                goto out_unlock;
        memcpy(dst->iov_base, p, len);
 
-       credits = be32_to_cpu(rmsgp->rm_credit);
+       credits = be32_to_cpup(rdma_resp + 2);
        if (credits == 0)
                credits = 1;    /* don't deadlock */
        else if (credits > r_xprt->rx_buf.rb_bc_max_requests)
index 7435cb666f42470540a9a493ceab423198836ce4..27a99bf5b1a6f669be74f86347c7a16e3ce213fe 100644 (file)
@@ -613,28 +613,30 @@ static void svc_rdma_send_error(struct svcxprt_rdma *xprt,
  * the RPC/RDMA header small and fixed in size, so it is
  * straightforward to check the RPC header's direction field.
  */
-static bool
-svc_rdma_is_backchannel_reply(struct svc_xprt *xprt, struct rpcrdma_msg *rmsgp)
+static bool svc_rdma_is_backchannel_reply(struct svc_xprt *xprt,
+                                         __be32 *rdma_resp)
 {
-       __be32 *p = (__be32 *)rmsgp;
+       __be32 *p;
 
        if (!xprt->xpt_bc_xprt)
                return false;
 
-       if (rmsgp->rm_type != rdma_msg)
+       p = rdma_resp + 3;
+       if (*p++ != rdma_msg)
                return false;
-       if (rmsgp->rm_body.rm_chunks[0] != xdr_zero)
+
+       if (*p++ != xdr_zero)
                return false;
-       if (rmsgp->rm_body.rm_chunks[1] != xdr_zero)
+       if (*p++ != xdr_zero)
                return false;
-       if (rmsgp->rm_body.rm_chunks[2] != xdr_zero)
+       if (*p++ != xdr_zero)
                return false;
 
-       /* sanity */
-       if (p[7] != rmsgp->rm_xid)
+       /* XID sanity */
+       if (*p++ != *rdma_resp)
                return false;
        /* call direction */
-       if (p[8] == cpu_to_be32(RPC_CALL))
+       if (*p == cpu_to_be32(RPC_CALL))
                return false;
 
        return true;
@@ -700,8 +702,9 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
                goto out_drop;
        rqstp->rq_xprt_hlen = ret;
 
-       if (svc_rdma_is_backchannel_reply(xprt, rmsgp)) {
-               ret = svc_rdma_handle_bc_reply(xprt->xpt_bc_xprt, rmsgp,
+       if (svc_rdma_is_backchannel_reply(xprt, &rmsgp->rm_xid)) {
+               ret = svc_rdma_handle_bc_reply(xprt->xpt_bc_xprt,
+                                              &rmsgp->rm_xid,
                                               &rqstp->rq_arg);
                svc_rdma_put_context(ctxt, 0);
                if (ret)