public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure
@ 2025-03-11 10:43 Shin'ichiro Kawasaki
  2025-03-11 10:43 ` [PATCH v2 1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req() Shin'ichiro Kawasaki
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Shin'ichiro Kawasaki @ 2025-03-11 10:43 UTC (permalink / raw)
  To: linux-block, linux-nvme, Jens Axboe, Keith Busch,
	Christoph Hellwig, Sagi Grimberg, Alan Adamson
  Cc: virtualization, asahi, linux-arm-kernel, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig, Shin'ichiro Kawasaki

Commit 1f47ed294a2b ("block: cleanup and fix batch completion adding
conditions") in the kernel tag v6.14-rc3 triggered blktests nvme/039
failure [1].

The test case injects errors to the NVMe driver and confirms the errors
are logged. The first half of the test checks it for non-passthrough
requests, and the second half checks for passthrough requests. The
commit made both halves fail.

This series addresses the test case failure. The first patch covers the
passthrough requests, and the second patch covers the non-passthrough
requests.

[1] https://lkml.kernel.org/linux-block/y7m5kyk5r2eboyfsfprdvhmoo27ur46pz3r2kwb4puhxjhbvt6@zgh4dg3ewya3/

Changes from v1:
* 1st patch: Added Reviewed-by tags
* 2nd patch: Replaced argument blk_status_t with boolean 'is_error'
             Added kerneldoc of blk_mq_add_to_batch() arguments

Shin'ichiro Kawasaki (2):
  nvme: move error logging from nvme_end_req() to __nvme_end_req()
  block: change blk_mq_add_to_batch() third argument type to bool

 drivers/block/null_blk/main.c |  4 ++--
 drivers/block/virtio_blk.c    |  5 +++--
 drivers/nvme/host/apple.c     |  3 ++-
 drivers/nvme/host/core.c      | 12 ++++++------
 drivers/nvme/host/pci.c       |  5 +++--
 include/linux/blk-mq.h        | 11 ++++++++---
 6 files changed, 24 insertions(+), 16 deletions(-)

-- 
2.47.0



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req()
  2025-03-11 10:43 [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Shin'ichiro Kawasaki
@ 2025-03-11 10:43 ` Shin'ichiro Kawasaki
  2025-03-11 10:43 ` [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool Shin'ichiro Kawasaki
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Shin'ichiro Kawasaki @ 2025-03-11 10:43 UTC (permalink / raw)
  To: linux-block, linux-nvme, Jens Axboe, Keith Busch,
	Christoph Hellwig, Sagi Grimberg, Alan Adamson
  Cc: virtualization, asahi, linux-arm-kernel, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig, Shin'ichiro Kawasaki

Before the Commit 1f47ed294a2b ("block: cleanup and fix batch completion
adding conditions"), blk_mq_add_to_batch() did not add failed
passthrough requests to batch, and returned false. After the commit,
blk_mq_add_to_batch() always adds passthrough requests to batch
regardless of whether the request failed or not, and returns true. This
affected error logging feature in the NVME driver.

Before the commit, the call chain of failed passthrough request was as
follows:

nvme_handle_cqe()
 blk_mq_add_to_batch() .. false is returned, then call nvme_pci_complete_rq()
 nvme_pci_complete_rq()
  nvme_complete_rq()
   nvme_end_req()
    nvme_log_err_passthru() .. error logging
    __nvme_end_req()        .. end of the rqeuest

After the commit, the call chain is as follows:

nvme_handle_cqe()
 blk_mq_add_to_batch() .. true is returned, then set nvme_pci_complete_batch()
 ..
 nvme_pci_complete_batch()
  nvme_complete_batch()
   nvme_complete_batch_req()
    __nvme_end_req() .. end of the request, without error logging

To make the error logging feature work again for passthrough requests, move the
nvme_log_err_passthru() call from nvme_end_req() to __nvme_end_req().

While at it, move nvme_log_error() call for non-passthrough requests together
with nvme_log_err_passthru(). Even though the trigger commit does not affect
non-passthrough requests, move it together for code simplicity.

Fixes: 1f47ed294a2b ("block: cleanup and fix batch completion adding conditions")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
 drivers/nvme/host/core.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f028913e2e62..8359d0aa0e44 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -431,6 +431,12 @@ static inline void nvme_end_req_zoned(struct request *req)
 
 static inline void __nvme_end_req(struct request *req)
 {
+	if (unlikely(nvme_req(req)->status && !(req->rq_flags & RQF_QUIET))) {
+		if (blk_rq_is_passthrough(req))
+			nvme_log_err_passthru(req);
+		else
+			nvme_log_error(req);
+	}
 	nvme_end_req_zoned(req);
 	nvme_trace_bio_complete(req);
 	if (req->cmd_flags & REQ_NVME_MPATH)
@@ -441,12 +447,6 @@ void nvme_end_req(struct request *req)
 {
 	blk_status_t status = nvme_error_status(nvme_req(req)->status);
 
-	if (unlikely(nvme_req(req)->status && !(req->rq_flags & RQF_QUIET))) {
-		if (blk_rq_is_passthrough(req))
-			nvme_log_err_passthru(req);
-		else
-			nvme_log_error(req);
-	}
 	__nvme_end_req(req);
 	blk_mq_end_request(req, status);
 }
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool
  2025-03-11 10:43 [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Shin'ichiro Kawasaki
  2025-03-11 10:43 ` [PATCH v2 1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req() Shin'ichiro Kawasaki
@ 2025-03-11 10:43 ` Shin'ichiro Kawasaki
  2025-03-12  5:59   ` Christoph Hellwig
  2025-03-11 13:49 ` [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Jens Axboe
  2025-03-11 13:50 ` Jens Axboe
  3 siblings, 1 reply; 7+ messages in thread
From: Shin'ichiro Kawasaki @ 2025-03-11 10:43 UTC (permalink / raw)
  To: linux-block, linux-nvme, Jens Axboe, Keith Busch,
	Christoph Hellwig, Sagi Grimberg, Alan Adamson
  Cc: virtualization, asahi, linux-arm-kernel, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig, Shin'ichiro Kawasaki

Commit 1f47ed294a2b ("block: cleanup and fix batch completion adding
conditions") modified the evaluation criteria for the third argument,
'ioerror', in the blk_mq_add_to_batch() function. Initially, the
function had checked if 'ioerror' equals zero. Following the commit, it
started checking for negative error values, with the presumption that
such values, for instance -EIO, would be passed in.

However, blk_mq_add_to_batch() callers do not pass negative error
values. Instead, they pass status codes defined in various ways:

- NVMe PCI and Apple drivers pass NVMe status code
- virtio_blk driver passes the virtblk request header status byte
- null_blk driver passes blk_status_t

These codes are either zero or positive, therefore the revised check
fails to function as intended. Specifically, with the NVMe PCI driver,
this modification led to the failure of the blktests test case nvme/039.
In this test scenario, errors are artificially injected to the NVMe
driver, resulting in positive NVMe status codes passed to
blk_mq_add_to_batch(), which unexpectedly processes the failed I/O in a
batch. Hence the failure.

To correct the ioerror check within blk_mq_add_to_batch(), make all
callers to uniformly pass the argument as boolean. Modify the callers to
check their specific status codes and pass the boolean value 'is_error'.
Also describe the arguments of blK_mq_add_to_batch as kerneldoc.

Fixes: 1f47ed294a2b ("block: cleanup and fix batch completion adding conditions")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
---
 drivers/block/null_blk/main.c |  4 ++--
 drivers/block/virtio_blk.c    |  5 +++--
 drivers/nvme/host/apple.c     |  3 ++-
 drivers/nvme/host/pci.c       |  5 +++--
 include/linux/blk-mq.h        | 11 ++++++++---
 5 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c
index d94ef37480bd..fdc7a0b2af10 100644
--- a/drivers/block/null_blk/main.c
+++ b/drivers/block/null_blk/main.c
@@ -1549,8 +1549,8 @@ static int null_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
 		cmd = blk_mq_rq_to_pdu(req);
 		cmd->error = null_process_cmd(cmd, req_op(req), blk_rq_pos(req),
 						blk_rq_sectors(req));
-		if (!blk_mq_add_to_batch(req, iob, (__force int) cmd->error,
-					blk_mq_end_request_batch))
+		if (!blk_mq_add_to_batch(req, iob, cmd->error != BLK_STS_OK,
+					 blk_mq_end_request_batch))
 			blk_mq_end_request(req, cmd->error);
 		nr++;
 	}
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 6a61ec35f426..91cde76a4b3e 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -1207,11 +1207,12 @@ static int virtblk_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
 
 	while ((vbr = virtqueue_get_buf(vq->vq, &len)) != NULL) {
 		struct request *req = blk_mq_rq_from_pdu(vbr);
+		u8 status = virtblk_vbr_status(vbr);
 
 		found++;
 		if (!blk_mq_complete_request_remote(req) &&
-		    !blk_mq_add_to_batch(req, iob, virtblk_vbr_status(vbr),
-						virtblk_complete_batch))
+		    !blk_mq_add_to_batch(req, iob, status != VIRTIO_BLK_S_OK,
+					 virtblk_complete_batch))
 			virtblk_request_done(req);
 	}
 
diff --git a/drivers/nvme/host/apple.c b/drivers/nvme/host/apple.c
index a060f69558e7..8971aca41e63 100644
--- a/drivers/nvme/host/apple.c
+++ b/drivers/nvme/host/apple.c
@@ -599,7 +599,8 @@ static inline void apple_nvme_handle_cqe(struct apple_nvme_queue *q,
 	}
 
 	if (!nvme_try_complete_req(req, cqe->status, cqe->result) &&
-	    !blk_mq_add_to_batch(req, iob, nvme_req(req)->status,
+	    !blk_mq_add_to_batch(req, iob,
+				 nvme_req(req)->status != NVME_SC_SUCCESS,
 				 apple_nvme_complete_batch))
 		apple_nvme_complete_rq(req);
 }
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 640590b21728..75de86e235ad 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1130,8 +1130,9 @@ static inline void nvme_handle_cqe(struct nvme_queue *nvmeq,
 
 	trace_nvme_sq(req, cqe->sq_head, nvmeq->sq_tail);
 	if (!nvme_try_complete_req(req, cqe->status, cqe->result) &&
-	    !blk_mq_add_to_batch(req, iob, nvme_req(req)->status,
-					nvme_pci_complete_batch))
+	    !blk_mq_add_to_batch(req, iob,
+				 nvme_req(req)->status != NVME_SC_SUCCESS,
+				 nvme_pci_complete_batch))
 		nvme_pci_complete_rq(req);
 }
 
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 71f4f0cc3dac..d904e870e72d 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -855,9 +855,14 @@ static inline bool blk_mq_is_reserved_rq(struct request *rq)
 /*
  * Batched completions only work when there is no I/O error and no special
  * ->end_io handler.
+ *
+ * @req: The request to add to batch
+ * @iob: The batch to add the request
+ * @is_error: Specify true if the request failed with an error
+ * @io_comp_batch: The completaion handler for the request
  */
 static inline bool blk_mq_add_to_batch(struct request *req,
-				       struct io_comp_batch *iob, int ioerror,
+				       struct io_comp_batch *iob, bool is_error,
 				       void (*complete)(struct io_comp_batch *))
 {
 	/*
@@ -865,7 +870,7 @@ static inline bool blk_mq_add_to_batch(struct request *req,
 	 * 1) No batch container
 	 * 2) Has scheduler data attached
 	 * 3) Not a passthrough request and end_io set
-	 * 4) Not a passthrough request and an ioerror
+	 * 4) Not a passthrough request and failed with an error
 	 */
 	if (!iob)
 		return false;
@@ -874,7 +879,7 @@ static inline bool blk_mq_add_to_batch(struct request *req,
 	if (!blk_rq_is_passthrough(req)) {
 		if (req->end_io)
 			return false;
-		if (ioerror < 0)
+		if (is_error)
 			return false;
 	}
 
-- 
2.47.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure
  2025-03-11 10:43 [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Shin'ichiro Kawasaki
  2025-03-11 10:43 ` [PATCH v2 1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req() Shin'ichiro Kawasaki
  2025-03-11 10:43 ` [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool Shin'ichiro Kawasaki
@ 2025-03-11 13:49 ` Jens Axboe
  2025-03-11 13:50 ` Jens Axboe
  3 siblings, 0 replies; 7+ messages in thread
From: Jens Axboe @ 2025-03-11 13:49 UTC (permalink / raw)
  To: Shin'ichiro Kawasaki, linux-block, linux-nvme, Keith Busch,
	Christoph Hellwig, Sagi Grimberg, Alan Adamson
  Cc: virtualization, asahi, linux-arm-kernel, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig

On 3/11/25 4:43 AM, Shin'ichiro Kawasaki wrote:
> Commit 1f47ed294a2b ("block: cleanup and fix batch completion adding
> conditions") in the kernel tag v6.14-rc3 triggered blktests nvme/039
> failure [1].
> 
> The test case injects errors to the NVMe driver and confirms the errors
> are logged. The first half of the test checks it for non-passthrough
> requests, and the second half checks for passthrough requests. The
> commit made both halves fail.
> 
> This series addresses the test case failure. The first patch covers the
> passthrough requests, and the second patch covers the non-passthrough
> requests.

Looks good to me, and better than the quick fix-up for the problem.
Thanks for taking the time to do it right!

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure
  2025-03-11 10:43 [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Shin'ichiro Kawasaki
                   ` (2 preceding siblings ...)
  2025-03-11 13:49 ` [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Jens Axboe
@ 2025-03-11 13:50 ` Jens Axboe
  3 siblings, 0 replies; 7+ messages in thread
From: Jens Axboe @ 2025-03-11 13:50 UTC (permalink / raw)
  To: linux-block, linux-nvme, Keith Busch, Christoph Hellwig,
	Sagi Grimberg, Alan Adamson, Shin'ichiro Kawasaki
  Cc: virtualization, asahi, linux-arm-kernel, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig


On Tue, 11 Mar 2025 19:43:57 +0900, Shin'ichiro Kawasaki wrote:
> Commit 1f47ed294a2b ("block: cleanup and fix batch completion adding
> conditions") in the kernel tag v6.14-rc3 triggered blktests nvme/039
> failure [1].
> 
> The test case injects errors to the NVMe driver and confirms the errors
> are logged. The first half of the test checks it for non-passthrough
> requests, and the second half checks for passthrough requests. The
> commit made both halves fail.
> 
> [...]

Applied, thanks!

[1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req()
      commit: e5c2bcc0cd47321d78bb4e865d7857304139f95d
[2/2] block: change blk_mq_add_to_batch() third argument type to bool
      commit: f00baf2eac785bba837e5ed79d489f16520e7a6d

Best regards,
-- 
Jens Axboe





^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool
  2025-03-11 10:43 ` [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool Shin'ichiro Kawasaki
@ 2025-03-12  5:59   ` Christoph Hellwig
  2025-03-12  7:20     ` Shinichiro Kawasaki
  0 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2025-03-12  5:59 UTC (permalink / raw)
  To: Shin'ichiro Kawasaki
  Cc: linux-block, linux-nvme, Jens Axboe, Keith Busch,
	Christoph Hellwig, Sagi Grimberg, Alan Adamson, virtualization,
	asahi, linux-arm-kernel, Hannes Reinecke, Michael S . Tsirkin,
	Jason Wang, Xuan Zhuo, Eugenio Pérez, Paolo Bonzini,
	Stefan Hajnoczi, Sven Peter, Janne Grunau, Alyssa Rosenzweig

On Tue, Mar 11, 2025 at 07:43:59PM +0900, Shin'ichiro Kawasaki wrote:
>  /*
>   * Batched completions only work when there is no I/O error and no special
>   * ->end_io handler.
> + *
> + * @req: The request to add to batch
> + * @iob: The batch to add the request
> + * @is_error: Specify true if the request failed with an error
> + * @io_comp_batch: The completaion handler for the request
>   */

This needs more work to be a proper kerneldoc comment, i.e. start with
"/*8", mention the function name, etc.

The logic changes themselves look good.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool
  2025-03-12  5:59   ` Christoph Hellwig
@ 2025-03-12  7:20     ` Shinichiro Kawasaki
  0 siblings, 0 replies; 7+ messages in thread
From: Shinichiro Kawasaki @ 2025-03-12  7:20 UTC (permalink / raw)
  To: hch@infradead.org
  Cc: linux-block@vger.kernel.org, linux-nvme@lists.infradead.org,
	Jens Axboe, Keith Busch, Sagi Grimberg, Alan Adamson,
	virtualization@lists.linux.dev, asahi@lists.linux.dev,
	linux-arm-kernel@lists.infradead.org, Hannes Reinecke,
	Michael S . Tsirkin, Jason Wang, Xuan Zhuo, Eugenio Pérez,
	Paolo Bonzini, Stefan Hajnoczi, Sven Peter, Janne Grunau,
	Alyssa Rosenzweig

On Mar 11, 2025 / 22:59, Christoph Hellwig wrote:
> On Tue, Mar 11, 2025 at 07:43:59PM +0900, Shin'ichiro Kawasaki wrote:
> >  /*
> >   * Batched completions only work when there is no I/O error and no special
> >   * ->end_io handler.
> > + *
> > + * @req: The request to add to batch
> > + * @iob: The batch to add the request
> > + * @is_error: Specify true if the request failed with an error
> > + * @io_comp_batch: The completaion handler for the request
> >   */
> 
> This needs more work to be a proper kerneldoc comment, i.e. start with
> "/*8", mention the function name, etc.

Ah, thanks. I should have checked the kerneldoc format. Jens already queued up
this patch (thanks!), so I will send out a separate, follow-up patch to fix the
kerneldoc comment. The follow-up patch will be posted to linux-block list, with
reduced To/Cc members.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-03-12  7:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-11 10:43 [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Shin'ichiro Kawasaki
2025-03-11 10:43 ` [PATCH v2 1/2] nvme: move error logging from nvme_end_req() to __nvme_end_req() Shin'ichiro Kawasaki
2025-03-11 10:43 ` [PATCH v2 2/2] block: change blk_mq_add_to_batch() third argument type to bool Shin'ichiro Kawasaki
2025-03-12  5:59   ` Christoph Hellwig
2025-03-12  7:20     ` Shinichiro Kawasaki
2025-03-11 13:49 ` [PATCH v2 0/2] block: nvme: fix blktests nvme/039 failure Jens Axboe
2025-03-11 13:50 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox