diff mbox series

[2/2] block: remove blk_mq_in_flight() and blk_mq_in_flight_rw()

Message ID 20240323035959.1397382-3-yukuai1@huaweicloud.com (mailing list archive)
State New, archived
Headers show
Series block: support to account io_ticks precisely | expand

Commit Message

Yu Kuai March 23, 2024, 3:59 a.m. UTC
From: Yu Kuai <yukuai3@huawei.com>

Now that blk-mq also use per_cpu counter to trace inflight as bio-based
device, they can be replaced by part_in_flight() and part_in_flight_rw()
directly.

Noted that there will be a change that inflight will be accounted from
blk_account_io_start() instead of blk_mq_start_request(). This also fix
an inconsistence for rq-based device that if there are rq allocated but
not started, io_ticks will be updated from blk_account_io_start() but not
from part_stat_show() or diskstats_show(). For consequence, for example:

blk_account_io_start  -> 0s
-> something is wrong with driver, rq can't be dispatched to driver
-> finially the driver recovers
blk_mq_start_request  -> 10s

Then in this case, if user is using "iostat 1", then user will found
that 'util' is 0 from 0s-9s, because diskstats_show() doesn't update
io_ticks, then in 9s-10s user will found 'util' is 1000%.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
 block/blk-mq.c | 32 --------------------------------
 block/blk-mq.h |  5 -----
 block/genhd.c  | 18 +++---------------
 3 files changed, 3 insertions(+), 52 deletions(-)

Comments

Mike Snitzer March 23, 2024, 4:05 p.m. UTC | #1
On Fri, Mar 22 2024 at 11:59P -0400,
Yu Kuai <yukuai1@huaweicloud.com> wrote:

> From: Yu Kuai <yukuai3@huawei.com>
> 
> Now that blk-mq also use per_cpu counter to trace inflight as bio-based
> device, they can be replaced by part_in_flight() and part_in_flight_rw()
> directly.

Please reference the commit that enabled this, e.g.:

With commit XXXXX ("commit subject") blk-mq was updated to use per_cpu
counters to track inflight IO same as bio-based devices, so replace
blk_mq_in_flight* with part_in_flight() and part_in_flight_rw()
accordingly.

(I'm not seeing the commit in question, but I only took a quick look).

Mike
Yu Kuai March 24, 2024, 2:11 a.m. UTC | #2
Hi,

在 2024/03/24 0:05, Mike Snitzer 写道:
> On Fri, Mar 22 2024 at 11:59P -0400,
> Yu Kuai <yukuai1@huaweicloud.com> wrote:
> 
>> From: Yu Kuai <yukuai3@huawei.com>
>>
>> Now that blk-mq also use per_cpu counter to trace inflight as bio-based
>> device, they can be replaced by part_in_flight() and part_in_flight_rw()
>> directly.
> 
> Please reference the commit that enabled this, e.g.:
> 
> With commit XXXXX ("commit subject") blk-mq was updated to use per_cpu
> counters to track inflight IO same as bio-based devices, so replace
> blk_mq_in_flight* with part_in_flight() and part_in_flight_rw()
> accordingly.

Patch 1 in this set do this, so there is no commit xxx yet.

Thanks,
Kuai

> 
> (I'm not seeing the commit in question, but I only took a quick look).
> 
> Mike
> .
>
Mike Snitzer March 24, 2024, 9:57 p.m. UTC | #3
On Sat, Mar 23 2024 at 10:11P -0400,
Yu Kuai <yukuai1@huaweicloud.com> wrote:

> Hi,
> 
> 在 2024/03/24 0:05, Mike Snitzer 写道:
> > On Fri, Mar 22 2024 at 11:59P -0400,
> > Yu Kuai <yukuai1@huaweicloud.com> wrote:
> > 
> > > From: Yu Kuai <yukuai3@huawei.com>
> > > 
> > > Now that blk-mq also use per_cpu counter to trace inflight as bio-based
> > > device, they can be replaced by part_in_flight() and part_in_flight_rw()
> > > directly.
> > 
> > Please reference the commit that enabled this, e.g.:
> > 
> > With commit XXXXX ("commit subject") blk-mq was updated to use per_cpu
> > counters to track inflight IO same as bio-based devices, so replace
> > blk_mq_in_flight* with part_in_flight() and part_in_flight_rw()
> > accordingly.
> 
> Patch 1 in this set do this, so there is no commit xxx yet.
> 
> Thanks,
> Kuai

Would've helped if I looked at 1/2, but please say:

With the previous commit blk-mq was updated to use per_cpu ...
Yu Kuai March 25, 2024, 1:15 a.m. UTC | #4
Hi,

在 2024/03/25 5:57, Mike Snitzer 写道:
> On Sat, Mar 23 2024 at 10:11P -0400,
> Yu Kuai <yukuai1@huaweicloud.com> wrote:
> 
>> Hi,
>>
>> 在 2024/03/24 0:05, Mike Snitzer 写道:
>>> On Fri, Mar 22 2024 at 11:59P -0400,
>>> Yu Kuai <yukuai1@huaweicloud.com> wrote:
>>>
>>>> From: Yu Kuai <yukuai3@huawei.com>
>>>>
>>>> Now that blk-mq also use per_cpu counter to trace inflight as bio-based
>>>> device, they can be replaced by part_in_flight() and part_in_flight_rw()
>>>> directly.
>>>
>>> Please reference the commit that enabled this, e.g.:
>>>
>>> With commit XXXXX ("commit subject") blk-mq was updated to use per_cpu
>>> counters to track inflight IO same as bio-based devices, so replace
>>> blk_mq_in_flight* with part_in_flight() and part_in_flight_rw()
>>> accordingly.
>>
>> Patch 1 in this set do this, so there is no commit xxx yet.
>>
>> Thanks,
>> Kuai
> 
> Would've helped if I looked at 1/2, but please say:
> 
> With the previous commit blk-mq was updated to use per_cpu ...

OK, will pay attention to it later. :)

Thanks,
Kuai

> .
>
diff mbox series

Patch

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 82045f0ab5ba..dfbb4e24f04a 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -87,38 +87,6 @@  struct mq_inflight {
 	unsigned int inflight[2];
 };
 
-static bool blk_mq_check_inflight(struct request *rq, void *priv)
-{
-	struct mq_inflight *mi = priv;
-
-	if (rq->part && blk_do_io_stat(rq) &&
-	    (!mi->part->bd_partno || rq->part == mi->part) &&
-	    blk_mq_rq_state(rq) == MQ_RQ_IN_FLIGHT)
-		mi->inflight[rq_data_dir(rq)]++;
-
-	return true;
-}
-
-unsigned int blk_mq_in_flight(struct request_queue *q,
-		struct block_device *part)
-{
-	struct mq_inflight mi = { .part = part };
-
-	blk_mq_queue_tag_busy_iter(q, blk_mq_check_inflight, &mi);
-
-	return mi.inflight[0] + mi.inflight[1];
-}
-
-void blk_mq_in_flight_rw(struct request_queue *q, 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];
-}
-
 void blk_freeze_queue_start(struct request_queue *q)
 {
 	mutex_lock(&q->mq_freeze_lock);
diff --git a/block/blk-mq.h b/block/blk-mq.h
index f75a9ecfebde..aa92e1317f18 100644
--- a/block/blk-mq.h
+++ b/block/blk-mq.h
@@ -236,11 +236,6 @@  static inline bool blk_mq_hw_queue_mapped(struct blk_mq_hw_ctx *hctx)
 	return hctx->nr_ctx && hctx->tags;
 }
 
-unsigned int blk_mq_in_flight(struct request_queue *q,
-		struct block_device *part);
-void blk_mq_in_flight_rw(struct request_queue *q, struct block_device *part,
-		unsigned int inflight[2]);
-
 static inline void blk_mq_put_dispatch_budget(struct request_queue *q,
 					      int budget_token)
 {
diff --git a/block/genhd.c b/block/genhd.c
index 782a42718965..9c64d34b7dc3 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -954,15 +954,10 @@  ssize_t part_stat_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);
 	struct disk_stats stat;
 	unsigned int inflight;
 
-	if (queue_is_mq(q))
-		inflight = blk_mq_in_flight(q, bdev);
-	else
-		inflight = part_in_flight(bdev);
-
+	inflight = part_in_flight(bdev);
 	if (inflight) {
 		part_stat_lock();
 		update_io_ticks(bdev, jiffies, true);
@@ -1003,13 +998,9 @@  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];
 
-	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);
 
 	return sprintf(buf, "%8u %8u\n", inflight[0], inflight[1]);
 }
@@ -1251,11 +1242,8 @@  static int diskstats_show(struct seq_file *seqf, void *v)
 	xa_for_each(&gp->part_tbl, idx, hd) {
 		if (bdev_is_partition(hd) && !bdev_nr_sectors(hd))
 			continue;
-		if (queue_is_mq(gp->queue))
-			inflight = blk_mq_in_flight(gp->queue, hd);
-		else
-			inflight = part_in_flight(hd);
 
+		inflight = part_in_flight(hd);
 		if (inflight) {
 			part_stat_lock();
 			update_io_ticks(hd, jiffies, true);