mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-05 03:44:03 +08:00
blk-throttle: make tg_dispatch_one_bio() ready for hierarchy
tg_dispatch_one_bio() currently assumes that the parent_sq is the top level one and the bio being dispatched is ready to be issued; however, this assumption will be wrong with proper hierarchy support. This patch makes the following changes to make tg_dispatch_on_bio() ready for hiearchy. * throtl_data->nr_queued[] is incremented in blk_throtl_bio() instead of throtl_add_bio_tg() so that throtl_add_bio_tg() can be used to transfer a bio from a child tg to its parent. * tg_dispatch_one_bio() is updated to distinguish whether its parent is another throtl_grp or the throtl_data. If former, the bio is transferred to the parent throtl_grp using throtl_add_bio_tg(). If latter, the bio is ready to be issued and put on the top-level service_queue's bio_lists[] and throtl_data->nr_queued is decremented. As all throtl_grps currently have the top level service_queue as their ->parent_sq, this patch in itself doesn't make any behavior difference. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
parent
9e660acffc
commit
6bc9c2b464
@ -824,7 +824,6 @@ static void throtl_add_bio_tg(struct bio *bio, struct throtl_grp *tg)
|
||||
/* Take a bio reference on tg */
|
||||
blkg_get(tg_to_blkg(tg));
|
||||
sq->nr_queued[rw]++;
|
||||
tg->td->nr_queued[rw]++;
|
||||
throtl_enqueue_tg(tg);
|
||||
}
|
||||
|
||||
@ -855,20 +854,34 @@ static void tg_update_disptime(struct throtl_grp *tg)
|
||||
static void tg_dispatch_one_bio(struct throtl_grp *tg, bool rw)
|
||||
{
|
||||
struct throtl_service_queue *sq = &tg->service_queue;
|
||||
struct throtl_service_queue *parent_sq = sq->parent_sq;
|
||||
struct throtl_grp *parent_tg = sq_to_tg(parent_sq);
|
||||
struct bio *bio;
|
||||
|
||||
bio = bio_list_pop(&sq->bio_lists[rw]);
|
||||
sq->nr_queued[rw]--;
|
||||
/* Drop bio reference on blkg */
|
||||
blkg_put(tg_to_blkg(tg));
|
||||
|
||||
BUG_ON(tg->td->nr_queued[rw] <= 0);
|
||||
tg->td->nr_queued[rw]--;
|
||||
|
||||
throtl_charge_bio(tg, bio);
|
||||
bio_list_add(&sq->parent_sq->bio_lists[rw], bio);
|
||||
|
||||
/*
|
||||
* If our parent is another tg, we just need to transfer @bio to
|
||||
* the parent using throtl_add_bio_tg(). If our parent is
|
||||
* @td->service_queue, @bio is ready to be issued. Put it on its
|
||||
* bio_lists[] and decrease total number queued. The caller is
|
||||
* responsible for issuing these bios.
|
||||
*/
|
||||
if (parent_tg) {
|
||||
throtl_add_bio_tg(bio, parent_tg);
|
||||
} else {
|
||||
bio_list_add(&parent_sq->bio_lists[rw], bio);
|
||||
BUG_ON(tg->td->nr_queued[rw] <= 0);
|
||||
tg->td->nr_queued[rw]--;
|
||||
}
|
||||
|
||||
throtl_trim_slice(tg, rw);
|
||||
|
||||
/* @bio is transferred to parent, drop its blkg reference */
|
||||
blkg_put(tg_to_blkg(tg));
|
||||
}
|
||||
|
||||
static int throtl_dispatch_tg(struct throtl_grp *tg)
|
||||
@ -1283,6 +1296,7 @@ bool blk_throtl_bio(struct request_queue *q, struct bio *bio)
|
||||
sq->nr_queued[READ], sq->nr_queued[WRITE]);
|
||||
|
||||
bio_associate_current(bio);
|
||||
tg->td->nr_queued[rw]++;
|
||||
throtl_add_bio_tg(bio, tg);
|
||||
throttled = true;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user