Skip to content

Commit 067fb11

Browse files
chuckleveramschuma-ntap
authored andcommitted
SUNRPC: Remove rpc_xprt::tsh_size
tsh_size was added to accommodate transports that send a pre-amble before each RPC message. However, this assumes the pre-amble is fixed in size, which isn't true for some transports. That makes tsh_size not very generic. Also I'd like to make the estimation of RPC send and receive buffer sizes more precise. tsh_size doesn't currently appear to be accounted for at all by call_allocate. Therefore let's just remove the tsh_size concept, and make the only transports that have a non-zero tsh_size employ a direct approach. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent 80125d4 commit 067fb11

File tree

7 files changed

+65
-58
lines changed

7 files changed

+65
-58
lines changed

include/linux/sunrpc/xprt.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,6 @@ struct rpc_xprt {
196196

197197
size_t max_payload; /* largest RPC payload size,
198198
in bytes */
199-
unsigned int tsh_size; /* size of transport specific
200-
header */
201199

202200
struct rpc_wait_queue binding; /* requests waiting on rpcbind */
203201
struct rpc_wait_queue sending; /* requests waiting to send */
@@ -362,11 +360,6 @@ struct rpc_xprt * xprt_alloc(struct net *net, size_t size,
362360
unsigned int max_req);
363361
void xprt_free(struct rpc_xprt *);
364362

365-
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
366-
{
367-
return p + xprt->tsh_size;
368-
}
369-
370363
static inline int
371364
xprt_enable_swap(struct rpc_xprt *xprt)
372365
{

net/sunrpc/auth_gss/auth_gss.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,8 +1563,7 @@ gss_marshal(struct rpc_task *task, __be32 *p)
15631563

15641564
/* We compute the checksum for the verifier over the xdr-encoded bytes
15651565
* starting with the xid and ending at the end of the credential: */
1566-
iov.iov_base = xprt_skip_transport_header(req->rq_xprt,
1567-
req->rq_snd_buf.head[0].iov_base);
1566+
iov.iov_base = req->rq_snd_buf.head[0].iov_base;
15681567
iov.iov_len = (u8 *)p - (u8 *)iov.iov_base;
15691568
xdr_buf_from_iov(&iov, &verf_buf);
15701569

net/sunrpc/clnt.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2331,7 +2331,6 @@ rpc_encode_header(struct rpc_task *task)
23312331

23322332
/* FIXME: check buffer size? */
23332333

2334-
p = xprt_skip_transport_header(req->rq_xprt, p);
23352334
*p++ = req->rq_xid; /* XID */
23362335
*p++ = htonl(RPC_CALL); /* CALL */
23372336
*p++ = htonl(RPC_VERSION); /* RPC version */

net/sunrpc/svc.c

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,17 +1144,6 @@ void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
11441144
static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) {}
11451145
#endif
11461146

1147-
/*
1148-
* Setup response header for TCP, it has a 4B record length field.
1149-
*/
1150-
static void svc_tcp_prep_reply_hdr(struct svc_rqst *rqstp)
1151-
{
1152-
struct kvec *resv = &rqstp->rq_res.head[0];
1153-
1154-
/* tcp needs a space for the record length... */
1155-
svc_putnl(resv, 0);
1156-
}
1157-
11581147
/*
11591148
* Common routine for processing the RPC request.
11601149
*/
@@ -1182,10 +1171,6 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
11821171
set_bit(RQ_USEDEFERRAL, &rqstp->rq_flags);
11831172
clear_bit(RQ_DROPME, &rqstp->rq_flags);
11841173

1185-
/* Setup reply header */
1186-
if (rqstp->rq_prot == IPPROTO_TCP)
1187-
svc_tcp_prep_reply_hdr(rqstp);
1188-
11891174
svc_putu32(resv, rqstp->rq_xid);
11901175

11911176
vers = svc_getnl(argv);
@@ -1443,6 +1428,10 @@ svc_process(struct svc_rqst *rqstp)
14431428
goto out_drop;
14441429
}
14451430

1431+
/* Reserve space for the record marker */
1432+
if (rqstp->rq_prot == IPPROTO_TCP)
1433+
svc_putnl(resv, 0);
1434+
14461435
/* Returns 1 for send, 0 for drop */
14471436
if (likely(svc_process_common(rqstp, argv, resv)))
14481437
return svc_send(rqstp);

net/sunrpc/xprtrdma/svc_rdma_backchannel.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,6 @@ xprt_setup_rdma_bc(struct xprt_create *args)
304304
xprt->idle_timeout = RPCRDMA_IDLE_DISC_TO;
305305

306306
xprt->prot = XPRT_TRANSPORT_BC_RDMA;
307-
xprt->tsh_size = 0;
308307
xprt->ops = &xprt_rdma_bc_procs;
309308

310309
memcpy(&xprt->addr, args->dstaddr, args->addrlen);

net/sunrpc/xprtrdma/transport.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@ xprt_setup_rdma(struct xprt_create *args)
332332
xprt->idle_timeout = RPCRDMA_IDLE_DISC_TO;
333333

334334
xprt->resvport = 0; /* privileged port not needed */
335-
xprt->tsh_size = 0; /* RPC-RDMA handles framing */
336335
xprt->ops = &xprt_rdma_procs;
337336

338337
/*

net/sunrpc/xprtsock.c

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,40 @@ xs_stream_reset_connect(struct sock_xprt *transport)
696696

697697
#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
698698

699+
/* Common case:
700+
* - stream transport
701+
* - sending from byte 0 of the message
702+
* - the message is wholly contained in @xdr's head iovec
703+
*/
704+
static int xs_send_rm_and_kvec(struct socket *sock, struct xdr_buf *xdr,
705+
unsigned int remainder)
706+
{
707+
struct msghdr msg = {
708+
.msg_flags = XS_SENDMSG_FLAGS | (remainder ? MSG_MORE : 0)
709+
};
710+
rpc_fraghdr marker = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT |
711+
(u32)xdr->len);
712+
struct kvec iov[2] = {
713+
{
714+
.iov_base = &marker,
715+
.iov_len = sizeof(marker)
716+
},
717+
{
718+
.iov_base = xdr->head[0].iov_base,
719+
.iov_len = xdr->head[0].iov_len
720+
},
721+
};
722+
int ret;
723+
724+
ret = kernel_sendmsg(sock, &msg, iov, 2,
725+
iov[0].iov_len + iov[1].iov_len);
726+
if (ret < 0)
727+
return ret;
728+
if (ret < iov[0].iov_len)
729+
return -EPIPE;
730+
return ret - iov[0].iov_len;
731+
}
732+
699733
static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more)
700734
{
701735
struct msghdr msg = {
@@ -779,7 +813,11 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
779813
if (base < xdr->head[0].iov_len || addr != NULL) {
780814
unsigned int len = xdr->head[0].iov_len - base;
781815
remainder -= len;
782-
err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0], base, remainder != 0);
816+
if (!base && !addr)
817+
err = xs_send_rm_and_kvec(sock, xdr, remainder);
818+
else
819+
err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0],
820+
base, remainder != 0);
783821
if (remainder == 0 || err != len)
784822
goto out;
785823
*sent_p += err;
@@ -869,16 +907,6 @@ xs_send_request_was_aborted(struct sock_xprt *transport, struct rpc_rqst *req)
869907
return transport->xmit.offset != 0 && req->rq_bytes_sent == 0;
870908
}
871909

872-
/*
873-
* Construct a stream transport record marker in @buf.
874-
*/
875-
static inline void xs_encode_stream_record_marker(struct xdr_buf *buf)
876-
{
877-
u32 reclen = buf->len - sizeof(rpc_fraghdr);
878-
rpc_fraghdr *base = buf->head[0].iov_base;
879-
*base = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT | reclen);
880-
}
881-
882910
/**
883911
* xs_local_send_request - write an RPC request to an AF_LOCAL socket
884912
* @req: pointer to RPC request
@@ -905,8 +933,6 @@ static int xs_local_send_request(struct rpc_rqst *req)
905933
return -ENOTCONN;
906934
}
907935

908-
xs_encode_stream_record_marker(&req->rq_snd_buf);
909-
910936
xs_pktdump("packet data:",
911937
req->rq_svec->iov_base, req->rq_svec->iov_len);
912938

@@ -1057,8 +1083,6 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
10571083
return -ENOTCONN;
10581084
}
10591085

1060-
xs_encode_stream_record_marker(&req->rq_snd_buf);
1061-
10621086
xs_pktdump("packet data:",
10631087
req->rq_svec->iov_base,
10641088
req->rq_svec->iov_len);
@@ -2534,26 +2558,35 @@ static int bc_sendto(struct rpc_rqst *req)
25342558
{
25352559
int len;
25362560
struct xdr_buf *xbufp = &req->rq_snd_buf;
2537-
struct rpc_xprt *xprt = req->rq_xprt;
25382561
struct sock_xprt *transport =
2539-
container_of(xprt, struct sock_xprt, xprt);
2540-
struct socket *sock = transport->sock;
2562+
container_of(req->rq_xprt, struct sock_xprt, xprt);
25412563
unsigned long headoff;
25422564
unsigned long tailoff;
2565+
struct page *tailpage;
2566+
struct msghdr msg = {
2567+
.msg_flags = MSG_MORE
2568+
};
2569+
rpc_fraghdr marker = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT |
2570+
(u32)xbufp->len);
2571+
struct kvec iov = {
2572+
.iov_base = &marker,
2573+
.iov_len = sizeof(marker),
2574+
};
25432575

2544-
xs_encode_stream_record_marker(xbufp);
2576+
len = kernel_sendmsg(transport->sock, &msg, &iov, 1, iov.iov_len);
2577+
if (len != iov.iov_len)
2578+
return -EAGAIN;
25452579

2580+
tailpage = NULL;
2581+
if (xbufp->tail[0].iov_len)
2582+
tailpage = virt_to_page(xbufp->tail[0].iov_base);
25462583
tailoff = (unsigned long)xbufp->tail[0].iov_base & ~PAGE_MASK;
25472584
headoff = (unsigned long)xbufp->head[0].iov_base & ~PAGE_MASK;
2548-
len = svc_send_common(sock, xbufp,
2585+
len = svc_send_common(transport->sock, xbufp,
25492586
virt_to_page(xbufp->head[0].iov_base), headoff,
2550-
xbufp->tail[0].iov_base, tailoff);
2551-
2552-
if (len != xbufp->len) {
2553-
printk(KERN_NOTICE "Error sending entire callback!\n");
2554-
len = -EAGAIN;
2555-
}
2556-
2587+
tailpage, tailoff);
2588+
if (len != xbufp->len)
2589+
return -EAGAIN;
25572590
return len;
25582591
}
25592592

@@ -2793,7 +2826,6 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
27932826
transport = container_of(xprt, struct sock_xprt, xprt);
27942827

27952828
xprt->prot = 0;
2796-
xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
27972829
xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
27982830

27992831
xprt->bind_timeout = XS_BIND_TO;
@@ -2862,7 +2894,6 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)
28622894
transport = container_of(xprt, struct sock_xprt, xprt);
28632895

28642896
xprt->prot = IPPROTO_UDP;
2865-
xprt->tsh_size = 0;
28662897
/* XXX: header size can vary due to auth type, IPv6, etc. */
28672898
xprt->max_payload = (1U << 16) - (MAX_HEADER << 3);
28682899

@@ -2942,7 +2973,6 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
29422973
transport = container_of(xprt, struct sock_xprt, xprt);
29432974

29442975
xprt->prot = IPPROTO_TCP;
2945-
xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
29462976
xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
29472977

29482978
xprt->bind_timeout = XS_BIND_TO;
@@ -3015,7 +3045,6 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
30153045
transport = container_of(xprt, struct sock_xprt, xprt);
30163046

30173047
xprt->prot = IPPROTO_TCP;
3018-
xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
30193048
xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
30203049
xprt->timeout = &xs_tcp_default_timeout;
30213050

0 commit comments

Comments
 (0)