Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25fe6142 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Add a sysctl to control the duration of the socket linger timeout

parent 7d1e8255
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ unsigned int xprt_min_resvport = RPC_DEF_MIN_RESVPORT;
unsigned int xprt_max_resvport = RPC_DEF_MAX_RESVPORT;
unsigned int xprt_max_resvport = RPC_DEF_MAX_RESVPORT;


#define XS_TCP_LINGER_TO	(15U * HZ)
#define XS_TCP_LINGER_TO	(15U * HZ)
static unsigned int xs_tcp_fin_timeout __read_mostly = XS_TCP_LINGER_TO;


/*
/*
 * We can register our own files under /proc/sys/sunrpc by
 * We can register our own files under /proc/sys/sunrpc by
@@ -118,6 +119,14 @@ static ctl_table xs_tunables_table[] = {
		.extra1		= &xprt_min_resvport_limit,
		.extra1		= &xprt_min_resvport_limit,
		.extra2		= &xprt_max_resvport_limit
		.extra2		= &xprt_max_resvport_limit
	},
	},
	{
		.procname	= "tcp_fin_timeout",
		.data		= &xs_tcp_fin_timeout,
		.maxlen		= sizeof(xs_tcp_fin_timeout),
		.mode		= 0644,
		.proc_handler	= &proc_dointvec_jiffies,
		.strategy	= sysctl_jiffies
	},
	{
	{
		.ctl_name = 0,
		.ctl_name = 0,
	},
	},
@@ -1222,7 +1231,7 @@ static void xs_tcp_state_change(struct sock *sk)
		clear_bit(XPRT_CONNECTED, &xprt->state);
		clear_bit(XPRT_CONNECTED, &xprt->state);
		clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
		clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
		smp_mb__after_clear_bit();
		smp_mb__after_clear_bit();
		xs_tcp_schedule_linger_timeout(xprt, XS_TCP_LINGER_TO);
		xs_tcp_schedule_linger_timeout(xprt, xs_tcp_fin_timeout);
		break;
		break;
	case TCP_CLOSE_WAIT:
	case TCP_CLOSE_WAIT:
		/* The server initiated a shutdown of the socket */
		/* The server initiated a shutdown of the socket */
@@ -1239,7 +1248,7 @@ static void xs_tcp_state_change(struct sock *sk)
		break;
		break;
	case TCP_LAST_ACK:
	case TCP_LAST_ACK:
		set_bit(XPRT_CLOSING, &xprt->state);
		set_bit(XPRT_CLOSING, &xprt->state);
		xs_tcp_schedule_linger_timeout(xprt, XS_TCP_LINGER_TO);
		xs_tcp_schedule_linger_timeout(xprt, xs_tcp_fin_timeout);
		smp_mb__before_clear_bit();
		smp_mb__before_clear_bit();
		clear_bit(XPRT_CONNECTED, &xprt->state);
		clear_bit(XPRT_CONNECTED, &xprt->state);
		smp_mb__after_clear_bit();
		smp_mb__after_clear_bit();