[PATCH] nvme-multipath: fix io accounting on failover

John Meneghini jmeneghi at redhat.com
Tue May 21 11:35:44 PDT 2024


Awesome. I've noticed that there is an iostat bug lurking someplace during my many days of io policy testing these last two 
weeks. I'll add this patch to my test build and let you know if it fixes the problem!

/John

On 5/21/24 14:07, Keith Busch wrote:> From: Keith Busch <kbusch at kernel.org>
> 
> There are io stats accounting that needs to be handled, so don't call
> blk_mq_end_request() directly. Use the existing nvme_end_req() helper
> that already handles everything.
> 
> Fixes: d4d957b53d91ee ("nvme-multipath: support io stats on the mpath device")
> Signed-off-by: Keith Busch <kbusch at kernel.org>
> ---
>   drivers/nvme/host/core.c      | 2 +-
>   drivers/nvme/host/multipath.c | 3 ++-
>   drivers/nvme/host/nvme.h      | 1 +
>   3 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 79cdd34dfa18e..7706df2373494 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -422,7 +422,7 @@ static inline void __nvme_end_req(struct request *req)
>   		nvme_mpath_end_request(req);
>   }
>   
> -static inline void nvme_end_req(struct request *req)
> +void nvme_end_req(struct request *req)
>   {
>   	blk_status_t status = nvme_error_status(nvme_req(req)->status);
>   
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index 9c1e135b8df3b..1bee176fd850e 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -118,7 +118,8 @@ void nvme_failover_req(struct request *req)
>   	blk_steal_bios(&ns->head->requeue_list, req);
>   	spin_unlock_irqrestore(&ns->head->requeue_lock, flags);
>   
> -	blk_mq_end_request(req, 0);
> +	nvme_req(req)->status = 0;
> +	nvme_end_req(req);
>   	kblockd_schedule_work(&ns->head->requeue_work);
>   }
>   
> diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
> index cacc56f4bbf44..fc31bd340a63a 100644
> --- a/drivers/nvme/host/nvme.h
> +++ b/drivers/nvme/host/nvme.h
> @@ -767,6 +767,7 @@ static inline bool nvme_state_terminal(struct nvme_ctrl *ctrl)
>   	}
>   }
>   
> +void nvme_end_req(struct request *req);
>   void nvme_complete_rq(struct request *req);
>   void nvme_complete_batch_req(struct request *req);
>   




More information about the Linux-nvme mailing list