summaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2017-06-21 16:40:13 -0400
committerDavid S. Miller <davem@davemloft.net>2017-06-22 11:34:04 -0400
commitc14b0366813a8f6df7de181d8a333af7db6fb84e (patch)
tree25b75d4ca8004759f2da15b26f2cc5700e51becf /net/rds
parent69b92b5b7419846e2a0d61a097b11b17a089e046 (diff)
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: Sowmini Varadhan <sowmini.varadhan@oracle.com> Tested-by: Jenny Xu <jenny.x.xu@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/connection.c1
-rw-r--r--net/rds/rds.h3
-rw-r--r--net/rds/tcp.h1
-rw-r--r--net/rds/tcp_connect.c2
-rw-r--r--net/rds/tcp_listen.c2
5 files changed, 7 insertions, 2 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c
index 382443b060cb..50a3789ac23e 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -412,6 +412,7 @@ void rds_conn_destroy(struct rds_connection *conn)
412 "%pI4\n", conn, &conn->c_laddr, 412 "%pI4\n", conn, &conn->c_laddr,
413 &conn->c_faddr); 413 &conn->c_faddr);
414 414
415 conn->c_destroy_in_prog = 1;
415 /* Ensure conn will not be scheduled for reconnect */ 416 /* Ensure conn will not be scheduled for reconnect */
416 spin_lock_irq(&rds_conn_lock); 417 spin_lock_irq(&rds_conn_lock);
417 hlist_del_init_rcu(&conn->c_hash_node); 418 hlist_del_init_rcu(&conn->c_hash_node);
diff --git a/net/rds/rds.h b/net/rds/rds.h
index aa696b361e20..4a25db7075b1 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -137,7 +137,8 @@ struct rds_connection {
137 __be32 c_faddr; 137 __be32 c_faddr;
138 unsigned int c_loopback:1, 138 unsigned int c_loopback:1,
139 c_ping_triggered:1, 139 c_ping_triggered:1,
140 c_pad_to_32:30; 140 c_destroy_in_prog:1,
141 c_pad_to_32:29;
141 int c_npaths; 142 int c_npaths;
142 struct rds_connection *c_passive; 143 struct rds_connection *c_passive;
143 struct rds_transport *c_trans; 144 struct rds_transport *c_trans;
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index 56ea6620fcf9..f8800b7ce79c 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -71,6 +71,7 @@ void rds_tcp_listen_data_ready(struct sock *sk);
71int rds_tcp_accept_one(struct socket *sock); 71int rds_tcp_accept_one(struct socket *sock);
72int rds_tcp_keepalive(struct socket *sock); 72int rds_tcp_keepalive(struct socket *sock);
73void *rds_tcp_listen_sock_def_readable(struct net *net); 73void *rds_tcp_listen_sock_def_readable(struct net *net);
74void rds_tcp_set_linger(struct socket *sock);
74 75
75/* tcp_recv.c */ 76/* tcp_recv.c */
76int rds_tcp_recv_init(void); 77int rds_tcp_recv_init(void);
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c
index 5a62a083bb5a..cbe08a1fa4c7 100644
--- a/net/rds/tcp_connect.c
+++ b/net/rds/tcp_connect.c
@@ -170,6 +170,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
170 cp->cp_conn, tc, sock); 170 cp->cp_conn, tc, sock);
171 171
172 if (sock) { 172 if (sock) {
173 if (cp->cp_conn->c_destroy_in_prog)
174 rds_tcp_set_linger(sock);
173 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); 175 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
174 lock_sock(sock->sk); 176 lock_sock(sock->sk);
175 rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */ 177 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 6089e9a8e00a..c6dc8caaf5ca 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -112,7 +112,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn)
112 return NULL; 112 return NULL;
113} 113}
114 114
115static void rds_tcp_set_linger(struct socket *sock) 115void rds_tcp_set_linger(struct socket *sock)
116{ 116{
117 struct linger no_linger = { 117 struct linger no_linger = {
118 .l_onoff = 1, 118 .l_onoff = 1,