Commit f42d4796 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Christoph Hellwig
Browse files

nvme-tcp: fix I/O stalls on congested sockets



When the socket is busy processing nvme_tcp_try_recv() might return
-EAGAIN, but this doesn't automatically imply that the sending side is
blocked, too.  So check if there are pending requests once
nvme_tcp_try_recv() returns -EAGAIN and continue with the sending loop
to avoid I/O stalls.

Signed-off-by: default avatarHannes Reinecke <hare@kernel.org>
Acked-by: default avatarChris Leech <cleech@redhat.com>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 0bf04c87
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -1361,7 +1361,7 @@ static int nvme_tcp_try_recv(struct nvme_tcp_queue *queue)
	queue->nr_cqe = 0;
	consumed = sock->ops->read_sock(sk, &rd_desc, nvme_tcp_recv_skb);
	release_sock(sk);
	return consumed;
	return consumed == -EAGAIN ? 0 : consumed;
}

static void nvme_tcp_io_work(struct work_struct *w)
@@ -1389,6 +1389,11 @@ static void nvme_tcp_io_work(struct work_struct *w)
		else if (unlikely(result < 0))
			return;

		/* did we get some space after spending time in recv? */
		if (nvme_tcp_queue_has_pending(queue) &&
		    sk_stream_is_writeable(queue->sock->sk))
			pending = true;

		if (!pending || !queue->rd_enabled)
			return;