Skip to content

Commit

Permalink
SUNRPC: Move the call to xprt_send_pagedata() out of xprt_sock_sendmsg()
Browse files Browse the repository at this point in the history
The client and server have different requirements for their memory
allocation, so move the allocation of the send buffer out of the socket
send code that is common to both.

Reported-by: NeilBrown <neilb@suse.de>
Fixes: b264801 ("SUNRPC: Make the rpciod and xprtiod slab allocation modes consistent")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
  • Loading branch information
Trond Myklebust committed Apr 7, 2022
1 parent b056fa0 commit ff053db
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
6 changes: 0 additions & 6 deletions net/sunrpc/socklib.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,6 @@ static int xprt_send_kvec(struct socket *sock, struct msghdr *msg,
static int xprt_send_pagedata(struct socket *sock, struct msghdr *msg,
struct xdr_buf *xdr, size_t base)
{
int err;

err = xdr_alloc_bvec(xdr, rpc_task_gfp_mask());
if (err < 0)
return err;

iov_iter_bvec(&msg->msg_iter, WRITE, xdr->bvec, xdr_buf_pagecount(xdr),
xdr->page_len + xdr->page_base);
return xprt_sendmsg(sock, msg, base + xdr->page_base);
Expand Down
9 changes: 6 additions & 3 deletions net/sunrpc/svcsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,15 +579,18 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
if (svc_xprt_is_dead(xprt))
goto out_notconn;

err = xdr_alloc_bvec(xdr, GFP_KERNEL);
if (err < 0)
goto out_unlock;

err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
xdr_free_bvec(xdr);
if (err == -ECONNREFUSED) {
/* ICMP error on earlier request. */
err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
xdr_free_bvec(xdr);
}
xdr_free_bvec(xdr);
trace_svcsock_udp_send(xprt, err);

out_unlock:
mutex_unlock(&xprt->xpt_mutex);
if (err < 0)
return err;
Expand Down
15 changes: 13 additions & 2 deletions net/sunrpc/xprtsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -825,9 +825,14 @@ static int xs_stream_nospace(struct rpc_rqst *req, bool vm_wait)
static int
xs_stream_prepare_request(struct rpc_rqst *req)
{
gfp_t gfp = rpc_task_gfp_mask();
int ret;

ret = xdr_alloc_bvec(&req->rq_snd_buf, gfp);
if (ret < 0)
return ret;
xdr_free_bvec(&req->rq_rcv_buf);
return xdr_alloc_bvec(
&req->rq_rcv_buf, GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);
return xdr_alloc_bvec(&req->rq_rcv_buf, gfp);
}

/*
Expand Down Expand Up @@ -956,6 +961,9 @@ static int xs_udp_send_request(struct rpc_rqst *req)
if (!xprt_request_get_cong(xprt, req))
return -EBADSLT;

status = xdr_alloc_bvec(xdr, rpc_task_gfp_mask());
if (status < 0)
return status;
req->rq_xtime = ktime_get();
status = xprt_sock_sendmsg(transport->sock, &msg, xdr, 0, 0, &sent);

Expand Down Expand Up @@ -2554,6 +2562,9 @@ static int bc_sendto(struct rpc_rqst *req)
int err;

req->rq_xtime = ktime_get();
err = xdr_alloc_bvec(xdr, rpc_task_gfp_mask());
if (err < 0)
return err;
err = xprt_sock_sendmsg(transport->sock, &msg, xdr, 0, marker, &sent);
xdr_free_bvec(xdr);
if (err < 0 || sent != (xdr->len + sizeof(marker)))
Expand Down

0 comments on commit ff053db

Please sign in to comment.