Commit baabf59c authored by Chuck Lever's avatar Chuck Lever

SUNRPC: Convert svc_udp_sendto() to use the per-socket bio_vec array

Commit da1661b9 ("SUNRPC: Teach server to use xprt_sock_sendmsg
for socket sends") modified svc_udp_sendto() to use xprt_sock_sendmsg()
because we originally believed xprt_sock_sendmsg() would be needed
for TLS support. That does not actually appear to be the case.

In addition, the linkage between the client and server send code has
been a bit of a maintenance headache because of the distinct ways
that the client and server handle memory allocation.

Going forward, eventually the XDR layer will deal with its buffers
in the form of bio_vec arrays, so convert this function accordingly.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent e18e157b
...@@ -693,9 +693,10 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) ...@@ -693,9 +693,10 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
.msg_name = &rqstp->rq_addr, .msg_name = &rqstp->rq_addr,
.msg_namelen = rqstp->rq_addrlen, .msg_namelen = rqstp->rq_addrlen,
.msg_control = cmh, .msg_control = cmh,
.msg_flags = MSG_SPLICE_PAGES,
.msg_controllen = sizeof(buffer), .msg_controllen = sizeof(buffer),
}; };
unsigned int sent; unsigned int count;
int err; int err;
svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt); svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
...@@ -708,22 +709,23 @@ static int svc_udp_sendto(struct svc_rqst *rqstp) ...@@ -708,22 +709,23 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
if (svc_xprt_is_dead(xprt)) if (svc_xprt_is_dead(xprt))
goto out_notconn; goto out_notconn;
err = xdr_alloc_bvec(xdr, GFP_KERNEL); count = xdr_buf_to_bvec(rqstp->rq_bvec,
if (err < 0) ARRAY_SIZE(rqstp->rq_bvec), xdr);
goto out_unlock;
err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent); iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
count, 0);
err = sock_sendmsg(svsk->sk_sock, &msg);
if (err == -ECONNREFUSED) { if (err == -ECONNREFUSED) {
/* ICMP error on earlier request. */ /* ICMP error on earlier request. */
err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent); iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
count, 0);
err = sock_sendmsg(svsk->sk_sock, &msg);
} }
xdr_free_bvec(xdr);
trace_svcsock_udp_send(xprt, err); trace_svcsock_udp_send(xprt, err);
out_unlock:
mutex_unlock(&xprt->xpt_mutex); mutex_unlock(&xprt->xpt_mutex);
if (err < 0) return err;
return err;
return sent;
out_notconn: out_notconn:
mutex_unlock(&xprt->xpt_mutex); mutex_unlock(&xprt->xpt_mutex);
......
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