forked from luck/tmp_suning_uos_patched
bfq: Track whether bfq_group is still online
commit 09f871868080c33992cd6a9b72a5ca49582578fa upstream. Track whether bfq_group is still online. We cannot rely on blkcg_gq->online because that gets cleared only after all policies are offlined and we need something that gets updated already under bfqd->lock when we are cleaning up our bfq_group to be able to guarantee that when we see online bfq_group, it will stay online while we are holding bfqd->lock lock. CC: stable@vger.kernel.org Tested-by: "yukuai (C)" <yukuai3@huawei.com> Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20220401102752.8599-7-jack@suse.cz Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b06691af08
commit
70a7dea846
|
@ -553,6 +553,7 @@ static void bfq_pd_init(struct blkg_policy_data *pd)
|
|||
*/
|
||||
bfqg->bfqd = bfqd;
|
||||
bfqg->active_entities = 0;
|
||||
bfqg->online = true;
|
||||
bfqg->rq_pos_tree = RB_ROOT;
|
||||
}
|
||||
|
||||
|
@ -599,7 +600,6 @@ struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd,
|
|||
struct bfq_entity *entity;
|
||||
|
||||
bfqg = bfq_lookup_bfqg(bfqd, blkcg);
|
||||
|
||||
if (unlikely(!bfqg))
|
||||
return NULL;
|
||||
|
||||
|
@ -961,6 +961,7 @@ static void bfq_pd_offline(struct blkg_policy_data *pd)
|
|||
|
||||
put_async_queues:
|
||||
bfq_put_async_queues(bfqd, bfqg);
|
||||
bfqg->online = false;
|
||||
|
||||
spin_unlock_irqrestore(&bfqd->lock, flags);
|
||||
/*
|
||||
|
|
|
@ -901,6 +901,8 @@ struct bfq_group {
|
|||
|
||||
/* reference counter (see comments in bfq_bic_update_cgroup) */
|
||||
int ref;
|
||||
/* Is bfq_group still online? */
|
||||
bool online;
|
||||
|
||||
struct bfq_entity entity;
|
||||
struct bfq_sched_data sched_data;
|
||||
|
|
Loading…
Reference in New Issue
Block a user