[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220528064330.3471000-9-yukuai3@huawei.com>
Date: Sat, 28 May 2022 14:43:30 +0800
From: Yu Kuai <yukuai3@...wei.com>
To: <tj@...nel.org>, <mkoutny@...e.com>, <axboe@...nel.dk>,
<ming.lei@...hat.com>
CC: <cgroups@...r.kernel.org>, <linux-block@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, <yukuai3@...wei.com>,
<yi.zhang@...wei.com>
Subject: [PATCH -next v5 8/8] blk-throttle: clean up flag 'THROTL_TG_PENDING'
All related operations are inside 'queue_lock', there is no need to use
the flag, we only need to make sure throtl_enqueue_tg() is called when
the first bio is throttled, and throtl_dequeue_tg() is called when the
last throttled bio is dispatched.
Signed-off-by: Yu Kuai <yukuai3@...wei.com>
---
block/blk-throttle.c | 22 ++++++++--------------
block/blk-throttle.h | 7 +++----
2 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index 297ce54ceaa3..fe7f01c61ba8 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -561,23 +561,16 @@ static void tg_service_queue_add(struct throtl_grp *tg)
static void throtl_enqueue_tg(struct throtl_grp *tg)
{
- if (!(tg->flags & THROTL_TG_PENDING)) {
- tg_service_queue_add(tg);
- tg->flags |= THROTL_TG_PENDING;
- tg->service_queue.parent_sq->nr_pending++;
- }
+ tg_service_queue_add(tg);
+ tg->service_queue.parent_sq->nr_pending++;
}
static void throtl_dequeue_tg(struct throtl_grp *tg)
{
- if (tg->flags & THROTL_TG_PENDING) {
- struct throtl_service_queue *parent_sq =
- tg->service_queue.parent_sq;
+ struct throtl_service_queue *parent_sq = tg->service_queue.parent_sq;
- throtl_rb_erase(&tg->rb_node, parent_sq);
- --parent_sq->nr_pending;
- tg->flags &= ~THROTL_TG_PENDING;
- }
+ throtl_rb_erase(&tg->rb_node, parent_sq);
+ --parent_sq->nr_pending;
}
/* Call with queue lock held */
@@ -1015,8 +1008,9 @@ static void throtl_add_bio_tg(struct bio *bio, struct throtl_qnode *qn,
throtl_qnode_add_bio(bio, qn, &sq->queued[rw]);
+ if (!sq->nr_queued[READ] && !sq->nr_queued[WRITE])
+ throtl_enqueue_tg(tg);
sq->nr_queued[rw]++;
- throtl_enqueue_tg(tg);
}
static void tg_update_disptime(struct throtl_grp *tg)
@@ -1371,7 +1365,7 @@ static void tg_conf_updated(struct throtl_grp *tg, bool global)
throtl_start_new_slice(tg, READ, false);
throtl_start_new_slice(tg, WRITE, false);
- if (tg->flags & THROTL_TG_PENDING) {
+ if (sq->nr_queued[READ] || sq->nr_queued[WRITE]) {
tg_update_disptime(tg);
throtl_schedule_next_dispatch(sq->parent_sq, true);
}
diff --git a/block/blk-throttle.h b/block/blk-throttle.h
index b8178e6b4d30..f68b95999f83 100644
--- a/block/blk-throttle.h
+++ b/block/blk-throttle.h
@@ -53,10 +53,9 @@ struct throtl_service_queue {
};
enum tg_state_flags {
- THROTL_TG_PENDING = 1 << 0, /* on parent's pending tree */
- THROTL_TG_WAS_EMPTY = 1 << 1, /* bio_lists[] became non-empty */
- THROTL_TG_HAS_IOPS_LIMIT = 1 << 2, /* tg has iops limit */
- THROTL_TG_CANCELING = 1 << 3, /* starts to cancel bio */
+ THROTL_TG_WAS_EMPTY = 1 << 0, /* bio_lists[] became non-empty */
+ THROTL_TG_HAS_IOPS_LIMIT = 1 << 1, /* tg has iops limit */
+ THROTL_TG_CANCELING = 1 << 2, /* starts to cancel bio */
};
enum {
--
2.31.1
Powered by blists - more mailing lists