Skip to content

Commit a3dfcea

Browse files
sowminivSomasundaram Krishnasamy
authored andcommitted
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 <[email protected]> Reviewed-by: Yuval Shaia <[email protected]> Orabug: 27364391 (cherry picked from commit 0d47de1) cherry-pick-repo=linux-uek.git Signed-off-by: Gerd Rausch <[email protected]> Signed-off-by: Somasundaram Krishnasamy <[email protected]>
1 parent 5fb4fb5 commit a3dfcea

File tree

5 files changed

+7
-2
lines changed

5 files changed

+7
-2
lines changed

net/rds/connection.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown)
491491
conn, &conn->c_laddr, &conn->c_faddr,
492492
conn->c_tos);
493493

494+
conn->c_destroy_in_prog = 1;
494495
/* Ensure conn will not be scheduled for reconnect */
495496
spin_lock_irq(&rds_conn_lock);
496497
hlist_del_init_rcu(&conn->c_hash_node);

net/rds/rds.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ struct rds_connection {
303303
__be32 c_faddr;
304304
unsigned int c_loopback:1,
305305
c_ping_triggered:1,
306-
c_pad_to_32:30;
306+
c_destroy_in_prog:1,
307+
c_pad_to_32:29;
307308
int c_npaths;
308309
struct rds_connection *c_passive;
309310
struct rds_transport *c_trans;

net/rds/tcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ void rds_tcp_listen_data_ready(struct sock *sk);
7171
int rds_tcp_accept_one(struct socket *sock);
7272
int rds_tcp_keepalive(struct socket *sock);
7373
void *rds_tcp_listen_sock_def_readable(struct net *net);
74+
void rds_tcp_set_linger(struct socket *sock);
7475

7576
/* tcp_recv.c */
7677
int rds_tcp_recv_init(void);

net/rds/tcp_connect.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
165165
cp->cp_conn, tc, sock);
166166

167167
if (sock) {
168+
if (cp->cp_conn->c_destroy_in_prog)
169+
rds_tcp_set_linger(sock);
168170
sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
169171
lock_sock(sock->sk);
170172
rds_tcp_restore_callbacks(sock, tc); /* tc->tc_sock = NULL */

net/rds/tcp_listen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn)
103103
return NULL;
104104
}
105105

106-
static void rds_tcp_set_linger(struct socket *sock)
106+
void rds_tcp_set_linger(struct socket *sock)
107107
{
108108
struct linger no_linger = {
109109
.l_onoff = 1,

0 commit comments

Comments
 (0)