* [PATCHv3 0/2] block, nvme: enable passthrough iostats
@ 2026-05-28 1:00 Keith Busch
2026-05-28 1:00 ` [PATCHv3 1/2] block: export passthrough stats enabled Keith Busch
2026-05-28 1:00 ` [PATCHv3 2/2] nvme: add support multipath passthrough iostats Keith Busch
0 siblings, 2 replies; 5+ messages in thread
From: Keith Busch @ 2026-05-28 1:00 UTC (permalink / raw)
To: linux-block, linux-nvme; +Cc: axboe, hch, Keith Busch
From: Keith Busch <kbusch@kernel.org>
v2->v3:
Added kerneldoc for the exported API
Added code comment for the passthrough safety
Added reviews.
Keith Busch (2):
block: export passthrough stats enabled
nvme: add support multipath passthrough iostats
block/blk-mq.c | 32 +---------------------------
drivers/nvme/host/ioctl.c | 9 ++++++++
drivers/nvme/host/multipath.c | 5 ++++-
include/linux/blk-mq.h | 40 +++++++++++++++++++++++++++++++++++
4 files changed, 54 insertions(+), 32 deletions(-)
--
2.53.0-Meta
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCHv3 1/2] block: export passthrough stats enabled
2026-05-28 1:00 [PATCHv3 0/2] block, nvme: enable passthrough iostats Keith Busch
@ 2026-05-28 1:00 ` Keith Busch
2026-05-28 8:29 ` Christoph Hellwig
2026-05-28 1:00 ` [PATCHv3 2/2] nvme: add support multipath passthrough iostats Keith Busch
1 sibling, 1 reply; 5+ messages in thread
From: Keith Busch @ 2026-05-28 1:00 UTC (permalink / raw)
To: linux-block, linux-nvme
Cc: axboe, hch, Keith Busch, Nilay Shroff, Nitesh Shetty
From: Keith Busch <kbusch@kernel.org>
A user can enable io accounting for passthrough requests, so export the
helper that checks if the request should be tracked. This will enable
stacking drivers to to report iostats for passthrough workloads. Since
the stacking request_queue may not be the one providing the request, the
API has to add a parameter for the caller to specify which one to check.
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
block/blk-mq.c | 32 +-------------------------------
include/linux/blk-mq.h | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/block/blk-mq.c b/block/blk-mq.c
index a24175441380e..8ab6fa59f8d54 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1088,43 +1088,13 @@ static inline void blk_account_io_done(struct request *req, u64 now)
}
}
-static inline bool blk_rq_passthrough_stats(struct request *req)
-{
- struct bio *bio = req->bio;
-
- if (!blk_queue_passthrough_stat(req->q))
- return false;
-
- /* Requests without a bio do not transfer data. */
- if (!bio)
- return false;
-
- /*
- * Stats are accumulated in the bdev, so must have one attached to a
- * bio to track stats. Most drivers do not set the bdev for passthrough
- * requests, but nvme is one that will set it.
- */
- if (!bio->bi_bdev)
- return false;
-
- /*
- * We don't know what a passthrough command does, but we know the
- * payload size and data direction. Ensuring the size is aligned to the
- * block size filters out most commands with payloads that don't
- * represent sector access.
- */
- if (blk_rq_bytes(req) & (bdev_logical_block_size(bio->bi_bdev) - 1))
- return false;
- return true;
-}
-
static inline void blk_account_io_start(struct request *req)
{
trace_block_io_start(req);
if (!blk_queue_io_stat(req->q))
return;
- if (blk_rq_is_passthrough(req) && !blk_rq_passthrough_stats(req))
+ if (blk_rq_is_passthrough(req) && !blk_rq_passthrough_stats(req, req->q))
return;
req->rq_flags |= RQF_IO_STAT;
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 24b4160aeaad3..af878597afb8c 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -1252,4 +1252,44 @@ static inline int blk_rq_map_sg(struct request *rq, struct scatterlist *sglist)
}
void blk_dump_rq_flags(struct request *, char *);
+/**
+ * blk_rq_passthrough_stats - check if this request should account stats
+ * @rq: request to check
+ * @q: the queue accumulating the stats
+ *
+ * Note, @q does not necessarily need to be the request_queue that provides
+ * @rq.
+ *
+ * Return: true if stats should be accounted.
+ */
+static inline bool blk_rq_passthrough_stats(struct request *rq,
+ struct request_queue *q)
+{
+ struct bio *bio = rq->bio;
+
+ if (!blk_queue_passthrough_stat(q))
+ return false;
+
+ /* Requests without a bio do not transfer data. */
+ if (!bio)
+ return false;
+
+ /*
+ * Stats are accumulated in the bdev, so must have one attached to a
+ * bio to track stats. Most drivers do not set the bdev for passthrough
+ * requests, but nvme is one that will set it.
+ */
+ if (!bio->bi_bdev)
+ return false;
+
+ /*
+ * We don't know what a passthrough command does, but we know the
+ * payload size and data direction. Ensuring the size is aligned to the
+ * block size filters out most commands with payloads that don't
+ * represent sector access.
+ */
+ if (blk_rq_bytes(rq) & (bdev_logical_block_size(bio->bi_bdev) - 1))
+ return false;
+ return true;
+}
#endif /* BLK_MQ_H */
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCHv3 2/2] nvme: add support multipath passthrough iostats
2026-05-28 1:00 [PATCHv3 0/2] block, nvme: enable passthrough iostats Keith Busch
2026-05-28 1:00 ` [PATCHv3 1/2] block: export passthrough stats enabled Keith Busch
@ 2026-05-28 1:00 ` Keith Busch
2026-05-28 8:29 ` Christoph Hellwig
1 sibling, 1 reply; 5+ messages in thread
From: Keith Busch @ 2026-05-28 1:00 UTC (permalink / raw)
To: linux-block, linux-nvme
Cc: axboe, hch, Keith Busch, Nilay Shroff, Nitesh Shetty
From: Keith Busch <kbusch@kernel.org>
Don't skip the io accounting for passthrough commands if the user
enabled tracking these.
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
---
drivers/nvme/host/ioctl.c | 9 +++++++++
drivers/nvme/host/multipath.c | 5 ++++-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c
index 08889b20e5d8c..664216eece4a6 100644
--- a/drivers/nvme/host/ioctl.c
+++ b/drivers/nvme/host/ioctl.c
@@ -102,8 +102,17 @@ static struct request *nvme_alloc_user_request(struct request_queue *q,
struct nvme_command *cmd, blk_opf_t rq_flags,
blk_mq_req_flags_t blk_flags)
{
+ struct nvme_ns *ns = q->queuedata;
struct request *req;
+ /*
+ * The NVME_MPATH flag is set only for IO commands sent to a namespace
+ * with a multipath enabled head. The request is not eligible for
+ * failover as passthrough requests also append REQ_FAILFAST_DRIVER.
+ */
+ if (ns && nvme_ns_head_multipath(ns->head))
+ rq_flags |= REQ_NVME_MPATH;
+
req = blk_mq_alloc_request(q, nvme_req_op(cmd) | rq_flags, blk_flags);
if (IS_ERR(req))
return req;
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index ff442bbf2937a..bca8e7c975190 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -175,9 +175,12 @@ void nvme_mpath_start_request(struct request *rq)
nvme_req(rq)->flags |= NVME_MPATH_CNT_ACTIVE;
}
- if (!blk_queue_io_stat(disk->queue) || blk_rq_is_passthrough(rq) ||
+ if (!blk_queue_io_stat(disk->queue) ||
(nvme_req(rq)->flags & NVME_MPATH_IO_STATS))
return;
+ if (blk_rq_is_passthrough(rq) &&
+ !blk_rq_passthrough_stats(rq, disk->queue))
+ return;
nvme_req(rq)->flags |= NVME_MPATH_IO_STATS;
nvme_req(rq)->start_time = bdev_start_io_acct(disk->part0, req_op(rq),
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCHv3 1/2] block: export passthrough stats enabled
2026-05-28 1:00 ` [PATCHv3 1/2] block: export passthrough stats enabled Keith Busch
@ 2026-05-28 8:29 ` Christoph Hellwig
0 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2026-05-28 8:29 UTC (permalink / raw)
To: Keith Busch
Cc: linux-block, linux-nvme, axboe, hch, Keith Busch, Nilay Shroff,
Nitesh Shetty
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCHv3 2/2] nvme: add support multipath passthrough iostats
2026-05-28 1:00 ` [PATCHv3 2/2] nvme: add support multipath passthrough iostats Keith Busch
@ 2026-05-28 8:29 ` Christoph Hellwig
0 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2026-05-28 8:29 UTC (permalink / raw)
To: Keith Busch
Cc: linux-block, linux-nvme, axboe, hch, Keith Busch, Nilay Shroff,
Nitesh Shetty
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-28 8:29 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-28 1:00 [PATCHv3 0/2] block, nvme: enable passthrough iostats Keith Busch
2026-05-28 1:00 ` [PATCHv3 1/2] block: export passthrough stats enabled Keith Busch
2026-05-28 8:29 ` Christoph Hellwig
2026-05-28 1:00 ` [PATCHv3 2/2] nvme: add support multipath passthrough iostats Keith Busch
2026-05-28 8:29 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox