Thread (19 messages) 19 messages, 4 authors, 2021-01-15

Re: [PATCH 3/3] nvme: add parameter command_retry to enable retry

From: Minwoo Im <hidden>
Date: 2021-01-12 11:28:33

Hello,

On 21-01-12 17:34:48, Chao Leng wrote:

On 2021/1/11 20:27, Minwoo Im wrote:
quoted
Hello,

On 21-01-11 11:47:56, Chao Leng wrote:
quoted

On 2021/1/8 22:46, Minwoo Im wrote:
quoted
nvme_init_request() has set REQ_FAILFAST_DRIVER to make requests
non-retryable.  This command flag value is checked in
nvme_decide_disposition() to decide whether to RETRY or other
operations.  In that point, blk_noretry_request() macro will be used to
check if command flags have one of REQ_FAILFAST_*.  If so, it just
decides to complete the request without retrying.

This patch added a module parameter named command_retry to turn on the
command retry feature in this driver.  If turning it on,
REQ3_FAILFAST_DRIVER will not be set to requests so that retry can be
reached out to nvme_retry_req() based on the module parameter.

Signed-off-by: Minwoo Im <redacted>
---
   drivers/nvme/host/core.c | 7 ++++++-
   1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 6e428fdc25a8..e1836ca9956f 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -44,6 +44,10 @@ static unsigned char shutdown_timeout = 5;
   module_param(shutdown_timeout, byte, 0644);
   MODULE_PARM_DESC(shutdown_timeout, "timeout in seconds for controller shutdown");
+static bool command_retry;
+module_param(command_retry, bool, 0644);
+MODULE_PARM_DESC(command_retry, "retry commands up to nvme_max_retries");
+
   static u8 nvme_max_retries = 5;
   module_param_named(max_retries, nvme_max_retries, byte, 0644);
   MODULE_PARM_DESC(max_retries, "max number of retries a command may have");
@@ -560,7 +564,8 @@ static inline void nvme_init_request(struct request *req,
   	else /* no queuedata implies admin queue */
   		req->timeout = NVME_ADMIN_TIMEOUT;
-	req->cmd_flags |= REQ_FAILFAST_DRIVER;
+	if (!command_retry)
+		req->cmd_flags |= REQ_FAILFAST_DRIVER;
In abnormal scenarios, such as request time out, connection process may takes long time or the admin command waits for long time.
Retry only for non-host errors may be a better choice. Maybe we can make some optimizations in nvme_decide_disposition.
Thanks for your review!

Oh, I agreed that it might wait for so long time in connecting process.
Restricting some of commands that should be retried would be better as
you mentiond.

Do you mean that maybe we can check this module parameter in
nvme_decide_disposition()?  Like, even if blk_noretry_request(req) says
that it's non-retriable, if this module parameter is enabled, then we
can retry rather than failfast?
No, I mean that add the local preferential retry which defined in the NVMe protocol.
Thanks for your suggestion, Chao.  I think this is much better idea than
module parameter.  Fixing the nvme_decide_disposition() would be better!
I think it's going to be also an answer for Christoph's question on this
patch.  Please let me prepare next pach series.

Thanks,

_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help