SUNRPC: Refactor TCP socket timeout code into a helper function
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
d23bb11395
commit
8d1b8c62e0
|
@ -2235,6 +2235,31 @@ static void xs_tcp_shutdown(struct rpc_xprt *xprt)
|
||||||
xs_reset_transport(transport);
|
xs_reset_transport(transport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt,
|
||||||
|
struct socket *sock)
|
||||||
|
{
|
||||||
|
unsigned int keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ);
|
||||||
|
unsigned int keepcnt = xprt->timeout->to_retries + 1;
|
||||||
|
unsigned int opt_on = 1;
|
||||||
|
unsigned int timeo;
|
||||||
|
|
||||||
|
/* TCP Keepalive options */
|
||||||
|
kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
|
||||||
|
(char *)&opt_on, sizeof(opt_on));
|
||||||
|
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,
|
||||||
|
(char *)&keepidle, sizeof(keepidle));
|
||||||
|
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL,
|
||||||
|
(char *)&keepidle, sizeof(keepidle));
|
||||||
|
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT,
|
||||||
|
(char *)&keepcnt, sizeof(keepcnt));
|
||||||
|
|
||||||
|
/* TCP user timeout (see RFC5482) */
|
||||||
|
timeo = jiffies_to_msecs(xprt->timeout->to_initval) *
|
||||||
|
(xprt->timeout->to_retries + 1);
|
||||||
|
kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
|
||||||
|
(char *)&timeo, sizeof(timeo));
|
||||||
|
}
|
||||||
|
|
||||||
static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
||||||
{
|
{
|
||||||
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
|
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
|
||||||
|
@ -2242,22 +2267,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
||||||
|
|
||||||
if (!transport->inet) {
|
if (!transport->inet) {
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
unsigned int keepidle = xprt->timeout->to_initval / HZ;
|
|
||||||
unsigned int keepcnt = xprt->timeout->to_retries + 1;
|
|
||||||
unsigned int opt_on = 1;
|
|
||||||
unsigned int timeo;
|
|
||||||
unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;
|
unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;
|
||||||
|
|
||||||
/* TCP Keepalive options */
|
|
||||||
kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
|
|
||||||
(char *)&opt_on, sizeof(opt_on));
|
|
||||||
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,
|
|
||||||
(char *)&keepidle, sizeof(keepidle));
|
|
||||||
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL,
|
|
||||||
(char *)&keepidle, sizeof(keepidle));
|
|
||||||
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT,
|
|
||||||
(char *)&keepcnt, sizeof(keepcnt));
|
|
||||||
|
|
||||||
/* Avoid temporary address, they are bad for long-lived
|
/* Avoid temporary address, they are bad for long-lived
|
||||||
* connections such as NFS mounts.
|
* connections such as NFS mounts.
|
||||||
* RFC4941, section 3.6 suggests that:
|
* RFC4941, section 3.6 suggests that:
|
||||||
|
@ -2268,11 +2279,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
||||||
kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES,
|
kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES,
|
||||||
(char *)&addr_pref, sizeof(addr_pref));
|
(char *)&addr_pref, sizeof(addr_pref));
|
||||||
|
|
||||||
/* TCP user timeout (see RFC5482) */
|
xs_tcp_set_socket_timeouts(xprt, sock);
|
||||||
timeo = jiffies_to_msecs(xprt->timeout->to_initval) *
|
|
||||||
(xprt->timeout->to_retries + 1);
|
|
||||||
kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT,
|
|
||||||
(char *)&timeo, sizeof(timeo));
|
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
write_lock_bh(&sk->sk_callback_lock);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue