Skip to content

Commit c14b036

Browse files
sowminivdavem330
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. Signed-off-by: Sowmini Varadhan <[email protected]> Tested-by: Jenny Xu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 69b92b5 commit c14b036

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
@@ -412,6 +412,7 @@ void rds_conn_destroy(struct rds_connection *conn)
412412
"%pI4\n", conn, &conn->c_laddr,
413413
&conn->c_faddr);
414414

415+
conn->c_destroy_in_prog = 1;
415416
/* Ensure conn will not be scheduled for reconnect */
416417
spin_lock_irq(&rds_conn_lock);
417418
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
@@ -137,7 +137,8 @@ struct rds_connection {
137137
__be32 c_faddr;
138138
unsigned int c_loopback:1,
139139
c_ping_triggered:1,
140-
c_pad_to_32:30;
140+
c_destroy_in_prog:1,
141+
c_pad_to_32:29;
141142
int c_npaths;
142143
struct rds_connection *c_passive;
143144
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
@@ -170,6 +170,8 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
170170
cp->cp_conn, tc, sock);
171171

172172
if (sock) {
173+
if (cp->cp_conn->c_destroy_in_prog)
174+
rds_tcp_set_linger(sock);
173175
sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
174176
lock_sock(sock->sk);
175177
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
@@ -112,7 +112,7 @@ struct rds_tcp_connection *rds_tcp_accept_one_path(struct rds_connection *conn)
112112
return NULL;
113113
}
114114

115-
static void rds_tcp_set_linger(struct socket *sock)
115+
void rds_tcp_set_linger(struct socket *sock)
116116
{
117117
struct linger no_linger = {
118118
.l_onoff = 1,

0 commit comments

Comments
 (0)