Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1737921 > unrolled thread
| Started by | Leo Yan <leo.yan@linaro.org> |
|---|---|
| First post | 2017-09-23 01:10 +0200 |
| Last post | 2017-09-25 16:00 +0200 |
| Articles | 3 — 3 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation Leo Yan <leo.yan@linaro.org> - 2017-09-23 01:10 +0200
Re: [PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation Peter Zijlstra <peterz@infradead.org> - 2017-09-25 10:20 +0200
Re: [PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation Patrick Bellasi <patrick.bellasi@arm.com> - 2017-09-25 16:00 +0200
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2017-09-23 01:10 +0200 |
| Subject | [PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation |
| Message-ID | <usFf4-3LG-5@gated-at.bofh.it> |
Scheduler CFS class has variable 'capacity_margin' to calculate the capacity margin, and schedutil governor also needs to compensate the same margin for frequency tipping point. Below are formulas used in CFS class and schedutil governor separately: CFS: U` = U * capacity_margin / 1024 = U * 1.25 Schedutil: U` = U + U >> 2 = U + U * 0.25 = U * 1.25 This patch consolidates the capacity margin calculation so let schedutil to use same formula with CFS class. As result this can avoid the mismatch issue between schedutil and CFS class after change 'capacity_margin' to other values. Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> Cc: Morten Rasmussen <morten.rasmussen@arm.com> Cc: Chris Redpath <Chris.Redpath@arm.com> Cc: Joel Fernandes <joelaf@google.com> Cc: Vincent Guittot <vincent.guittot@linaro.org> Signed-off-by: Leo Yan <leo.yan@linaro.org> --- kernel/sched/cpufreq_schedutil.c | 5 +++-- kernel/sched/sched.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 9209d83..067abbe 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -155,7 +155,8 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time, * * next_freq = C * curr_freq * util_raw / max * - * Take C = 1.25 for the frequency tipping point at (util / max) = 0.8. + * Take C = capacity_margin / 1024 = 1.25, so it's for the frequency tipping + * point at (util / max) = 0.8. * * The lowest driver-supported frequency which is equal or greater than the raw * next_freq (as calculated above) is returned, subject to policy min/max and @@ -168,7 +169,7 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, unsigned int freq = arch_scale_freq_invariant() ? policy->cpuinfo.max_freq : policy->cur; - freq = (freq + (freq >> 2)) * util / max; + freq = (freq * capacity_margin / 1024) * util / max; if (freq == sg_policy->cached_raw_freq && sg_policy->next_freq != UINT_MAX) return sg_policy->next_freq; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 14db76c..cf75bdc 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -52,6 +52,7 @@ struct cpuidle_state; #define TASK_ON_RQ_MIGRATING 2 extern __read_mostly int scheduler_running; +extern unsigned int capacity_margin __read_mostly; extern unsigned long calc_load_update; extern atomic_long_t calc_load_tasks; -- 2.7.4
[toc] | [next] | [standalone]
| From | Peter Zijlstra <peterz@infradead.org> |
|---|---|
| Date | 2017-09-25 10:20 +0200 |
| Subject | Re: [PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation |
| Message-ID | <utwMq-3Lc-9@gated-at.bofh.it> |
| In reply to | #1737921 |
On Sat, Sep 23, 2017 at 07:04:44AM +0800, Leo Yan wrote: > + freq = (freq * capacity_margin / 1024) * util / max; We have SCHED_CAPACITY_SCALE for that..
[toc] | [prev] | [next] | [standalone]
| From | Patrick Bellasi <patrick.bellasi@arm.com> |
|---|---|
| Date | 2017-09-25 16:00 +0200 |
| Subject | Re: [PATCH 2/2] cpufreq: schedutil: consolidate capacity margin calculation |
| Message-ID | <utC5r-76I-9@gated-at.bofh.it> |
| In reply to | #1737921 |
On 23-Sep 07:04, Leo Yan wrote:
> Scheduler CFS class has variable 'capacity_margin' to calculate the
> capacity margin, and schedutil governor also needs to compensate the
> same margin for frequency tipping point. Below are formulas used in
> CFS class and schedutil governor separately:
>
> CFS: U` = U * capacity_margin / 1024 = U * 1.25
> Schedutil: U` = U + U >> 2 = U + U * 0.25 = U * 1.25
>
> This patch consolidates the capacity margin calculation so let
> schedutil to use same formula with CFS class. As result this can avoid
> the mismatch issue between schedutil and CFS class after change
> 'capacity_margin' to other values.
>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: Morten Rasmussen <morten.rasmussen@arm.com>
> Cc: Chris Redpath <Chris.Redpath@arm.com>
> Cc: Joel Fernandes <joelaf@google.com>
> Cc: Vincent Guittot <vincent.guittot@linaro.org>
> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> ---
> kernel/sched/cpufreq_schedutil.c | 5 +++--
> kernel/sched/sched.h | 1 +
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
> index 9209d83..067abbe 100644
> --- a/kernel/sched/cpufreq_schedutil.c
> +++ b/kernel/sched/cpufreq_schedutil.c
> @@ -155,7 +155,8 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time,
> *
> * next_freq = C * curr_freq * util_raw / max
> *
> - * Take C = 1.25 for the frequency tipping point at (util / max) = 0.8.
> + * Take C = capacity_margin / 1024 = 1.25, so it's for the frequency tipping
> + * point at (util / max) = 0.8.
> *
> * The lowest driver-supported frequency which is equal or greater than the raw
> * next_freq (as calculated above) is returned, subject to policy min/max and
> @@ -168,7 +169,7 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
> unsigned int freq = arch_scale_freq_invariant() ?
> policy->cpuinfo.max_freq : policy->cur;
>
> - freq = (freq + (freq >> 2)) * util / max;
> + freq = (freq * capacity_margin / 1024) * util / max;
The compiler should be smart enough but perhaps you can better use:
freq *= (capacity_margin >> SCHED_CAPACITY_SHIFT));
freq *= util / max;
> if (freq == sg_policy->cached_raw_freq && sg_policy->next_freq != UINT_MAX)
> return sg_policy->next_freq;
> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
> index 14db76c..cf75bdc 100644
> --- a/kernel/sched/sched.h
> +++ b/kernel/sched/sched.h
> @@ -52,6 +52,7 @@ struct cpuidle_state;
> #define TASK_ON_RQ_MIGRATING 2
>
> extern __read_mostly int scheduler_running;
> +extern unsigned int capacity_margin __read_mostly;
>
> extern unsigned long calc_load_update;
> extern atomic_long_t calc_load_tasks;
> --
> 2.7.4
>
--
#include <best/regards.h>
Patrick Bellasi
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web