Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] RPC: rationalize set_buffer_size

In fact, ->set_buffer_size should be completely functionless for non-UDP.

Test-plan:
Check socket buffer size on UDP sockets over time.

Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

authored by

Chuck Lever and committed by
Trond Myklebust
470056c2 03bf4b70

+19 -25
+2 -2
include/linux/sunrpc/xprt.h
··· 100 100 #define rq_slen rq_snd_buf.len 101 101 102 102 struct rpc_xprt_ops { 103 - void (*set_buffer_size)(struct rpc_xprt *xprt); 103 + void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); 104 104 int (*reserve_xprt)(struct rpc_task *task); 105 105 void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); 106 106 void (*connect)(struct rpc_task *task); ··· 124 124 unsigned long cong; /* current congestion */ 125 125 unsigned long cwnd; /* congestion window */ 126 126 127 - unsigned int rcvsize, /* transport rcv buffer size */ 127 + size_t rcvsize, /* transport rcv buffer size */ 128 128 sndsize; /* transport send buffer size */ 129 129 130 130 size_t max_payload; /* largest RPC payload size,
+2 -8
net/sunrpc/clnt.c
··· 517 517 rpc_setbufsize(struct rpc_clnt *clnt, unsigned int sndsize, unsigned int rcvsize) 518 518 { 519 519 struct rpc_xprt *xprt = clnt->cl_xprt; 520 - 521 - xprt->sndsize = 0; 522 - if (sndsize) 523 - xprt->sndsize = sndsize + RPC_SLACK_SPACE; 524 - xprt->rcvsize = 0; 525 - if (rcvsize) 526 - xprt->rcvsize = rcvsize + RPC_SLACK_SPACE; 527 - xprt->ops->set_buffer_size(xprt); 520 + if (xprt->ops->set_buffer_size) 521 + xprt->ops->set_buffer_size(xprt, sndsize, rcvsize); 528 522 } 529 523 530 524 /*
+15 -15
net/sunrpc/xprtsock.c
··· 865 865 read_unlock(&sk->sk_callback_lock); 866 866 } 867 867 868 - /** 869 - * xs_udp_set_buffer_size - set send and receive limits 870 - * @xprt: generic transport 871 - * 872 - * Set socket send and receive limits based on the 873 - * sndsize and rcvsize fields in the generic transport 874 - * structure. 875 - */ 876 - static void xs_udp_set_buffer_size(struct rpc_xprt *xprt) 868 + static void xs_udp_do_set_buffer_size(struct rpc_xprt *xprt) 877 869 { 878 870 struct sock *sk = xprt->inet; 879 871 ··· 881 889 } 882 890 883 891 /** 884 - * xs_tcp_set_buffer_size - set send and receive limits 892 + * xs_udp_set_buffer_size - set send and receive limits 885 893 * @xprt: generic transport 894 + * @sndsize: requested size of send buffer, in bytes 895 + * @rcvsize: requested size of receive buffer, in bytes 886 896 * 887 - * Nothing to do for TCP. 897 + * Set socket send and receive buffer size limits. 888 898 */ 889 - static void xs_tcp_set_buffer_size(struct rpc_xprt *xprt) 899 + static void xs_udp_set_buffer_size(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize) 890 900 { 891 - return; 901 + xprt->sndsize = 0; 902 + if (sndsize) 903 + xprt->sndsize = sndsize + 1024; 904 + xprt->rcvsize = 0; 905 + if (rcvsize) 906 + xprt->rcvsize = rcvsize + 1024; 907 + 908 + xs_udp_do_set_buffer_size(xprt); 892 909 } 893 910 894 911 /** ··· 990 989 991 990 write_unlock_bh(&sk->sk_callback_lock); 992 991 } 993 - xs_udp_set_buffer_size(xprt); 992 + xs_udp_do_set_buffer_size(xprt); 994 993 status = 0; 995 994 out: 996 995 xprt_wake_pending_tasks(xprt, status); ··· 1159 1158 }; 1160 1159 1161 1160 static struct rpc_xprt_ops xs_tcp_ops = { 1162 - .set_buffer_size = xs_tcp_set_buffer_size, 1163 1161 .reserve_xprt = xprt_reserve_xprt, 1164 1162 .release_xprt = xprt_release_xprt, 1165 1163 .connect = xs_connect,