]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rds: tcp: set linger to 1 when unloading a rds-tcp
authorSowmini Varadhan <sowmini.varadhan@oracle.com>
Fri, 16 Jun 2017 12:45:49 +0000 (05:45 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 26 Jul 2017 03:53:26 +0000 (20:53 -0700)
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 <sowmini.varadhan@oracle.com>
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
net/rds/connection.c
net/rds/rds.h
net/rds/tcp.h
net/rds/tcp_connect.c
net/rds/tcp_listen.c

index c31758b907110fd17a286c08e7b445fa0f818269..55e87a01b4dad2ede031bcc57c665eef11b2f614 100644 (file)
@@ -491,6 +491,7 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown)
                conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr),
                conn->c_tos);
 
+       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);
index 18a8da1e6b71a0cd112742202ff8bfc98dfbb935..7d0fa7b032fe2b55e0265175710c30f7446da292 100644 (file)
@@ -302,7 +302,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;
index 8f24605d05f98904640351f2af7778d0f4f78635..0d3e655702fae2f8c3f806e7e30ae56d8360d421 100644 (file)
@@ -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);
index 17d8936b9d92257f8e15d8389686d4b2ad6e7bda..dc157a78b6ac57fc35c94a4dd5aa2a22dc5aa17a 100644 (file)
@@ -165,6 +165,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 */
index cc98a98c7bd65bb7ee378a211306fad6c38bff71..4864960db55ac71c3f2420125cc59e6cc48f9ff6 100644 (file)
@@ -103,7 +103,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,