From: Mike Snitzer <snitzer@redhat.com> To: Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk> Cc: dm-devel@redhat.com, linux-block@vger.kernel.org, linux-nvme@lists.infradead.org Subject: nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Date: Thu, 15 Apr 2021 19:11:24 -0400 [thread overview] Message-ID: <20210415231126.8746-2-snitzer@redhat.com> (raw) In-Reply-To: <20210415231126.8746-1-snitzer@redhat.com> BZ: 1948690 Upstream Status: RHEL-only Signed-off-by: Mike Snitzer <snitzer@redhat.com> rhel-8.git commit f8fb6ea1226e2abc525c88da13b346118d548eea Author: Mike Snitzer <snitzer@redhat.com> Date: Tue Aug 25 21:52:46 2020 -0400 [nvme] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Message-id: <20200825215248.2291-9-snitzer@redhat.com> Patchwork-id: 325177 Patchwork-instance: patchwork O-Subject: [RHEL8.3 PATCH 08/10] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Bugzilla: 1843515 RH-Acked-by: David Milburn <dmilburn@redhat.com> RH-Acked-by: Gopal Tiwari <gtiwari@redhat.com> RH-Acked-by: Ewan Milne <emilne@redhat.com> BZ: 1843515 Upstream Status: RHEL-only If REQ_FAILFAST_TRANSPORT is set it means the driver should not retry IO that completed with transport errors. REQ_FAILFAST_TRANSPORT is set by multipathing software (e.g. dm-multipath) before it issues IO. Update NVMe to prepare for failover of requests marked with either REQ_NVME_MPATH or REQ_FAILFAST_TRANSPORT. This allows such requests to be given a disposition of FAILOVER. Introduce nvme_end_req_with_failover() for use in nvme_complete_rq() if REQ_NVME_MPATH isn't set. nvme_end_req_with_failover() ensures request is completed with a retryable IO error when appropriate. __nvme_end_req() was factored out for use by both nvme_end_req() and nvme_end_req_with_failover(). Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com> --- drivers/nvme/host/core.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) Index: linux-rhel9/drivers/nvme/host/core.c =================================================================== --- linux-rhel9.orig/drivers/nvme/host/core.c +++ linux-rhel9/drivers/nvme/host/core.c @@ -311,7 +311,7 @@ static inline enum nvme_disposition nvme nvme_req(req)->retries >= nvme_max_retries) return COMPLETE; - if (req->cmd_flags & REQ_NVME_MPATH) { + if (req->cmd_flags & (REQ_NVME_MPATH | REQ_FAILFAST_TRANSPORT)) { if (nvme_is_path_error(nvme_req(req)->status) || blk_queue_dying(req->q)) return FAILOVER; @@ -323,10 +323,8 @@ static inline enum nvme_disposition nvme return RETRY; } -static inline void nvme_end_req(struct request *req) +static inline void __nvme_end_req(struct request *req, blk_status_t status) { - blk_status_t status = nvme_error_status(nvme_req(req)->status); - if (IS_ENABLED(CONFIG_BLK_DEV_ZONED) && req_op(req) == REQ_OP_ZONE_APPEND) req->__sector = nvme_lba_to_sect(req->q->queuedata, @@ -336,6 +334,28 @@ static inline void nvme_end_req(struct r blk_mq_end_request(req, status); } +static inline void nvme_end_req(struct request *req) +{ + __nvme_end_req(req, nvme_error_status(nvme_req(req)->status)); +} + +static inline void nvme_end_req_with_failover(struct request *req) +{ + u16 nvme_status = nvme_req(req)->status; + blk_status_t status = nvme_error_status(nvme_status); + + if (unlikely(nvme_status & NVME_SC_DNR)) + goto out; + + if (!blk_path_error(status)) { + pr_debug("Request meant for failover but blk_status_t (errno=%d) was not retryable.\n", + blk_status_to_errno(status)); + status = BLK_STS_IOERR; + } +out: + __nvme_end_req(req, status); +} + void nvme_complete_rq(struct request *req) { trace_nvme_complete_rq(req); @@ -352,7 +372,10 @@ void nvme_complete_rq(struct request *re nvme_retry_req(req); return; case FAILOVER: - nvme_failover_req(req); + if (req->cmd_flags & REQ_NVME_MPATH) + nvme_failover_req(req); + else + nvme_end_req_with_failover(req); return; } }
WARNING: multiple messages have this Message-ID (diff)
From: Mike Snitzer <snitzer@redhat.com> To: Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk> Cc: linux-block@vger.kernel.org, dm-devel@redhat.com, linux-nvme@lists.infradead.org Subject: [dm-devel] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Date: Thu, 15 Apr 2021 19:11:24 -0400 [thread overview] Message-ID: <20210415231126.8746-2-snitzer@redhat.com> (raw) In-Reply-To: <20210415231126.8746-1-snitzer@redhat.com> BZ: 1948690 Upstream Status: RHEL-only Signed-off-by: Mike Snitzer <snitzer@redhat.com> rhel-8.git commit f8fb6ea1226e2abc525c88da13b346118d548eea Author: Mike Snitzer <snitzer@redhat.com> Date: Tue Aug 25 21:52:46 2020 -0400 [nvme] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Message-id: <20200825215248.2291-9-snitzer@redhat.com> Patchwork-id: 325177 Patchwork-instance: patchwork O-Subject: [RHEL8.3 PATCH 08/10] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Bugzilla: 1843515 RH-Acked-by: David Milburn <dmilburn@redhat.com> RH-Acked-by: Gopal Tiwari <gtiwari@redhat.com> RH-Acked-by: Ewan Milne <emilne@redhat.com> BZ: 1843515 Upstream Status: RHEL-only If REQ_FAILFAST_TRANSPORT is set it means the driver should not retry IO that completed with transport errors. REQ_FAILFAST_TRANSPORT is set by multipathing software (e.g. dm-multipath) before it issues IO. Update NVMe to prepare for failover of requests marked with either REQ_NVME_MPATH or REQ_FAILFAST_TRANSPORT. This allows such requests to be given a disposition of FAILOVER. Introduce nvme_end_req_with_failover() for use in nvme_complete_rq() if REQ_NVME_MPATH isn't set. nvme_end_req_with_failover() ensures request is completed with a retryable IO error when appropriate. __nvme_end_req() was factored out for use by both nvme_end_req() and nvme_end_req_with_failover(). Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com> --- drivers/nvme/host/core.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) Index: linux-rhel9/drivers/nvme/host/core.c =================================================================== --- linux-rhel9.orig/drivers/nvme/host/core.c +++ linux-rhel9/drivers/nvme/host/core.c @@ -311,7 +311,7 @@ static inline enum nvme_disposition nvme nvme_req(req)->retries >= nvme_max_retries) return COMPLETE; - if (req->cmd_flags & REQ_NVME_MPATH) { + if (req->cmd_flags & (REQ_NVME_MPATH | REQ_FAILFAST_TRANSPORT)) { if (nvme_is_path_error(nvme_req(req)->status) || blk_queue_dying(req->q)) return FAILOVER; @@ -323,10 +323,8 @@ static inline enum nvme_disposition nvme return RETRY; } -static inline void nvme_end_req(struct request *req) +static inline void __nvme_end_req(struct request *req, blk_status_t status) { - blk_status_t status = nvme_error_status(nvme_req(req)->status); - if (IS_ENABLED(CONFIG_BLK_DEV_ZONED) && req_op(req) == REQ_OP_ZONE_APPEND) req->__sector = nvme_lba_to_sect(req->q->queuedata, @@ -336,6 +334,28 @@ static inline void nvme_end_req(struct r blk_mq_end_request(req, status); } +static inline void nvme_end_req(struct request *req) +{ + __nvme_end_req(req, nvme_error_status(nvme_req(req)->status)); +} + +static inline void nvme_end_req_with_failover(struct request *req) +{ + u16 nvme_status = nvme_req(req)->status; + blk_status_t status = nvme_error_status(nvme_status); + + if (unlikely(nvme_status & NVME_SC_DNR)) + goto out; + + if (!blk_path_error(status)) { + pr_debug("Request meant for failover but blk_status_t (errno=%d) was not retryable.\n", + blk_status_to_errno(status)); + status = BLK_STS_IOERR; + } +out: + __nvme_end_req(req, status); +} + void nvme_complete_rq(struct request *req) { trace_nvme_complete_rq(req); @@ -352,7 +372,10 @@ void nvme_complete_rq(struct request *re nvme_retry_req(req); return; case FAILOVER: - nvme_failover_req(req); + if (req->cmd_flags & REQ_NVME_MPATH) + nvme_failover_req(req); + else + nvme_end_req_with_failover(req); return; } } -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2021-04-15 23:11 UTC|newest] Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-15 23:11 nvme: Return BLK_STS_TARGET if the DNR bit is set Mike Snitzer 2021-04-15 23:11 ` [dm-devel] " Mike Snitzer 2021-04-15 23:11 ` Mike Snitzer 2021-04-15 23:11 ` Mike Snitzer [this message] 2021-04-15 23:11 ` [dm-devel] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT Mike Snitzer 2021-04-15 23:11 ` nvme: decouple basic ANA log page re-read support from native multipathing Mike Snitzer 2021-04-15 23:11 ` [dm-devel] " Mike Snitzer 2021-04-15 23:11 ` nvme: allow retry for requests with REQ_FAILFAST_TRANSPORT set Mike Snitzer 2021-04-15 23:11 ` [dm-devel] " Mike Snitzer 2021-04-15 23:18 ` nvme: Return BLK_STS_TARGET if the DNR bit is set Mike Snitzer 2021-04-15 23:18 ` [dm-devel] " Mike Snitzer 2021-04-15 23:18 ` Mike Snitzer 2021-04-16 5:58 ` Hannes Reinecke 2021-04-16 5:58 ` [dm-devel] " Hannes Reinecke 2021-04-16 5:58 ` Hannes Reinecke
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210415231126.8746-2-snitzer@redhat.com \ --to=snitzer@redhat.com \ --cc=axboe@kernel.dk \ --cc=dm-devel@redhat.com \ --cc=hch@lst.de \ --cc=linux-block@vger.kernel.org \ --cc=linux-nvme@lists.infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.