From 0d47de1c1f24fad6064f5202e64b87a044c4fcb1 Mon Sep 17 00:00:00 2001 From: Sowmini Varadhan Date: Fri, 16 Jun 2017 05:45:49 -0700 Subject: [PATCH] rds: tcp: set linger to 1 when unloading a rds-tcp If we are unloading the rds_tcp module, we can set linger to 1 and drop pending packets to accelerate reconnect. The peer will end up resetting the connection based on new generation numbers of the new incarnation, so hanging on to unsent TCP packets via linger is mostly pointless in this case. Orabug: 26477841 Signed-off-by: Sowmini Varadhan Reviewed-by: Yuval Shaia --- net/rds/connection.c | 1 + net/rds/rds.h | 3 ++- net/rds/tcp.h | 1 + net/rds/tcp_connect.c | 2 ++ net/rds/tcp_listen.c | 2 +- 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/net/rds/connection.c b/net/rds/connection.c index c31758b90711..55e87a01b4da 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -491,6 +491,7 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown) conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); + conn->c_destroy_in_prog = 1; /* Ensure conn will not be scheduled for reconnect */ spin_lock_irq(&rds_conn_lock); hlist_del_init_rcu(&conn->c_hash_node); diff --git a/net/rds/rds.h b/net/rds/rds.h index 18a8da1e6b71..7d0fa7b032fe 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -302,7 +302,8 @@ struct rds_connection { __be32 c_faddr; unsigned int c_loopback:1, c_ping_triggered:1, - c_pad_to_32:30; + c_destroy_in_prog:1, + c_pad_to_32:29; int c_npaths; struct rds_connection *c_passive; struct rds_transport *c_trans; diff --git a/net/rds/tcp.h b/net/rds/tcp.h index 8f24605d05f9..0d3e655702fa 100644 --- a/net/rds/tcp.h +++ b/net/rds/tcp.h @@ -71,6 +71,7 @@ void rds_tcp_listen_data_ready(struct sock *sk); int rds_tcp_accept_one(struct socket *sock); int rds_tcp_keepalive(struct socket *sock); void *rds_tcp_listen_sock_def_readable(struct net *net); +void rds_tcp_set_linger(struct socket *sock); /* tcp_recv.c */ int rds_tcp_recv_init(void); diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index 17d8936b9d92..dc157a78b6ac 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -165,6 +165,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp) cp->cp_conn, tc, sock); if (sock) { + if (cp->cp_conn->c_destroy_in_prog) + rds_tcp_set_linger(sock); sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); lock_sock(sock->sk); rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */ diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c index cc98a98c7bd6..4864960db55a 100644 --- a/net/rds/tcp_listen.c +++ b/net/rds/tcp_listen.c @@ -103,7 +103,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn) return NULL; } -static void rds_tcp_set_linger(struct socket *sock) +void rds_tcp_set_linger(struct socket *sock) { struct linger no_linger = { .l_onoff = 1, -- 2.50.1