aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUrsula Braun <ubraun@linux.vnet.ibm.com>2017-09-21 03:16:34 -0400
committerDavid S. Miller <davem@davemloft.net>2017-09-21 18:31:03 -0400
commit8c96feeeb39ba0b89c6121f71e8f7aa2a4d46671 (patch)
treecca710d1f7b98e04529f9181521eb6ed0c413e43
parent18e537cd58e8d6932719bfa79cb96a1fbc639199 (diff)
net/smc: no close wait in case of process shut down
Usually socket closing is delayed if there is still data available in the send buffer to be transmitted. If a process is killed, the delay should be avoided. Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/smc/smc_close.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c
index 5201bc103bd8..f0d16fb825f7 100644
--- a/net/smc/smc_close.c
+++ b/net/smc/smc_close.c
@@ -174,15 +174,15 @@ int smc_close_active(struct smc_sock *smc)
174{ 174{
175 struct smc_cdc_conn_state_flags *txflags = 175 struct smc_cdc_conn_state_flags *txflags =
176 &smc->conn.local_tx_ctrl.conn_state_flags; 176 &smc->conn.local_tx_ctrl.conn_state_flags;
177 long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT;
178 struct smc_connection *conn = &smc->conn; 177 struct smc_connection *conn = &smc->conn;
179 struct sock *sk = &smc->sk; 178 struct sock *sk = &smc->sk;
180 int old_state; 179 int old_state;
180 long timeout;
181 int rc = 0; 181 int rc = 0;
182 182
183 if (sock_flag(sk, SOCK_LINGER) && 183 timeout = current->flags & PF_EXITING ?
184 !(current->flags & PF_EXITING)) 184 0 : sock_flag(sk, SOCK_LINGER) ?
185 timeout = sk->sk_lingertime; 185 sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
186 186
187again: 187again:
188 old_state = sk->sk_state; 188 old_state = sk->sk_state;
@@ -413,13 +413,14 @@ void smc_close_sock_put_work(struct work_struct *work)
413int smc_close_shutdown_write(struct smc_sock *smc) 413int smc_close_shutdown_write(struct smc_sock *smc)
414{ 414{
415 struct smc_connection *conn = &smc->conn; 415 struct smc_connection *conn = &smc->conn;
416 long timeout = SMC_MAX_STREAM_WAIT_TIMEOUT;
417 struct sock *sk = &smc->sk; 416 struct sock *sk = &smc->sk;
418 int old_state; 417 int old_state;
418 long timeout;
419 int rc = 0; 419 int rc = 0;
420 420
421 if (sock_flag(sk, SOCK_LINGER)) 421 timeout = current->flags & PF_EXITING ?
422 timeout = sk->sk_lingertime; 422 0 : sock_flag(sk, SOCK_LINGER) ?
423 sk->sk_lingertime : SMC_MAX_STREAM_WAIT_TIMEOUT;
423 424
424again: 425again:
425 old_state = sk->sk_state; 426 old_state = sk->sk_state;