From: dietmar.eggemann@arm.com (Dietmar Eggemann)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 5/6] sched: replace capacity_factor by usage
Date: Wed, 24 Sep 2014 18:48:15 +0100 [thread overview]
Message-ID: <542303DF.8010606@arm.com> (raw)
In-Reply-To: <1411488485-10025-6-git-send-email-vincent.guittot@linaro.org>
On 23/09/14 17:08, Vincent Guittot wrote:
[...]
>
> Finally, the sched_group->sched_group_capacity->capacity_orig has been removed
> because it's more used during load balance.
So you're not forced to call it rq->cpu_capacity_orig any more, you
could use rq->cpu_capacity_max instead.
[...]
This review (by PeterZ) during v5 of your patch-set recommended some
renaming (e.g. s/group_has_free_capacity/group_has_capacity and
s/group_out_of_capacity/group_no_capacity as well as reordering of the
parameters which I agree with:
https://lkml.org/lkml/2014/9/11/706
>
> -/*
> - * Compute the group capacity factor.
> - *
> - * Avoid the issue where N*frac(smt_capacity) >= 1 creates 'phantom' cores by
> - * first dividing out the smt factor and computing the actual number of cores
> - * and limit unit capacity with that.
> - */
> -static inline int sg_capacity_factor(struct lb_env *env, struct sched_group *group)
> +static inline int group_has_free_capacity(struct sg_lb_stats *sgs,
s/static inline int/static inline bool
> + struct lb_env *env)
> {
> - unsigned int capacity_factor, smt, cpus;
> - unsigned int capacity, capacity_orig;
> + if ((sgs->group_capacity * 100) >
> + (sgs->group_usage * env->sd->imbalance_pct))
> + return true;
>
> - capacity = group->sgc->capacity;
> - capacity_orig = group->sgc->capacity_orig;
> - cpus = group->group_weight;
> + if (sgs->sum_nr_running < sgs->group_weight)
> + return true;
>
> - /* smt := ceil(cpus / capacity), assumes: 1 < smt_capacity < 2 */
> - smt = DIV_ROUND_UP(SCHED_CAPACITY_SCALE * cpus, capacity_orig);
> - capacity_factor = cpus / smt; /* cores */
> + return false;
> +}
>
> - capacity_factor = min_t(unsigned,
> - capacity_factor, DIV_ROUND_CLOSEST(capacity, SCHED_CAPACITY_SCALE));
> - if (!capacity_factor)
> - capacity_factor = fix_small_capacity(env->sd, group);
> +static inline int group_is_overloaded(struct sg_lb_stats *sgs,
s/static inline int/static inline bool
> + struct lb_env *env)
> +{
> + if (sgs->sum_nr_running <= sgs->group_weight)
> + return false;
>
> - return capacity_factor;
> + if ((sgs->group_capacity * 100) <
> + (sgs->group_usage * env->sd->imbalance_pct))
> + return true;
> +
> + return false;
> }
>
> static enum group_type
> -group_classify(struct sched_group *group, struct sg_lb_stats *sgs)
> +group_classify(struct sched_group *group, struct sg_lb_stats *sgs,
> + struct lb_env *env)
> {
> - if (sgs->sum_nr_running > sgs->group_capacity_factor)
> + if (group_is_overloaded(sgs, env))
> return group_overloaded;
>
> if (sg_imbalanced(group))
> @@ -6072,11 +6038,10 @@ static inline void update_sg_lb_stats(struct lb_env *env,
> sgs->load_per_task = sgs->sum_weighted_load / sgs->sum_nr_running;
>
> sgs->group_weight = group->group_weight;
> - sgs->group_capacity_factor = sg_capacity_factor(env, group);
> - sgs->group_type = group_classify(group, sgs);
>
> - if (sgs->group_capacity_factor > sgs->sum_nr_running)
> - sgs->group_has_free_capacity = 1;
> + sgs->group_type = group_classify(group, sgs, env);
> +
> + sgs->group_out_of_capacity = group_is_overloaded(sgs, env);
In case sgs->group_type is group_overloaded you could set
sgs->group_out_of_capacity to 1 without calling group_is_overloaded again.
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 7cdf271e8e52..52d441c92a4f 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6037,7 +6037,8 @@ static inline void update_sg_lb_stats(struct
lb_env *env,
sgs->group_type = group_classify(group, sgs, env);
- sgs->group_out_of_capacity = group_is_overloaded(sgs, env);
+ if (sgs->group_type == group_overloaded)
+ sgs->group_out_of_capacity = 1;
}
> }
>
> /**
> @@ -6198,17 +6163,21 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
[...]
WARNING: multiple messages have this Message-ID (diff)
From: Dietmar Eggemann <dietmar.eggemann@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>,
"peterz@infradead.org" <peterz@infradead.org>,
"mingo@kernel.org" <mingo@kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"preeti@linux.vnet.ibm.com" <preeti@linux.vnet.ibm.com>,
"linux@arm.linux.org.uk" <linux@arm.linux.org.uk>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Cc: "riel@redhat.com" <riel@redhat.com>,
Morten Rasmussen <Morten.Rasmussen@arm.com>,
"efault@gmx.de" <efault@gmx.de>,
"nicolas.pitre@linaro.org" <nicolas.pitre@linaro.org>,
"linaro-kernel@lists.linaro.org" <linaro-kernel@lists.linaro.org>,
"daniel.lezcano@linaro.org" <daniel.lezcano@linaro.org>,
"pjt@google.com" <pjt@google.com>,
"bsegall@google.com" <bsegall@google.com>
Subject: Re: [PATCH v6 5/6] sched: replace capacity_factor by usage
Date: Wed, 24 Sep 2014 18:48:15 +0100 [thread overview]
Message-ID: <542303DF.8010606@arm.com> (raw)
In-Reply-To: <1411488485-10025-6-git-send-email-vincent.guittot@linaro.org>
On 23/09/14 17:08, Vincent Guittot wrote:
[...]
>
> Finally, the sched_group->sched_group_capacity->capacity_orig has been removed
> because it's more used during load balance.
So you're not forced to call it rq->cpu_capacity_orig any more, you
could use rq->cpu_capacity_max instead.
[...]
This review (by PeterZ) during v5 of your patch-set recommended some
renaming (e.g. s/group_has_free_capacity/group_has_capacity and
s/group_out_of_capacity/group_no_capacity as well as reordering of the
parameters which I agree with:
https://lkml.org/lkml/2014/9/11/706
>
> -/*
> - * Compute the group capacity factor.
> - *
> - * Avoid the issue where N*frac(smt_capacity) >= 1 creates 'phantom' cores by
> - * first dividing out the smt factor and computing the actual number of cores
> - * and limit unit capacity with that.
> - */
> -static inline int sg_capacity_factor(struct lb_env *env, struct sched_group *group)
> +static inline int group_has_free_capacity(struct sg_lb_stats *sgs,
s/static inline int/static inline bool
> + struct lb_env *env)
> {
> - unsigned int capacity_factor, smt, cpus;
> - unsigned int capacity, capacity_orig;
> + if ((sgs->group_capacity * 100) >
> + (sgs->group_usage * env->sd->imbalance_pct))
> + return true;
>
> - capacity = group->sgc->capacity;
> - capacity_orig = group->sgc->capacity_orig;
> - cpus = group->group_weight;
> + if (sgs->sum_nr_running < sgs->group_weight)
> + return true;
>
> - /* smt := ceil(cpus / capacity), assumes: 1 < smt_capacity < 2 */
> - smt = DIV_ROUND_UP(SCHED_CAPACITY_SCALE * cpus, capacity_orig);
> - capacity_factor = cpus / smt; /* cores */
> + return false;
> +}
>
> - capacity_factor = min_t(unsigned,
> - capacity_factor, DIV_ROUND_CLOSEST(capacity, SCHED_CAPACITY_SCALE));
> - if (!capacity_factor)
> - capacity_factor = fix_small_capacity(env->sd, group);
> +static inline int group_is_overloaded(struct sg_lb_stats *sgs,
s/static inline int/static inline bool
> + struct lb_env *env)
> +{
> + if (sgs->sum_nr_running <= sgs->group_weight)
> + return false;
>
> - return capacity_factor;
> + if ((sgs->group_capacity * 100) <
> + (sgs->group_usage * env->sd->imbalance_pct))
> + return true;
> +
> + return false;
> }
>
> static enum group_type
> -group_classify(struct sched_group *group, struct sg_lb_stats *sgs)
> +group_classify(struct sched_group *group, struct sg_lb_stats *sgs,
> + struct lb_env *env)
> {
> - if (sgs->sum_nr_running > sgs->group_capacity_factor)
> + if (group_is_overloaded(sgs, env))
> return group_overloaded;
>
> if (sg_imbalanced(group))
> @@ -6072,11 +6038,10 @@ static inline void update_sg_lb_stats(struct lb_env *env,
> sgs->load_per_task = sgs->sum_weighted_load / sgs->sum_nr_running;
>
> sgs->group_weight = group->group_weight;
> - sgs->group_capacity_factor = sg_capacity_factor(env, group);
> - sgs->group_type = group_classify(group, sgs);
>
> - if (sgs->group_capacity_factor > sgs->sum_nr_running)
> - sgs->group_has_free_capacity = 1;
> + sgs->group_type = group_classify(group, sgs, env);
> +
> + sgs->group_out_of_capacity = group_is_overloaded(sgs, env);
In case sgs->group_type is group_overloaded you could set
sgs->group_out_of_capacity to 1 without calling group_is_overloaded again.
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 7cdf271e8e52..52d441c92a4f 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6037,7 +6037,8 @@ static inline void update_sg_lb_stats(struct
lb_env *env,
sgs->group_type = group_classify(group, sgs, env);
- sgs->group_out_of_capacity = group_is_overloaded(sgs, env);
+ if (sgs->group_type == group_overloaded)
+ sgs->group_out_of_capacity = 1;
}
> }
>
> /**
> @@ -6198,17 +6163,21 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
[...]
next prev parent reply other threads:[~2014-09-24 17:48 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-23 16:07 [PATCH v6 0/6] sched: consolidation of cpu_capacity Vincent Guittot
2014-09-23 16:07 ` Vincent Guittot
2014-09-23 16:08 ` [PATCH v6 1/6] sched: add per rq cpu_capacity_orig Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-09-23 16:08 ` [PATCH v6 2/6] sched: move cfs task on a CPU with higher capacity Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-09-23 16:08 ` [PATCH v6 3/6] sched: add utilization_avg_contrib Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-10-03 14:15 ` Peter Zijlstra
2014-10-03 14:15 ` Peter Zijlstra
2014-10-03 14:44 ` Vincent Guittot
2014-10-03 14:44 ` Vincent Guittot
2014-10-03 14:36 ` Peter Zijlstra
2014-10-03 14:36 ` Peter Zijlstra
2014-10-03 14:51 ` Vincent Guittot
2014-10-03 14:51 ` Vincent Guittot
2014-10-03 15:14 ` Peter Zijlstra
2014-10-03 15:14 ` Peter Zijlstra
2014-10-03 16:05 ` Morten Rasmussen
2014-10-03 16:05 ` Morten Rasmussen
2014-09-23 16:08 ` [PATCH v6 4/6] sched: get CPU's usage statistic Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-09-25 19:05 ` Dietmar Eggemann
2014-09-25 19:05 ` Dietmar Eggemann
2014-09-26 12:17 ` Vincent Guittot
2014-09-26 12:17 ` Vincent Guittot
2014-09-26 15:58 ` Morten Rasmussen
2014-09-26 15:58 ` Morten Rasmussen
2014-09-26 19:57 ` Dietmar Eggemann
2014-09-26 19:57 ` Dietmar Eggemann
2014-11-21 5:36 ` Wanpeng Li
2014-11-21 5:36 ` Wanpeng Li
2014-11-21 12:17 ` Vincent Guittot
2014-11-21 12:17 ` Vincent Guittot
2014-09-23 16:08 ` [PATCH v6 5/6] sched: replace capacity_factor by usage Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-09-24 17:48 ` Dietmar Eggemann [this message]
2014-09-24 17:48 ` Dietmar Eggemann
2014-09-25 8:35 ` Vincent Guittot
2014-09-25 8:35 ` Vincent Guittot
2014-09-25 19:19 ` Dietmar Eggemann
2014-09-25 19:19 ` Dietmar Eggemann
2014-09-26 12:39 ` Vincent Guittot
2014-09-26 12:39 ` Vincent Guittot
2014-09-26 14:00 ` Dietmar Eggemann
2014-09-26 14:00 ` Dietmar Eggemann
2014-09-25 8:38 ` Vincent Guittot
2014-09-25 8:38 ` Vincent Guittot
2014-09-29 13:39 ` Dietmar Eggemann
2014-09-29 13:39 ` Dietmar Eggemann
2014-10-02 16:57 ` Morten Rasmussen
2014-10-02 16:57 ` Morten Rasmussen
2014-10-03 7:24 ` Vincent Guittot
2014-10-03 7:24 ` Vincent Guittot
2014-10-03 9:35 ` Morten Rasmussen
2014-10-03 9:35 ` Morten Rasmussen
2014-10-03 12:50 ` Vincent Guittot
2014-10-03 12:50 ` Vincent Guittot
2014-11-23 0:22 ` Wanpeng Li
2014-11-23 0:22 ` Wanpeng Li
2014-11-24 8:26 ` Vincent Guittot
2014-11-24 8:26 ` Vincent Guittot
2014-10-03 15:38 ` Peter Zijlstra
2014-10-03 15:38 ` Peter Zijlstra
2014-10-06 8:55 ` Vincent Guittot
2014-10-06 8:55 ` Vincent Guittot
2014-09-23 16:08 ` [PATCH v6 6/6] sched: add SD_PREFER_SIBLING for SMT level Vincent Guittot
2014-09-23 16:08 ` Vincent Guittot
2014-09-24 12:27 ` Preeti U Murthy
2014-09-24 12:27 ` Preeti U Murthy
2014-09-25 12:10 ` Vincent Guittot
2014-09-25 12:10 ` Vincent Guittot
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=542303DF.8010606@arm.com \
--to=dietmar.eggemann@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.