lkml.org 
[lkml]   [2022]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH -next 02/11] block, bfq: apply news apis where root group is not expected
    On Sat 05-03-22 17:11:56, Yu Kuai wrote:
    > 'entity->sched_data' is set to parent group's sched_data, thus it's NULL
    > for root group. And for_each_entity() is used widely to access
    > 'entity->sched_data', thus aplly news apis if root group is not
    ^^ apply

    > expected. Prepare to count root group into 'num_groups_with_pending_reqs'.
    >
    > Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    > ---
    > block/bfq-iosched.c | 2 +-
    > block/bfq-iosched.h | 22 ++++++++--------------
    > block/bfq-wf2q.c | 10 +++++-----
    > 3 files changed, 14 insertions(+), 20 deletions(-)
    >
    > diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
    > index 69ddf6b0f01d..3bc7a7686aad 100644
    > --- a/block/bfq-iosched.c
    > +++ b/block/bfq-iosched.c
    > @@ -4393,7 +4393,7 @@ void bfq_bfqq_expire(struct bfq_data *bfqd,
    > * service with the same budget.
    > */
    > entity = entity->parent;
    > - for_each_entity(entity)
    > + for_each_entity_not_root(entity)
    > entity->service = 0;
    > }

    So why is it a problem to clear the service for root cgroup here?

    > diff --git a/block/bfq-wf2q.c b/block/bfq-wf2q.c
    > index f8eb340381cf..c4cb935a615a 100644
    > --- a/block/bfq-wf2q.c
    > +++ b/block/bfq-wf2q.c
    > @@ -815,7 +815,7 @@ void bfq_bfqq_served(struct bfq_queue *bfqq, int served)
    > bfqq->service_from_wr += served;
    >
    > bfqq->service_from_backlogged += served;
    > - for_each_entity(entity) {
    > + for_each_entity_not_root(entity) {
    > st = bfq_entity_service_tree(entity);

    Hum, right so how come this was not crashing? Because entity->sched_data is
    indeed NULL for bfqd->root_group->entity and so bfq_entity_service_tree()
    returned some bogus pointer? Similarly for the cases you are changing
    below?

    Honza

    >
    > entity->service += served;
    > @@ -1201,7 +1201,7 @@ static void bfq_deactivate_entity(struct bfq_entity *entity,
    > struct bfq_sched_data *sd;
    > struct bfq_entity *parent = NULL;
    >
    > - for_each_entity_safe(entity, parent) {
    > + for_each_entity_not_root_safe(entity, parent) {
    > sd = entity->sched_data;
    >
    > if (!__bfq_deactivate_entity(entity, ins_into_idle_tree)) {
    > @@ -1270,7 +1270,7 @@ static void bfq_deactivate_entity(struct bfq_entity *entity,
    > * is not the case.
    > */
    > entity = parent;
    > - for_each_entity(entity) {
    > + for_each_entity_not_root(entity) {
    > /*
    > * Invoke __bfq_requeue_entity on entity, even if
    > * already active, to requeue/reposition it in the
    > @@ -1570,7 +1570,7 @@ struct bfq_queue *bfq_get_next_queue(struct bfq_data *bfqd)
    > * We can finally update all next-to-serve entities along the
    > * path from the leaf entity just set in service to the root.
    > */
    > - for_each_entity(entity) {
    > + for_each_entity_not_root(entity) {
    > struct bfq_sched_data *sd = entity->sched_data;
    >
    > if (!bfq_update_next_in_service(sd, NULL, false))
    > @@ -1597,7 +1597,7 @@ bool __bfq_bfqd_reset_in_service(struct bfq_data *bfqd)
    > * execute the final step: reset in_service_entity along the
    > * path from entity to the root.
    > */
    > - for_each_entity(entity)
    > + for_each_entity_not_root(entity)
    > entity->sched_data->in_service_entity = NULL;
    >
    > /*
    > --
    > 2.31.1
    >
    --
    Jan Kara <jack@suse.com>
    SUSE Labs, CR

    \
     
     \ /
      Last update: 2022-04-13 11:51    [W:3.185 / U:0.732 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site