Re: [PATCH 6/6] nvme: return -ETIMEDOUT in nvme_submit_sync_cmd()
From: Keith Busch <kbusch@kernel.org>
Date: 2021-02-25 16:32:06
On Thu, Feb 25, 2021 at 11:55:27AM +0100, Hannes Reinecke wrote:
When a command times out we should be returning -ETIMEDOUT in nvme_submit_sync_cmd(), and not requiring the caller to guess whether a specific NVMe status should be interpreted as a timeout.
This driver has been using -EINTR for this condition since the beginning, though. Is there a reason I'm not seeing why these use cases can't use the existing command cancelled flag?
quoted hunk ↗ jump to hunk
Signed-off-by: Hannes Reinecke <hare@suse.de> --- drivers/nvme/host/core.c | 2 ++ drivers/nvme/host/fc.c | 1 + drivers/nvme/host/nvme.h | 1 + drivers/nvme/host/rdma.c | 1 + drivers/nvme/host/tcp.c | 1 + 5 files changed, 6 insertions(+)diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 624531a6b7c6..5c1ec3bfb9d3 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c@@ -1004,6 +1004,8 @@ int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd, *result = nvme_req(req)->result; if (nvme_req(req)->flags & NVME_REQ_CANCELLED) ret = -EINTR; + else if (nvme_req(req)->flags & NVME_REQ_TIMEOUT) + ret = -ETIMEDOUT; else ret = nvme_req(req)->status; out:diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 86395b66310d..bcc086fcbe61 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c@@ -2551,6 +2551,7 @@ nvme_fc_timeout(struct request *rq, bool reserved) "x%08x/x%08x\n", ctrl->cnum, op->queue->qnum, sqe->common.opcode, sqe->connect.fctype, sqe->common.cdw10, sqe->common.cdw11); + op->nreq.flags |= NVME_REQ_TIMEOUT; if (__nvme_fc_abort_op(ctrl, op)) nvme_fc_error_recovery(ctrl, "io timeout abort failed");diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 07b34175c6ce..02aa4ba665c0 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h@@ -173,6 +173,7 @@ struct nvme_request { enum { NVME_REQ_CANCELLED = (1 << 0), NVME_REQ_USERCMD = (1 << 1), + NVME_REQ_TIMEOUT = (1 << 2), }; static inline struct nvme_request *nvme_req(struct request *req)diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index 53ac4d7442ba..99ad2e10b295 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c@@ -1990,6 +1990,7 @@ static void nvme_rdma_complete_timed_out(struct request *rq) nvme_rdma_stop_queue(queue); if (blk_mq_request_started(rq) && !blk_mq_request_completed(rq)) { nvme_req(rq)->status = NVME_SC_HOST_ABORTED_CMD; + nvme_req(rq)->flags |= NVME_REQ_TIMEOUT; blk_mq_complete_request(rq); } }diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 69f59d2c5799..64aab742c84d 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c@@ -2189,6 +2189,7 @@ static void nvme_tcp_complete_timed_out(struct request *rq) nvme_tcp_stop_queue(ctrl, nvme_tcp_queue_id(req->queue)); if (blk_mq_request_started(rq) && !blk_mq_request_completed(rq)) { nvme_req(rq)->status = NVME_SC_HOST_ABORTED_CMD; + nvme_req(rq)->flags |= NVME_REQ_TIMEOUT; blk_mq_complete_request(rq); } }-- 2.29.2 _______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme
_______________________________________________ Linux-nvme mailing list Linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme