All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qais Yousef <qais.yousef@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Ingo Molnar <mingo@kernel.org>,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Dietmar Eggemann <dietmar.eggemann@arm.com>,
	linux-kernel@vger.kernel.org, Xuewen Yan <xuewen.yan94@gmail.com>,
	Wei Wang <wvw@google.com>,
	Jonathan JMChen <Jonathan.JMChen@mediatek.com>,
	Hank <han.lin@mediatek.com>
Subject: Re: [PATCH 2/7] sched/uclamp: Make task_fits_capacity() use util_fits_cpu()
Date: Tue, 12 Jul 2022 11:48:43 +0100	[thread overview]
Message-ID: <20220712104843.frbtkgkiftaovcon@wubuntu> (raw)
In-Reply-To: <CAKfTPtAxK=NGbpQkiW8-tx3kEwp-M7LAr1Rq_kdWDdsSq7Hd9A@mail.gmail.com>

On 07/11/22 15:09, Vincent Guittot wrote:
> On Wed, 29 Jun 2022 at 21:48, Qais Yousef <qais.yousef@arm.com> wrote:

[...]

> > @@ -8502,15 +8504,16 @@ static void update_cpu_capacity(struct sched_domain *sd, int cpu)
> >         trace_sched_cpu_capacity_tp(cpu_rq(cpu));
> >
> >         sdg->sgc->capacity = capacity;
> > -       sdg->sgc->min_capacity = capacity;
> > -       sdg->sgc->max_capacity = capacity;
> > +       sdg->sgc->min_capacity_cpu = cpu;
> > +       sdg->sgc->max_capacity_cpu = cpu;
> 
> you make these fields useless. There is only one cpu per sched_group
> at this level so you don't need to save the twice cpu number of the
> nly cpu of this group

Ah, so we can use group->asym_prefer_cpu then?

I think I got confused and thought we could cover multiple capacity levels
there.

> >  }
> >
> >  void update_group_capacity(struct sched_domain *sd, int cpu)
> >  {
> > -       struct sched_domain *child = sd->child;
> >         struct sched_group *group, *sdg = sd->groups;
> > -       unsigned long capacity, min_capacity, max_capacity;
> > +       struct sched_domain *child = sd->child;
> > +       int min_capacity_cpu, max_capacity_cpu;
> > +       unsigned long capacity;
> >         unsigned long interval;
> >
> >         interval = msecs_to_jiffies(sd->balance_interval);
> > @@ -8523,8 +8526,7 @@ void update_group_capacity(struct sched_domain *sd, int cpu)
> >         }
> >
> >         capacity = 0;
> > -       min_capacity = ULONG_MAX;
> > -       max_capacity = 0;
> > +       min_capacity_cpu = max_capacity_cpu = cpu;
> >
> >         if (child->flags & SD_OVERLAP) {
> >                 /*
> > @@ -8536,29 +8538,44 @@ void update_group_capacity(struct sched_domain *sd, int cpu)
> >                         unsigned long cpu_cap = capacity_of(cpu);
> >
> >                         capacity += cpu_cap;
> > -                       min_capacity = min(cpu_cap, min_capacity);
> > -                       max_capacity = max(cpu_cap, max_capacity);
> > +                       if (cpu_cap < capacity_of(min_capacity_cpu))
> > +                               min_capacity_cpu = cpu;
> > +
> > +                       if (cpu_cap > capacity_of(max_capacity_cpu))
> > +                               max_capacity_cpu = cpu;
> >                 }
> >         } else  {
> >                 /*
> >                  * !SD_OVERLAP domains can assume that child groups
> >                  * span the current group.
> >                  */
> > +               unsigned long min_capacity = ULONG_MAX;
> > +               unsigned long max_capacity = 0;
> >
> >                 group = child->groups;
> >                 do {
> >                         struct sched_group_capacity *sgc = group->sgc;
> > +                       unsigned long cpu_cap_min = capacity_of(sgc->min_capacity_cpu);
> > +                       unsigned long cpu_cap_max = capacity_of(sgc->max_capacity_cpu);
> 
> By replacing sgc->min_capacity with sgc->min_capacity_cpu, the
> min_capacity is no more stable and can become > max_capacity

Right.

> 
> >
> >                         capacity += sgc->capacity;
> > -                       min_capacity = min(sgc->min_capacity, min_capacity);
> > -                       max_capacity = max(sgc->max_capacity, max_capacity);
> > +                       if (cpu_cap_min < min_capacity) {
> > +                               min_capacity = cpu_cap_min;
> > +                               min_capacity_cpu = sgc->min_capacity_cpu;
> > +                       }
> > +
> > +                       if (cpu_cap_max > max_capacity) {
> > +                               max_capacity = cpu_cap_max;
> > +                               max_capacity_cpu = sgc->max_capacity_cpu;
> > +                       }
> > +
> >                         group = group->next;
> >                 } while (group != child->groups);
> >         }
> >
> >         sdg->sgc->capacity = capacity;
> > -       sdg->sgc->min_capacity = min_capacity;
> > -       sdg->sgc->max_capacity = max_capacity;
> > +       sdg->sgc->min_capacity_cpu = min_capacity_cpu;
> > +       sdg->sgc->max_capacity_cpu = max_capacity_cpu;
> >  }
> >
> >  /*
> > @@ -8902,7 +8919,7 @@ static bool update_sd_pick_busiest(struct lb_env *env,
> >          * internally or be covered by avg_load imbalance (eventually).
> >          */
> >         if (sgs->group_type == group_misfit_task &&
> > -           (!capacity_greater(capacity_of(env->dst_cpu), sg->sgc->max_capacity) ||
> > +           (!capacity_greater(env->dst_cpu, sg->sgc->max_capacity_cpu) ||
> >              sds->local_stat.group_type != group_has_spare))
> >                 return false;
> >
> > @@ -8986,7 +9003,7 @@ static bool update_sd_pick_busiest(struct lb_env *env,
> >          */
> >         if ((env->sd->flags & SD_ASYM_CPUCAPACITY) &&
> >             (sgs->group_type <= group_fully_busy) &&
> > -           (capacity_greater(sg->sgc->min_capacity, capacity_of(env->dst_cpu))))
> > +           (capacity_greater(sg->sgc->min_capacity_cpu, env->dst_cpu)))
> >                 return false;
> >
> >         return true;
> > @@ -9108,7 +9125,7 @@ static inline void update_sg_wakeup_stats(struct sched_domain *sd,
> >
> >         /* Check if task fits in the group */
> >         if (sd->flags & SD_ASYM_CPUCAPACITY &&
> > -           !task_fits_capacity(p, group->sgc->max_capacity)) {
> > +           !task_fits_cpu(p, group->sgc->max_capacity_cpu)) {
> 
> All the changes and added complexity above for this line. Can't you
> find another way ?

You're right, I might have got carried away trying to keep the logic the same.

Can we use group->asym_prefer_cpu or pick a cpu from group->sgc->cpumask
instead?

I'll dig more into it anyway and try to come up with simpler alternative.


Thanks!

--
Qais Yousef

  reply	other threads:[~2022-07-12 10:48 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-29 19:46 [PATCH 0/7] Fix relationship between uclamp and fits_capacity() Qais Yousef
2022-06-29 19:46 ` [PATCH 1/7] sched/uclamp: Fix relationship between uclamp and migration margin Qais Yousef
2022-07-11 12:36   ` Vincent Guittot
2022-07-12 10:23     ` Qais Yousef
2022-07-12 13:21       ` Vincent Guittot
2022-07-12 14:20         ` Qais Yousef
2022-07-13 12:39           ` Vincent Guittot
2022-07-15 10:37             ` Qais Yousef
2022-07-20  7:29               ` Vincent Guittot
2022-07-21 14:04                 ` Qais Yousef
2022-07-22 15:13                   ` Vincent Guittot
2022-07-27 16:08                     ` Qais Yousef
2022-08-04 14:59                     ` Qais Yousef
2022-07-20  7:17   ` Xuewen Yan
2022-07-21 10:24     ` Qais Yousef
2022-07-25 11:59       ` Xuewen Yan
2022-07-27 16:25         ` Qais Yousef
2022-08-01  2:46           ` Xuewen Yan
2022-08-02 16:22             ` Qais Yousef
2022-06-29 19:46 ` [PATCH 2/7] sched/uclamp: Make task_fits_capacity() use util_fits_cpu() Qais Yousef
2022-07-11 13:09   ` Vincent Guittot
2022-07-12 10:48     ` Qais Yousef [this message]
2022-07-21 14:29       ` Qais Yousef
2022-07-22  8:19         ` Vincent Guittot
2022-07-27 16:05           ` Qais Yousef
2022-08-17  9:48             ` Vincent Guittot
2022-07-20  7:23   ` Xuewen Yan
2022-07-21 14:11     ` Qais Yousef
2022-06-29 19:46 ` [PATCH 3/7] sched/uclamp: Fix fits_capacity() check in feec() Qais Yousef
2022-07-20  7:30   ` Xuewen Yan
2022-07-21 14:19     ` Qais Yousef
2022-06-29 19:46 ` [PATCH 4/7] sched/uclamp: Make select_idle_capacity() use util_fits_cpu() Qais Yousef
2022-06-29 19:46 ` [PATCH 5/7] sched/uclamp: Make asym_fits_capacity() " Qais Yousef
2022-06-29 19:46 ` [PATCH 6/7] sched/uclamp: Make cpu_overutilized() " Qais Yousef
2022-06-29 19:46 ` [PATCH 7/7] sched/uclamp: Cater for uclamp in find_energy_efficient_cpu()'s early exit condition Qais Yousef
2022-07-20  7:39   ` Xuewen Yan
2022-07-21 14:24     ` Qais Yousef
2022-07-22  1:09       ` Xuewen Yan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220712104843.frbtkgkiftaovcon@wubuntu \
    --to=qais.yousef@arm.com \
    --cc=Jonathan.JMChen@mediatek.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=han.lin@mediatek.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=vincent.guittot@linaro.org \
    --cc=wvw@google.com \
    --cc=xuewen.yan94@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.