Commit 48272502 authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields

svcrdma: Post Receives in the Receive completion handler

This change improves Receive efficiency by posting Receives only
on the same CPU that handles Receive completion. Improved latency
and throughput has been noted with this change.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 66282ec1
...@@ -185,8 +185,6 @@ extern void svc_rdma_wc_reg(struct ib_cq *, struct ib_wc *); ...@@ -185,8 +185,6 @@ extern void svc_rdma_wc_reg(struct ib_cq *, struct ib_wc *);
extern void svc_rdma_wc_read(struct ib_cq *, struct ib_wc *); extern void svc_rdma_wc_read(struct ib_cq *, struct ib_wc *);
extern void svc_rdma_wc_inv(struct ib_cq *, struct ib_wc *); extern void svc_rdma_wc_inv(struct ib_cq *, struct ib_wc *);
extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *); extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
extern int svc_rdma_post_recv(struct svcxprt_rdma *, gfp_t);
extern int svc_rdma_repost_recv(struct svcxprt_rdma *, gfp_t);
extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *); 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 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_put_context(struct svc_rdma_op_ctxt *, int);
......
...@@ -95,7 +95,6 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp, ...@@ -95,7 +95,6 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
out_notfound: out_notfound:
dprintk("svcrdma: unrecognized bc reply: xprt=%p, xid=%08x\n", dprintk("svcrdma: unrecognized bc reply: xprt=%p, xid=%08x\n",
xprt, be32_to_cpu(xid)); xprt, be32_to_cpu(xid));
goto out_unlock; goto out_unlock;
} }
...@@ -129,10 +128,6 @@ static int svc_rdma_bc_sendto(struct svcxprt_rdma *rdma, ...@@ -129,10 +128,6 @@ static int svc_rdma_bc_sendto(struct svcxprt_rdma *rdma,
if (ret < 0) if (ret < 0)
goto out_err; goto out_err;
ret = svc_rdma_repost_recv(rdma, GFP_NOIO);
if (ret)
goto out_err;
/* Bump page refcnt so Send completion doesn't release /* Bump page refcnt so Send completion doesn't release
* the rq_buffer before all retransmits are complete. * the rq_buffer before all retransmits are complete.
*/ */
......
...@@ -400,10 +400,6 @@ static void svc_rdma_send_error(struct svcxprt_rdma *xprt, ...@@ -400,10 +400,6 @@ static void svc_rdma_send_error(struct svcxprt_rdma *xprt,
struct page *page; struct page *page;
int ret; int ret;
ret = svc_rdma_repost_recv(xprt, GFP_KERNEL);
if (ret)
return;
page = alloc_page(GFP_KERNEL); page = alloc_page(GFP_KERNEL);
if (!page) if (!page)
return; return;
...@@ -554,8 +550,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) ...@@ -554,8 +550,6 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
ret = svc_rdma_handle_bc_reply(xprt->xpt_bc_xprt, p, ret = svc_rdma_handle_bc_reply(xprt->xpt_bc_xprt, p,
&rqstp->rq_arg); &rqstp->rq_arg);
svc_rdma_put_context(ctxt, 0); svc_rdma_put_context(ctxt, 0);
if (ret)
goto repost;
return ret; return ret;
} }
...@@ -590,6 +584,5 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) ...@@ -590,6 +584,5 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
out_drop: out_drop:
svc_rdma_put_context(ctxt, 1); svc_rdma_put_context(ctxt, 1);
repost: return 0;
return svc_rdma_repost_recv(rdma_xprt, GFP_KERNEL);
} }
...@@ -674,9 +674,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) ...@@ -674,9 +674,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
svc_rdma_xdr_encode_reply_chunk(rdma_resp, rp_ch, ret); svc_rdma_xdr_encode_reply_chunk(rdma_resp, rp_ch, ret);
} }
ret = svc_rdma_post_recv(rdma, GFP_KERNEL);
if (ret)
goto err1;
ret = svc_rdma_send_reply_msg(rdma, rdma_argp, rdma_resp, rqstp, ret = svc_rdma_send_reply_msg(rdma, rdma_argp, rdma_resp, rqstp,
wr_lst, rp_ch); wr_lst, rp_ch);
if (ret < 0) if (ret < 0)
...@@ -687,9 +684,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp) ...@@ -687,9 +684,6 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
if (ret != -E2BIG && ret != -EINVAL) if (ret != -E2BIG && ret != -EINVAL)
goto err1; goto err1;
ret = svc_rdma_post_recv(rdma, GFP_KERNEL);
if (ret)
goto err1;
ret = svc_rdma_send_error_msg(rdma, rdma_resp, rqstp); ret = svc_rdma_send_error_msg(rdma, rdma_resp, rqstp);
if (ret < 0) if (ret < 0)
goto err0; goto err0;
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#define RPCDBG_FACILITY RPCDBG_SVCXPRT #define RPCDBG_FACILITY RPCDBG_SVCXPRT
static int svc_rdma_post_recv(struct svcxprt_rdma *xprt);
static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *, int); static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *, int);
static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, static struct svc_xprt *svc_rdma_create(struct svc_serv *serv,
struct net *net, struct net *net,
...@@ -320,6 +321,8 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc) ...@@ -320,6 +321,8 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
list_add_tail(&ctxt->list, &xprt->sc_rq_dto_q); list_add_tail(&ctxt->list, &xprt->sc_rq_dto_q);
spin_unlock(&xprt->sc_rq_dto_lock); spin_unlock(&xprt->sc_rq_dto_lock);
svc_rdma_post_recv(xprt);
set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags); set_bit(XPT_DATA, &xprt->sc_xprt.xpt_flags);
if (test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags)) if (test_bit(RDMAXPRT_CONN_PENDING, &xprt->sc_flags))
goto out; goto out;
...@@ -404,7 +407,8 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv, ...@@ -404,7 +407,8 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
return cma_xprt; return cma_xprt;
} }
int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) static int
svc_rdma_post_recv(struct svcxprt_rdma *xprt)
{ {
struct ib_recv_wr recv_wr, *bad_recv_wr; struct ib_recv_wr recv_wr, *bad_recv_wr;
struct svc_rdma_op_ctxt *ctxt; struct svc_rdma_op_ctxt *ctxt;
...@@ -423,7 +427,7 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) ...@@ -423,7 +427,7 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags)
pr_err("svcrdma: Too many sges (%d)\n", sge_no); pr_err("svcrdma: Too many sges (%d)\n", sge_no);
goto err_put_ctxt; goto err_put_ctxt;
} }
page = alloc_page(flags); page = alloc_page(GFP_KERNEL);
if (!page) if (!page)
goto err_put_ctxt; goto err_put_ctxt;
ctxt->pages[sge_no] = page; ctxt->pages[sge_no] = page;
...@@ -459,21 +463,6 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags) ...@@ -459,21 +463,6 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags)
return -ENOMEM; return -ENOMEM;
} }
int svc_rdma_repost_recv(struct svcxprt_rdma *xprt, gfp_t flags)
{
int ret = 0;
ret = svc_rdma_post_recv(xprt, flags);
if (ret) {
pr_err("svcrdma: could not post a receive buffer, err=%d.\n",
ret);
pr_err("svcrdma: closing transport %p.\n", xprt);
set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
ret = -ENOTCONN;
}
return ret;
}
static void static void
svc_rdma_parse_connect_private(struct svcxprt_rdma *newxprt, svc_rdma_parse_connect_private(struct svcxprt_rdma *newxprt,
struct rdma_conn_param *param) struct rdma_conn_param *param)
...@@ -833,7 +822,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) ...@@ -833,7 +822,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
/* Post receive buffers */ /* Post receive buffers */
for (i = 0; i < newxprt->sc_max_requests; i++) { for (i = 0; i < newxprt->sc_max_requests; i++) {
ret = svc_rdma_post_recv(newxprt, GFP_KERNEL); ret = svc_rdma_post_recv(newxprt);
if (ret) { if (ret) {
dprintk("svcrdma: failure posting receive buffers\n"); dprintk("svcrdma: failure posting receive buffers\n");
goto errout; goto errout;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment