[PATCH 2/4] nvme: refactor command completion
Mike Snitzer
snitzer at redhat.com
Mon Aug 17 15:28:59 EDT 2020
On Mon, Aug 17 2020 at 4:15am -0400,
Christoph Hellwig <hch at lst.de> wrote:
> Lift all the code to decide the dispostition of a completed command
> from nvme_complete_rq and nvme_failover_req into a new helper, which
> returns an emum of the potential actions. nvme_complete_rq then
> just switches on those and calls the proper helper for the action.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 76 ++++++++++++++++++++++-------------
> drivers/nvme/host/multipath.c | 47 ++++++----------------
> drivers/nvme/host/nvme.h | 31 ++++++++++++--
> 3 files changed, 90 insertions(+), 64 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 88cff309d8e4f0..8d474adad721fb 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -241,17 +241,6 @@ static blk_status_t nvme_error_status(u16 status)
> }
> }
>
> -static inline bool nvme_req_needs_retry(struct request *req)
> -{
> - if (blk_noretry_request(req))
> - return false;
> - if (nvme_req(req)->status & NVME_SC_DNR)
> - return false;
> - if (nvme_req(req)->retries >= nvme_max_retries)
> - return false;
> - return true;
> -}
> -
> static void nvme_retry_req(struct request *req)
> {
> struct nvme_ns *ns = req->q->queuedata;
> @@ -268,34 +257,67 @@ static void nvme_retry_req(struct request *req)
> blk_mq_delay_kick_requeue_list(req->q, delay);
> }
>
> -void nvme_complete_rq(struct request *req)
> +enum nvme_disposition {
> + COMPLETE,
> + RETRY,
> + FAILOVER,
> +};
> +
> +static inline enum nvme_disposition nvme_decide_disposition(struct request *req)
> {
> - blk_status_t status = nvme_error_status(nvme_req(req)->status);
> + u16 status = nvme_req(req)->status & 0x7ff;
>
> - trace_nvme_complete_rq(req);
> + if (likely(status == 0))
> + return COMPLETE;
>
> - nvme_cleanup_cmd(req);
> + if (blk_noretry_request(req) || (status & NVME_SC_DNR) ||
> + nvme_req(req)->retries >= nvme_max_retries)
> + return COMPLETE;
Looking just a bit closer, the above DNR test seems wrong because of the
0x7ff mask applied. That mask drops access to NVME_SC_DNR right?
Mike
More information about the Linux-nvme
mailing list