diff options
author | Ursula Braun <ubraun@linux.vnet.ibm.com> | 2017-04-10 14:57:59 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-04-11 23:01:14 -0400 |
commit | 90cacb2ea60c37b9a413a2d7dcb244c3d397c060 (patch) | |
tree | 89f9ba792ee7110c89dd5a61345d77a854bdce13 /net/smc | |
parent | 5da7e4d35507992da2af6c89434c33a69802de9c (diff) | |
download | linux-90cacb2ea60c37b9a413a2d7dcb244c3d397c060.tar.gz linux-90cacb2ea60c37b9a413a2d7dcb244c3d397c060.tar.bz2 linux-90cacb2ea60c37b9a413a2d7dcb244c3d397c060.zip |
net/smc: guarantee reset of write_blocked for heavy workload
If peer indicates write_blocked, the cursor state of the received data
should be send to the peer immediately (in smc_tx_consumer_update()).
Afterwards the write_blocked indicator is cleared.
If there is no free slot for another write request, sending is postponed
to worker smc_tx_work, and the write_blocked indicator is not cleared.
Therefore another clearing check is needed in smc_tx_work().
Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
Reviewed-by: Thomas Richter <tmricht@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/smc')
-rw-r--r-- | net/smc/smc_tx.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c index 69a0013dd25c..21ec1832ab51 100644 --- a/net/smc/smc_tx.c +++ b/net/smc/smc_tx.c @@ -431,9 +431,13 @@ static void smc_tx_work(struct work_struct *work) struct smc_connection, tx_work); struct smc_sock *smc = container_of(conn, struct smc_sock, conn); + int rc; lock_sock(&smc->sk); - smc_tx_sndbuf_nonempty(conn); + rc = smc_tx_sndbuf_nonempty(conn); + if (!rc && conn->local_rx_ctrl.prod_flags.write_blocked && + !atomic_read(&conn->bytes_to_rcv)) + conn->local_rx_ctrl.prod_flags.write_blocked = 0; release_sock(&smc->sk); } |