Skip to content

Commit

Permalink
rds: tcp: set linger to 1 when unloading a rds-tcp
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sowmini Varadhan authored and David S. Miller committed Jun 22, 2017
1 parent 69b92b5 commit c14b036
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 2 deletions.
1 change: 1 addition & 0 deletions net/rds/connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ void rds_conn_destroy(struct rds_connection *conn)
"%pI4\n", conn, &conn->c_laddr,
&conn->c_faddr);

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);
Expand Down
3 changes: 2 additions & 1 deletion net/rds/rds.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,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;
Expand Down
1 change: 1 addition & 0 deletions net/rds/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions net/rds/tcp_connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,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 */
Expand Down
2 changes: 1 addition & 1 deletion net/rds/tcp_listen.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,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,
Expand Down

0 comments on commit c14b036

Please sign in to comment.