Message ID | 20211123082515.65956-3-tonylu@linux.alibaba.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 606a63c9783a32a45bd2ef0eee393711d75b3284 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Fixes for closing process and minor cleanup | expand |
On 23/11/2021 09:25, Tony Lu wrote: > The side that actively closed socket, it's clcsock doesn't enter > TIME_WAIT state, but the passive side does it. It should show the same > behavior as TCP sockets. > > Consider this, when client actively closes the socket, the clcsock in > server enters TIME_WAIT state, which means the address is occupied and > won't be reused before TIME_WAIT dismissing. If we restarted server, the > service would be unavailable for a long time. > > To solve this issue, shutdown the clcsock in [A], perform the TCP active > close progress first, before the passive closed side closing it. So that > the actively closed side enters TIME_WAIT, not the passive one. > Thank you, I will pick this up for our next submission to the net tree.
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index 9b235fbb089a..3715d2f5ad55 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c @@ -228,6 +228,12 @@ int smc_close_active(struct smc_sock *smc) /* send close request */ rc = smc_close_final(conn); sk->sk_state = SMC_PEERCLOSEWAIT1; + + /* actively shutdown clcsock before peer close it, + * prevent peer from entering TIME_WAIT state. + */ + if (smc->clcsock && smc->clcsock->sk) + rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR); } else { /* peer event has changed the state */ goto again;