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>
This commit is contained in:
parent
5da7e4d355
commit
90cacb2ea6
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue