[PATCH] nvme-tcp: handle failing req immediately for REQ_FAILFAST_DRIVER

Daniel Wagner dwagner at suse.de
Thu Apr 7 02:25:40 PDT 2022


When nvme_tcp_try_send fails to send a request is usually defers the
error handling to upper layers but it ignores the REQ_FAILFAST_DRIVER
flag.

This can lead to very long shutdown delays when the users issues a
'nvme disconnect-all':

 [44888.710527] nvme nvme0: Removing ctrl: NQN "xxx"
 [44898.981684] nvme nvme0: failed to send request -32
 [44960.982977] nvme nvme0: queue 0: timeout request 0x18 type 4
 [44960.983099] nvme nvme0: Property Set error: 881, offset 0x14

At timestamp [44898.981684] nvme_tcp_try_send fails to send but we have
to wait for the timeout handler to expires at [44960.982977] before we
make any progress.

With honoring the REQ_FAILFAST_DRIVER flag the log looks like this:

 [ 8999.227495] nvme nvme1: Removing ctrl: NQN "xxx"
 [ 9016.680447] nvme nvme1: failed to send request -32
 [ 9016.680477] nvme nvme1: Property Set error: 880, offset 0x14

Signed-off-by: Daniel Wagner <dwagner at suse.de>
---
 drivers/nvme/host/tcp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 10fc45d95b86..f714d7ad38c0 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1145,9 +1145,11 @@ static int nvme_tcp_try_send(struct nvme_tcp_queue *queue)
 	if (ret == -EAGAIN) {
 		ret = 0;
 	} else if (ret < 0) {
+		struct request *rq = blk_mq_rq_from_pdu(queue->request);
 		dev_err(queue->ctrl->ctrl.device,
 			"failed to send request %d\n", ret);
-		if (ret != -EPIPE && ret != -ECONNRESET)
+		if ((ret != -EPIPE && ret != -ECONNRESET) ||
+		    rq->cmd_flags & REQ_FAILFAST_DRIVER)
 			nvme_tcp_fail_request(queue->request);
 		nvme_tcp_done_send_req(queue);
 	}
-- 
2.29.2




More information about the Linux-nvme mailing list