summaryrefslogtreecommitdiffstats
path: root/net/smc
diff options
context:
space:
mode:
authorKarsten Graul <kgraul@linux.ibm.com>2019-01-30 18:51:03 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-12-05 09:21:08 +0100
commitaa69ab5882afa15762197f011bed3a6f6000dfb1 (patch)
tree87577da23b3423720bfedfc67f43345331f376cc /net/smc
parentf8e7423f5e182d60a0350c455195af5ff63f67cb (diff)
downloadlinux-stable-aa69ab5882afa15762197f011bed3a6f6000dfb1.tar.gz
linux-stable-aa69ab5882afa15762197f011bed3a6f6000dfb1.tar.bz2
linux-stable-aa69ab5882afa15762197f011bed3a6f6000dfb1.zip
net/smc: don't wait for send buffer space when data was already sent
[ Upstream commit 6889b36da78a21a312d8b462c1fa25a03c2ff192 ] When there is no more send buffer space and at least 1 byte was already sent then return to user space. The wait is only done when no data was sent by the sendmsg() call. This fixes smc_tx_sendmsg() which tried to always send all user data and started to wait for free send buffer space when needed. During this wait the user space program was blocked in the sendmsg() call and hence not able to receive incoming data. When both sides were in such a situation then the connection stalled forever. Signed-off-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net/smc')
-rw-r--r--net/smc/smc_tx.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c
index 28361aef9982..f1f621675db0 100644
--- a/net/smc/smc_tx.c
+++ b/net/smc/smc_tx.c
@@ -163,12 +163,11 @@ int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len)
conn->local_tx_ctrl.prod_flags.urg_data_pending = 1;
if (!atomic_read(&conn->sndbuf_space) || conn->urg_tx_pend) {
+ if (send_done)
+ return send_done;
rc = smc_tx_wait(smc, msg->msg_flags);
- if (rc) {
- if (send_done)
- return send_done;
+ if (rc)
goto out_err;
- }
continue;
}