diff options
author | Ursula Braun <ubraun@linux.vnet.ibm.com> | 2017-09-21 03:16:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-09-21 18:31:03 -0400 |
commit | 8c96feeeb39ba0b89c6121f71e8f7aa2a4d46671 (patch) | |
tree | cca710d1f7b98e04529f9181521eb6ed0c413e43 | |
parent | 18e537cd58e8d6932719bfa79cb96a1fbc639199 (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.c | 15 |
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 | ||
187 | again: | 187 | again: |
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) | |||
413 | int smc_close_shutdown_write(struct smc_sock *smc) | 413 | int 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 | ||
424 | again: | 425 | again: |
425 | old_state = sk->sk_state; | 426 | old_state = sk->sk_state; |