]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: clean up blk_mq_in_flight_rw()
authorYu Kuai <yukuai3@huawei.com>
Tue, 6 May 2025 12:48:58 +0000 (20:48 +0800)
committerYu Kuai <yukuai3@huawei.com>
Sat, 10 May 2025 08:11:21 +0000 (16:11 +0800)
Also add comment for part_inflight_show() for the difference between
bio-based and rq-based device.

Link: https://lore.kernel.org/linux-raid/20250506124903.2540268-4-yukuai1@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
block/blk-mq.c
block/blk-mq.h
block/genhd.c

index 7d87e893999b18350335b83f0a4185d3df257697..0ceb28989aeedc5b9747d8168c47493ef691791d 100644 (file)
@@ -89,7 +89,7 @@ struct mq_inflight {
        unsigned int inflight[2];
 };
 
-static bool blk_mq_check_inflight(struct request *rq, void *priv)
+static bool blk_mq_check_in_driver(struct request *rq, void *priv)
 {
        struct mq_inflight *mi = priv;
 
@@ -101,14 +101,14 @@ static bool blk_mq_check_inflight(struct request *rq, void *priv)
        return true;
 }
 
-void blk_mq_in_flight_rw(struct request_queue *q, struct block_device *part,
-               unsigned int inflight[2])
+void blk_mq_in_driver_rw(struct block_device *part, unsigned int inflight[2])
 {
        struct mq_inflight mi = { .part = part };
 
-       blk_mq_queue_tag_busy_iter(q, blk_mq_check_inflight, &mi);
-       inflight[0] = mi.inflight[0];
-       inflight[1] = mi.inflight[1];
+       blk_mq_queue_tag_busy_iter(bdev_get_queue(part), blk_mq_check_in_driver,
+                                  &mi);
+       inflight[READ] = mi.inflight[READ];
+       inflight[WRITE] = mi.inflight[WRITE];
 }
 
 #ifdef CONFIG_LOCKDEP
index eeac0d47c878c6c0bfc2473baee70af8ed478e56..affb2e14b56e3aa71ed2d4a9c77c84496eb8e07e 100644 (file)
@@ -246,8 +246,7 @@ static inline bool blk_mq_hw_queue_mapped(struct blk_mq_hw_ctx *hctx)
        return hctx->nr_ctx && hctx->tags;
 }
 
-void blk_mq_in_flight_rw(struct request_queue *q, struct block_device *part,
-               unsigned int inflight[2]);
+void blk_mq_in_driver_rw(struct block_device *part, unsigned int inflight[2]);
 
 static inline void blk_mq_put_dispatch_budget(struct request_queue *q,
                                              int budget_token)
index 6d133061ea3d09444335deaa8af00bdddd9882c4..1c1a642b321e0d91199956cd8877f2a3d9a75ea5 100644 (file)
@@ -126,27 +126,32 @@ static void part_stat_read_all(struct block_device *part,
 }
 
 static void part_in_flight_rw(struct block_device *part,
-               unsigned int inflight[2])
+               unsigned int inflight[2], bool mq_driver)
 {
        int cpu;
 
-       inflight[0] = 0;
-       inflight[1] = 0;
-       for_each_possible_cpu(cpu) {
-               inflight[0] += part_stat_local_read_cpu(part, in_flight[0], cpu);
-               inflight[1] += part_stat_local_read_cpu(part, in_flight[1], cpu);
+       if (mq_driver) {
+               blk_mq_in_driver_rw(part, inflight);
+       } else {
+               for_each_possible_cpu(cpu) {
+                       inflight[READ] += part_stat_local_read_cpu(
+                                               part, in_flight[READ], cpu);
+                       inflight[WRITE] += part_stat_local_read_cpu(
+                                               part, in_flight[WRITE], cpu);
+               }
        }
-       if (WARN_ON_ONCE((int)inflight[0] < 0))
-               inflight[0] = 0;
-       if (WARN_ON_ONCE((int)inflight[1] < 0))
-               inflight[1] = 0;
+
+       if (WARN_ON_ONCE((int)inflight[READ] < 0))
+               inflight[READ] = 0;
+       if (WARN_ON_ONCE((int)inflight[WRITE] < 0))
+               inflight[WRITE] = 0;
 }
 
 unsigned int part_in_flight(struct block_device *part)
 {
-       unsigned int inflight[2];
+       unsigned int inflight[2] = {0};
 
-       part_in_flight_rw(part, inflight);
+       part_in_flight_rw(part, inflight, false);
 
        return inflight[READ] + inflight[WRITE];
 }
@@ -1084,19 +1089,21 @@ ssize_t part_stat_show(struct device *dev,
                (unsigned int)div_u64(stat.nsecs[STAT_FLUSH], NSEC_PER_MSEC));
 }
 
+/*
+ * Show the number of IOs issued to driver.
+ * For bio-based device, started from bdev_start_io_acct();
+ * For rq-based device, started from blk_mq_start_request();
+ */
 ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr,
                           char *buf)
 {
        struct block_device *bdev = dev_to_bdev(dev);
        struct request_queue *q = bdev_get_queue(bdev);
-       unsigned int inflight[2];
+       unsigned int inflight[2] = {0};
 
-       if (queue_is_mq(q))
-               blk_mq_in_flight_rw(q, bdev, inflight);
-       else
-               part_in_flight_rw(bdev, inflight);
+       part_in_flight_rw(bdev, inflight, queue_is_mq(q));
 
-       return sysfs_emit(buf, "%8u %8u\n", inflight[0], inflight[1]);
+       return sysfs_emit(buf, "%8u %8u\n", inflight[READ], inflight[WRITE]);
 }
 
 static ssize_t disk_capability_show(struct device *dev,