Commit c14b0366 authored by Sowmini Varadhan's avatar Sowmini Varadhan Committed by David S. Miller

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.
Signed-off-by: default avatarSowmini Varadhan <sowmini.varadhan@oracle.com>
Tested-by: default avatarJenny Xu <jenny.x.xu@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 69b92b5b
...@@ -412,6 +412,7 @@ void rds_conn_destroy(struct rds_connection *conn) ...@@ -412,6 +412,7 @@ void rds_conn_destroy(struct rds_connection *conn)
"%pI4\n", conn, &conn->c_laddr, "%pI4\n", conn, &conn->c_laddr,
&conn->c_faddr); &conn->c_faddr);
conn->c_destroy_in_prog = 1;
/* Ensure conn will not be scheduled for reconnect */ /* Ensure conn will not be scheduled for reconnect */
spin_lock_irq(&rds_conn_lock); spin_lock_irq(&rds_conn_lock);
hlist_del_init_rcu(&conn->c_hash_node); hlist_del_init_rcu(&conn->c_hash_node);
......
...@@ -137,7 +137,8 @@ struct rds_connection { ...@@ -137,7 +137,8 @@ struct rds_connection {
__be32 c_faddr; __be32 c_faddr;
unsigned int c_loopback:1, unsigned int c_loopback:1,
c_ping_triggered:1, c_ping_triggered:1,
c_pad_to_32:30; c_destroy_in_prog:1,
c_pad_to_32:29;
int c_npaths; int c_npaths;
struct rds_connection *c_passive; struct rds_connection *c_passive;
struct rds_transport *c_trans; struct rds_transport *c_trans;
......
...@@ -71,6 +71,7 @@ void rds_tcp_listen_data_ready(struct sock *sk); ...@@ -71,6 +71,7 @@ void rds_tcp_listen_data_ready(struct sock *sk);
int rds_tcp_accept_one(struct socket *sock); int rds_tcp_accept_one(struct socket *sock);
int rds_tcp_keepalive(struct socket *sock); int rds_tcp_keepalive(struct socket *sock);
void *rds_tcp_listen_sock_def_readable(struct net *net); void *rds_tcp_listen_sock_def_readable(struct net *net);
void rds_tcp_set_linger(struct socket *sock);
/* tcp_recv.c */ /* tcp_recv.c */
int rds_tcp_recv_init(void); int rds_tcp_recv_init(void);
......
...@@ -170,6 +170,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp) ...@@ -170,6 +170,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
cp->cp_conn, tc, sock); cp->cp_conn, tc, sock);
if (sock) { if (sock) {
if (cp->cp_conn->c_destroy_in_prog)
rds_tcp_set_linger(sock);
sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
lock_sock(sock->sk); lock_sock(sock->sk);
rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */ rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */
......
...@@ -112,7 +112,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn) ...@@ -112,7 +112,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn)
return NULL; return NULL;
} }
static void rds_tcp_set_linger(struct socket *sock) void rds_tcp_set_linger(struct socket *sock)
{ {
struct linger no_linger = { struct linger no_linger = {
.l_onoff = 1, .l_onoff = 1,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment