OSDN Git Service

xprtrdma: Use gathered Send for large inline messages
[uclinux-h8/linux.git] / net / sunrpc / xprtrdma / backchannel.c
index 87762d9..2c472e1 100644 (file)
@@ -27,7 +27,7 @@ static void rpcrdma_bc_free_rqst(struct rpcrdma_xprt *r_xprt,
        list_del(&req->rl_all);
        spin_unlock(&buf->rb_reqslock);
 
-       rpcrdma_destroy_req(&r_xprt->rx_ia, req);
+       rpcrdma_destroy_req(req);
 
        kfree(rqst);
 }
@@ -35,10 +35,8 @@ static void rpcrdma_bc_free_rqst(struct rpcrdma_xprt *r_xprt,
 static int rpcrdma_bc_setup_rqst(struct rpcrdma_xprt *r_xprt,
                                 struct rpc_rqst *rqst)
 {
-       struct rpcrdma_ia *ia = &r_xprt->rx_ia;
        struct rpcrdma_regbuf *rb;
        struct rpcrdma_req *req;
-       struct xdr_buf *buf;
        size_t size;
 
        req = rpcrdma_create_req(r_xprt);
@@ -46,30 +44,19 @@ static int rpcrdma_bc_setup_rqst(struct rpcrdma_xprt *r_xprt,
                return PTR_ERR(req);
        req->rl_backchannel = true;
 
-       size = RPCRDMA_INLINE_WRITE_THRESHOLD(rqst);
-       rb = rpcrdma_alloc_regbuf(ia, size, GFP_KERNEL);
+       rb = rpcrdma_alloc_regbuf(RPCRDMA_HDRBUF_SIZE,
+                                 DMA_TO_DEVICE, GFP_KERNEL);
        if (IS_ERR(rb))
                goto out_fail;
        req->rl_rdmabuf = rb;
 
-       size += RPCRDMA_INLINE_READ_THRESHOLD(rqst);
-       rb = rpcrdma_alloc_regbuf(ia, size, GFP_KERNEL);
+       size = r_xprt->rx_data.inline_rsize;
+       rb = rpcrdma_alloc_regbuf(size, DMA_TO_DEVICE, GFP_KERNEL);
        if (IS_ERR(rb))
                goto out_fail;
-       rb->rg_owner = req;
        req->rl_sendbuf = rb;
-       /* so that rpcr_to_rdmar works when receiving a request */
-       rqst->rq_buffer = (void *)req->rl_sendbuf->rg_base;
-
-       buf = &rqst->rq_snd_buf;
-       buf->head[0].iov_base = rqst->rq_buffer;
-       buf->head[0].iov_len = 0;
-       buf->tail[0].iov_base = NULL;
-       buf->tail[0].iov_len = 0;
-       buf->page_len = 0;
-       buf->len = 0;
-       buf->buflen = size;
-
+       xdr_buf_init(&rqst->rq_snd_buf, rb->rg_base, size);
+       rpcrdma_set_xprtdata(rqst, req);
        return 0;
 
 out_fail:
@@ -219,7 +206,6 @@ int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)
        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;
@@ -231,26 +217,9 @@ int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)
        headerp->rm_body.rm_chunks[1] = xdr_zero;
        headerp->rm_body.rm_chunks[2] = xdr_zero;
 
-       rpclen = rqst->rq_svec[0].iov_len;
-
-#ifdef RPCRDMA_BACKCHANNEL_DEBUG
-       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);
-#endif
-
-       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;
+       if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, RPCRDMA_HDRLEN_MIN,
+                                      &rqst->rq_snd_buf, rpcrdma_noch))
+               return -EIO;
        return 0;
 }
 
@@ -402,7 +371,7 @@ out_overflow:
 out_short:
        pr_warn("RPC/RDMA short backward direction call\n");
 
-       if (rpcrdma_ep_post_recv(&r_xprt->rx_ia, &r_xprt->rx_ep, rep))
+       if (rpcrdma_ep_post_recv(&r_xprt->rx_ia, rep))
                xprt_disconnect_done(xprt);
        else
                pr_warn("RPC:       %s: reposting rep %p\n",