[PATCH V3 3/3] nvme: retry commands based on ACRE flag
Minwoo Im
minwoo.im.dev at gmail.com
Thu Jan 14 08:31:10 EST 2021
Allow nvme_decide_disposition() to retry commands with error by checking
Advanced Command Retry Enable (ACRE) flag of controller first than
REQ_FAILFAST_* cmd_flags. But, we just can't allow all command failures
to be retried due to reasons like connecting may take too long due to
the retries. This patch only allows non-host path error commands to be
retried.
Cc: Chao Leng <lengchao at huawei.com>
Cc: Sagi Grimberg <sagi at grimberg.me>
Cc: Keith Busch <kbusch at kernel.org>
Signed-off-by: Minwoo Im <minwoo.im.dev at gmail.com>
---
drivers/nvme/host/core.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index a286e3422c61..e4f7c49c2f39 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -303,8 +303,7 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req)
if (likely(nvme_req(req)->status == 0))
return COMPLETE;
- if (blk_noretry_request(req) ||
- (nvme_req(req)->status & NVME_SC_DNR) ||
+ if ((nvme_req(req)->status & NVME_SC_DNR) ||
nvme_req(req)->retries >= nvme_max_retries)
return COMPLETE;
@@ -317,6 +316,13 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req)
return COMPLETE;
}
+ if (nvme_req(req)->ctrl->acre &&
+ !nvme_is_path_error(nvme_req(req)->status) &&
+ !blk_queue_dying(req->q))
+ return RETRY;
+ else if (blk_noretry_request(req))
+ return COMPLETE;
+
return RETRY;
}
--
2.17.1
More information about the Linux-nvme
mailing list