forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									69b92b5b74
								
							
						
					
					
						commit
						c14b036681
					
				
					 5 changed files with 7 additions and 2 deletions
				
			
		|  | @ -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); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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 */ | ||||
|  |  | |||
|  | @ -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, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Sowmini Varadhan
						Sowmini Varadhan