From: Leo Yan <leo.yan@linaro.org>
To: Morten Rasmussen <morten.rasmussen@arm.com>
Cc: peterz@infradead.org, mingo@redhat.com,
vincent.guittot@linaro.org, daniel.lezcano@linaro.org,
Dietmar Eggemann <Dietmar.Eggemann@arm.com>,
yuyang.du@intel.com, mturquette@baylibre.com, rjw@rjwysocki.net,
Juri Lelli <Juri.Lelli@arm.com>,
sgurrappadi@nvidia.com, pang.xunlei@zte.com.cn,
linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
Russell King <linux@arm.linux.org.uk>
Subject: Re: [RFCv5, 01/46] arm: Frequency invariant scheduler load-tracking support
Date: Thu, 23 Jul 2015 22:22:16 +0800 [thread overview]
Message-ID: <20150723142216.GA21773@leoy-linaro> (raw)
In-Reply-To: <20150723110626.GC21785@e105550-lin.cambridge.arm.com>
On Thu, Jul 23, 2015 at 12:06:26PM +0100, Morten Rasmussen wrote:
> On Wed, Jul 22, 2015 at 10:59:04PM +0800, Leo Yan wrote:
> > On Wed, Jul 22, 2015 at 02:31:04PM +0100, Morten Rasmussen wrote:
> > > On Tue, Jul 21, 2015 at 11:41:45PM +0800, Leo Yan wrote:
> > > > Hi Morten,
> > > >
> > > > On Tue, Jul 07, 2015 at 07:23:44PM +0100, Morten Rasmussen wrote:
> > > > > From: Morten Rasmussen <Morten.Rasmussen@arm.com>
> > > > >
> > > > > Implements arch-specific function to provide the scheduler with a
> > > > > frequency scaling correction factor for more accurate load-tracking.
> > > > > The factor is:
> > > > >
> > > > > current_freq(cpu) << SCHED_CAPACITY_SHIFT / max_freq(cpu)
> > > > >
> > > > > This implementation only provides frequency invariance. No cpu
> > > > > invariance yet.
> > > > >
> > > > > Cc: Russell King <linux@arm.linux.org.uk>
> > > > >
> > > > > Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>
> > > > >
> > > > > ---
> > > > > arch/arm/include/asm/topology.h | 7 +++++
> > > > > arch/arm/kernel/smp.c | 57 +++++++++++++++++++++++++++++++++++++++--
> > > > > arch/arm/kernel/topology.c | 17 ++++++++++++
> > > > > 3 files changed, 79 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/arch/arm/include/asm/topology.h b/arch/arm/include/asm/topology.h
> > > > > index 370f7a7..c31096f 100644
> > > > > --- a/arch/arm/include/asm/topology.h
> > > > > +++ b/arch/arm/include/asm/topology.h
> > > > > @@ -24,6 +24,13 @@ void init_cpu_topology(void);
> > > > > void store_cpu_topology(unsigned int cpuid);
> > > > > const struct cpumask *cpu_coregroup_mask(int cpu);
> > > > >
> > > > > +#define arch_scale_freq_capacity arm_arch_scale_freq_capacity
> > > > > +struct sched_domain;
> > > > > +extern
> > > > > +unsigned long arm_arch_scale_freq_capacity(struct sched_domain *sd, int cpu);
> > > > > +
> > > > > +DECLARE_PER_CPU(atomic_long_t, cpu_freq_capacity);
> > > > > +
> > > > > #else
> > > > >
> > > > > static inline void init_cpu_topology(void) { }
> > > > > diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
> > > > > index cca5b87..a32539c 100644
> > > > > --- a/arch/arm/kernel/smp.c
> > > > > +++ b/arch/arm/kernel/smp.c
> > > > > @@ -677,12 +677,34 @@ static DEFINE_PER_CPU(unsigned long, l_p_j_ref);
> > > > > static DEFINE_PER_CPU(unsigned long, l_p_j_ref_freq);
> > > > > static unsigned long global_l_p_j_ref;
> > > > > static unsigned long global_l_p_j_ref_freq;
> > > > > +static DEFINE_PER_CPU(atomic_long_t, cpu_max_freq);
> > > > > +DEFINE_PER_CPU(atomic_long_t, cpu_freq_capacity);
> > > > > +
> > > > > +/*
> > > > > + * Scheduler load-tracking scale-invariance
> > > > > + *
> > > > > + * Provides the scheduler with a scale-invariance correction factor that
> > > > > + * compensates for frequency scaling through arch_scale_freq_capacity()
> > > > > + * (implemented in topology.c).
> > > > > + */
> > > > > +static inline
> > > > > +void scale_freq_capacity(int cpu, unsigned long curr, unsigned long max)
> > > > > +{
> > > > > + unsigned long capacity;
> > > > > +
> > > > > + if (!max)
> > > > > + return;
> > > > > +
> > > > > + capacity = (curr << SCHED_CAPACITY_SHIFT) / max;
> > > > > + atomic_long_set(&per_cpu(cpu_freq_capacity, cpu), capacity);
> > > > > +}
> > > > >
> > > > > static int cpufreq_callback(struct notifier_block *nb,
> > > > > unsigned long val, void *data)
> > > > > {
> > > > > struct cpufreq_freqs *freq = data;
> > > > > int cpu = freq->cpu;
> > > > > + unsigned long max = atomic_long_read(&per_cpu(cpu_max_freq, cpu));
> > > > >
> > > > > if (freq->flags & CPUFREQ_CONST_LOOPS)
> > > > > return NOTIFY_OK;
> > > > > @@ -707,6 +729,10 @@ static int cpufreq_callback(struct notifier_block *nb,
> > > > > per_cpu(l_p_j_ref_freq, cpu),
> > > > > freq->new);
> > > > > }
> > > > > +
> > > > > + if (val == CPUFREQ_PRECHANGE)
> > > > > + scale_freq_capacity(cpu, freq->new, max);
> > > > > +
> > > > > return NOTIFY_OK;
> > > > > }
> > > > >
> > > > > @@ -714,11 +740,38 @@ static struct notifier_block cpufreq_notifier = {
> > > > > .notifier_call = cpufreq_callback,
> > > > > };
> > > > >
> > > > > +static int cpufreq_policy_callback(struct notifier_block *nb,
> > > > > + unsigned long val, void *data)
> > > > > +{
> > > > > + struct cpufreq_policy *policy = data;
> > > > > + int i;
> > > > > +
> > > > > + if (val != CPUFREQ_NOTIFY)
> > > > > + return NOTIFY_OK;
> > > > > +
> > > > > + for_each_cpu(i, policy->cpus) {
> > > > > + scale_freq_capacity(i, policy->cur, policy->max);
> > > > > + atomic_long_set(&per_cpu(cpu_max_freq, i), policy->max);
> > > > > + }
> > > > > +
> > > > > + return NOTIFY_OK;
> > > > > +}
> > > > > +
> > > > > +static struct notifier_block cpufreq_policy_notifier = {
> > > > > + .notifier_call = cpufreq_policy_callback,
> > > > > +};
> > > > > +
> > > > > static int __init register_cpufreq_notifier(void)
> > > > > {
> > > > > - return cpufreq_register_notifier(&cpufreq_notifier,
> > > > > + int ret;
> > > > > +
> > > > > + ret = cpufreq_register_notifier(&cpufreq_notifier,
> > > > > CPUFREQ_TRANSITION_NOTIFIER);
> > > > > + if (ret)
> > > > > + return ret;
> > > > > +
> > > > > + return cpufreq_register_notifier(&cpufreq_policy_notifier,
> > > > > + CPUFREQ_POLICY_NOTIFIER);
> > > > > }
> > > > > core_initcall(register_cpufreq_notifier);
> > > >
> > > > For "cpu_freq_capacity" structure, could move it into driver/cpufreq
> > > > so that it can be shared by all architectures? Otherwise, every
> > > > architecture's smp.c need register notifier for themselves.
> > >
> > > We could, but I put it in arch/arm/* as not all architectures might want
> > > this notifier. The frequency scaling factor could be provided based on
> > > architecture specific performance counters instead. AFAIK, the Intel
> > > p-state driver does not even fire the notifiers so the notifier
> > > solution would be redundant code for those platforms.
> >
> > When i tried to enable EAS on Hikey, i found it's absent related code
> > for arm64; actually this code section can also be reused by arm64,
> > so just brought up this question.
>
> Yes. We have patches for arm64 if you are interested. We are using them
> for the Juno platforms.
If convenience, please share with me related patches, so i can
directly apply them and do some profiling works.
> > Just now roughly went through the driver
> > "drivers/cpufreq/intel_pstate.c"; that's true it has different
> > implementation comparing to usual ARM SoCs. So i'd like to ask this
> > question with another way: should cpufreq framework provides helper
> > functions for getting related cpu frequency scaling info? If the
> > architecture has specific performance counters then it can ignore
> > these helper functions.
>
> That is the idea with the notifiers. If the architecture code a specific
> architecture wants to be poked by cpufreq when the frequency is changed
> it should have a way to subscribe to those. Another way of implementing
> it is to let the architecture code call a helper function in cpufreq
> every time the scheduler calls into the architecture code to get the
> scaling factor (arch_scale_freq_capacity()). We actually did it that way
> a couple of versions back using weak functions. It wasn't as clean as
> using the notifiers, but if we make the necessary changes to cpufreq to
> let the architecture code call into cpufreq that could be even better.
>
> >
> > > That said, the above solution is not handling changes to policy->max
> > > very well. Basically, we don't inform the scheduler if it has changed
> > > which means that the OPP represented by "100%" might change. We need
> > > cpufreq to keep track of the true max frequency when policy->max is
> > > changed to work out the correct scaling factor instead of having it
> > > relative to policy->max.
> >
> > i'm not sure understand correctly here. For example, when thermal
> > framework limits the cpu frequency, it will update the value for
> > policy->max, so scheduler will get the correct scaling factor, right?
> > So i don't know what's the issue at here.
> >
> > Further more, i noticed in the later patches for
> > arch_scale_cpu_capacity(); the cpu capacity is calculated by the
> > property passed by DT, so it's a static value. In some cases, system
> > may constraint the maximum frequency for CPUs, so in this case, will
> > scheduler get misknowledge from arch_scale_cpu_capacity after system
> > has imposed constraint for maximum frequency?
>
> The issue is first of all to define what 100% means. Is it
> policy->cur/policy->max or policy->cur/uncapped_max? Where uncapped max
> is the max frequency supported by the hardware when not capped in any
> way by governors or thermal framework.
>
> If we choose the first definition then we have to recalculate the cpu
> capacity scaling factor (arch_scale_cpu_capacity()) too whenever
> policy->max changes such that capacity_orig is updated appropriately.
>
> The scale-invariance code in the scheduler assumes:
>
> arch_scale_cpu_capacity()*arch_scale_freq_capacity() = current capacity
This is an important concept, thanks for the explaining.
> ...and that capacity_orig = arch_scale_cpu_capacity() is the max
> available capacity. If we cap the frequency to say, 50%, by setting
> policy->max then we have to reduce arch_scale_cpu_capacity() to 50% to
> still get the right current capacity using the expression above.
>
> Using the second definition arch_scale_cpu_capacity() can be a static
> value and arch_scale_freq_capacity() is always relative to uncapped_max.
> It seems simpler, but capacity_orig could then be an unavailable
> capacity and hence we would need to introduce a third capacity to track
> the current max capacity and use that for scheduling decisions.
> As you have already discovered the current code is a combination of both
> which is broken when policy->max is reduced.
>
> Thinking more about it, I would suggest to go with the first definition.
> The scheduler doesn't need to know about currently unavailable compute
> capacity it should balance based on the current situation, so it seems
> to make sense to let capacity_orig reflect the current max capacity.
Agree.
> I would suggest that we fix arch_scale_cpu_capacity() to take
> policy->max changes into account. We need to know the uncapped max
> frequency somehow to do that. I haven't looked into if we can get that
> from cpufreq. Also, we need to make sure that no load-balance code
> assumes that cpus have a capacity of 1024.
Cpufreq framework provides API *cpufreq_quick_get_max()* and
*cpufreq_quick_get()* for inquiry current frequency and max frequency,
but i'm curious if these two functions can be directly called by
scheduler, due they acquire and release locks internally.
Thanks,
Leo Yan
next prev parent reply other threads:[~2015-07-23 14:22 UTC|newest]
Thread overview: 155+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-07 18:23 [RFCv5 PATCH 00/46] sched: Energy cost model for energy-aware scheduling Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 01/46] arm: Frequency invariant scheduler load-tracking support Morten Rasmussen
2015-07-21 15:41 ` [RFCv5, " Leo Yan
2015-07-22 13:31 ` Morten Rasmussen
2015-07-22 14:59 ` Leo Yan
2015-07-23 11:06 ` Morten Rasmussen
2015-07-23 14:22 ` Leo Yan [this message]
2015-07-24 9:43 ` Morten Rasmussen
2015-08-03 9:22 ` [RFCv5 PATCH " Vincent Guittot
2015-08-17 15:59 ` Dietmar Eggemann
2015-08-11 9:27 ` Peter Zijlstra
2015-08-14 16:08 ` Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 02/46] sched: Make load tracking frequency scale-invariant Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 03/46] arm: vexpress: Add CPU clock-frequencies to TC2 device-tree Morten Rasmussen
2015-07-08 12:36 ` Jon Medhurst (Tixy)
2015-07-10 13:35 ` Dietmar Eggemann
2015-07-07 18:23 ` [RFCv5 PATCH 04/46] sched: Convert arch_scale_cpu_capacity() from weak function to #define Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 05/46] arm: Update arch_scale_cpu_capacity() to reflect change to define Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 06/46] sched: Make usage tracking cpu scale-invariant Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 07/46] arm: Cpu invariant scheduler load-tracking support Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 08/46] sched: Get rid of scaling usage by cpu_capacity_orig Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 09/46] sched: Track blocked utilization contributions Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 10/46] sched: Include blocked utilization in usage tracking Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 11/46] sched: Remove blocked load and utilization contributions of dying tasks Morten Rasmussen
2015-07-22 6:51 ` Leo Yan
2015-07-22 13:45 ` Morten Rasmussen
2015-08-11 11:39 ` Peter Zijlstra
2015-08-11 14:58 ` Morten Rasmussen
2015-08-11 17:23 ` Peter Zijlstra
2015-08-12 9:08 ` Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 12/46] sched: Initialize CFS task load and usage before placing task on rq Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 13/46] sched: Documentation for scheduler energy cost model Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 14/46] sched: Make energy awareness a sched feature Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 15/46] sched: Introduce energy data structures Morten Rasmussen
2015-07-07 18:23 ` [RFCv5 PATCH 16/46] sched: Allocate and initialize " Morten Rasmussen
2015-08-12 10:04 ` Peter Zijlstra
2015-08-12 17:08 ` Dietmar Eggemann
2015-08-12 10:17 ` Peter Zijlstra
2015-08-12 17:09 ` Dietmar Eggemann
2015-08-12 17:23 ` Peter Zijlstra
2015-07-07 18:24 ` [RFCv5 PATCH 17/46] sched: Introduce SD_SHARE_CAP_STATES sched_domain flag Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 18/46] arm: topology: Define TC2 energy and provide it to the scheduler Morten Rasmussen
2015-08-12 10:33 ` Peter Zijlstra
2015-08-12 18:47 ` Dietmar Eggemann
2015-08-17 9:19 ` [RFCv5, " Leo Yan
2015-08-20 19:19 ` Dietmar Eggemann
2015-07-07 18:24 ` [RFCv5 PATCH 19/46] sched: Compute cpu capacity available at current frequency Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 20/46] sched: Relocated get_cpu_usage() and change return type Morten Rasmussen
2015-08-12 10:59 ` Peter Zijlstra
2015-08-12 14:40 ` Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 21/46] sched: Highest energy aware balancing sched_domain level pointer Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 22/46] sched: Calculate energy consumption of sched_group Morten Rasmussen
2015-08-13 15:34 ` Peter Zijlstra
2015-08-14 10:28 ` Morten Rasmussen
2015-09-02 17:19 ` Leo Yan
2015-09-17 16:41 ` Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 23/46] sched: Extend sched_group_energy to test load-balancing decisions Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 24/46] sched: Estimate energy impact of scheduling decisions Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 25/46] sched: Add over-utilization/tipping point indicator Morten Rasmussen
2015-08-13 17:35 ` Peter Zijlstra
2015-08-14 13:02 ` Morten Rasmussen
2015-09-29 20:08 ` Steve Muckle
2015-10-09 12:49 ` Morten Rasmussen
2015-08-17 13:10 ` Leo Yan
2015-07-07 18:24 ` [RFCv5 PATCH 26/46] sched: Store system-wide maximum cpu capacity in root domain Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 27/46] sched, cpuidle: Track cpuidle state index in the scheduler Morten Rasmussen
2015-07-21 6:41 ` Leo Yan
2015-07-21 15:16 ` Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 28/46] sched: Count number of shallower idle-states in struct sched_group_energy Morten Rasmussen
2015-08-13 18:10 ` Peter Zijlstra
2015-08-14 19:08 ` Sai Gurrappadi
2015-07-07 18:24 ` [RFCv5 PATCH 29/46] sched: Determine the current sched_group idle-state Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 30/46] sched: Add cpu capacity awareness to wakeup balancing Morten Rasmussen
2015-08-13 18:24 ` Peter Zijlstra
2015-08-14 16:20 ` Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 31/46] sched: Consider spare cpu capacity at task wake-up Morten Rasmussen
2015-07-21 0:37 ` Sai Gurrappadi
2015-07-21 15:12 ` Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 32/46] sched: Energy-aware wake-up task placement Morten Rasmussen
2015-07-17 0:10 ` Sai Gurrappadi
2015-07-20 15:38 ` Morten Rasmussen
2015-08-17 16:23 ` Leo Yan
2015-09-02 17:11 ` Leo Yan
2015-09-18 10:34 ` Dietmar Eggemann
2015-09-20 18:39 ` Steve Muckle
2015-09-20 22:03 ` Leo Yan
2015-09-29 0:15 ` Steve Muckle
2015-07-07 18:24 ` [RFCv5 PATCH 33/46] sched: Consider a not over-utilized energy-aware system as balanced Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 34/46] sched: Enable idle balance to pull single task towards cpu with higher capacity Morten Rasmussen
2015-08-15 9:15 ` Peter Zijlstra
2015-07-07 18:24 ` [RFCv5 PATCH 35/46] sched: Disable energy-unfriendly nohz kicks Morten Rasmussen
2015-08-15 9:33 ` Peter Zijlstra
2015-07-07 18:24 ` [RFCv5 PATCH 36/46] sched: Prevent unnecessary active balance of single task in sched group Morten Rasmussen
2015-08-15 9:46 ` Peter Zijlstra
2015-07-07 18:24 ` [RFCv5 PATCH 37/46] cpufreq: introduce cpufreq_driver_might_sleep Morten Rasmussen
2015-07-08 15:09 ` Michael Turquette
2015-07-07 18:24 ` [RFCv5 PATCH 38/46] sched: scheduler-driven cpu frequency selection Morten Rasmussen
2015-07-08 15:09 ` Michael Turquette
2015-08-11 2:14 ` Leo Yan
2015-08-11 8:59 ` Juri Lelli
2015-08-15 12:35 ` Peter Zijlstra
2015-09-04 13:27 ` Juri Lelli
2015-09-14 15:57 ` Juri Lelli
2015-09-15 13:45 ` Peter Zijlstra
2015-09-15 16:22 ` Juri Lelli
2015-08-15 13:05 ` Peter Zijlstra
2015-08-25 10:45 ` Juri Lelli
2015-10-08 0:14 ` Steve Muckle
2015-10-08 9:41 ` Juri Lelli
2015-09-28 16:48 ` Punit Agrawal
2015-09-29 0:26 ` Steve Muckle
2015-07-07 18:24 ` [RFCv5 PATCH 39/46] sched/cpufreq_sched: use static key for " Morten Rasmussen
2015-07-08 15:19 ` Michael Turquette
2015-07-10 9:50 ` Juri Lelli
2015-08-15 12:40 ` Peter Zijlstra
2015-07-07 18:24 ` [RFCv5 PATCH 40/46] sched/cpufreq_sched: compute freq_new based on capacity_orig_of() Morten Rasmussen
2015-07-08 15:22 ` Michael Turquette
2015-07-09 16:21 ` Juri Lelli
2015-08-15 12:46 ` Peter Zijlstra
2015-08-16 4:03 ` Michael Turquette
2015-08-16 20:24 ` Peter Zijlstra
2015-08-17 12:19 ` Juri Lelli
2015-10-13 19:47 ` Steve Muckle
2015-07-07 18:24 ` [RFCv5 PATCH 41/46] sched/fair: add triggers for OPP change requests Morten Rasmussen
2015-07-08 15:42 ` Michael Turquette
2015-07-09 16:52 ` Juri Lelli
2015-08-04 13:41 ` Vincent Guittot
2015-08-10 13:43 ` Juri Lelli
2015-08-10 15:07 ` Vincent Guittot
2015-08-11 9:08 ` Juri Lelli
2015-08-11 11:41 ` Vincent Guittot
2015-08-11 15:07 ` Juri Lelli
2015-08-11 16:37 ` Vincent Guittot
2015-08-12 15:15 ` Juri Lelli
2015-08-13 12:08 ` Vincent Guittot
2015-08-14 11:39 ` Juri Lelli
2015-08-17 9:43 ` Vincent Guittot
2015-08-15 12:48 ` Peter Zijlstra
2015-08-16 3:50 ` Michael Turquette
2015-08-17 18:22 ` Rafael J. Wysocki
2015-07-07 18:24 ` [RFCv5 PATCH 42/46] sched/{core,fair}: trigger OPP change request on fork() Morten Rasmussen
2015-07-07 18:24 ` [RFCv5 PATCH 43/46] sched/{fair,cpufreq_sched}: add reset_capacity interface Morten Rasmussen
2015-10-08 20:40 ` Steve Muckle
2015-10-09 9:14 ` Juri Lelli
2015-10-12 19:02 ` Steve Muckle
2015-07-07 18:24 ` [RFCv5 PATCH 44/46] sched/fair: jump to max OPP when crossing UP threshold Morten Rasmussen
2015-07-08 16:40 ` Michael Turquette
2015-07-08 16:47 ` Michael Turquette
2015-07-10 10:17 ` Juri Lelli
2015-07-07 18:24 ` [RFCv5 PATCH 45/46] sched/cpufreq_sched: modify pcpu_capacity handling Morten Rasmussen
2015-07-08 16:42 ` Michael Turquette
2015-07-09 16:55 ` Juri Lelli
2015-08-16 20:35 ` Peter Zijlstra
2015-08-17 11:16 ` Juri Lelli
2015-07-07 18:24 ` [RFCv5 PATCH 46/46] sched/fair: cpufreq_sched triggers for load balancing Morten Rasmussen
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=20150723142216.GA21773@leoy-linaro \
--to=leo.yan@linaro.org \
--cc=Dietmar.Eggemann@arm.com \
--cc=Juri.Lelli@arm.com \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mingo@redhat.com \
--cc=morten.rasmussen@arm.com \
--cc=mturquette@baylibre.com \
--cc=pang.xunlei@zte.com.cn \
--cc=peterz@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=sgurrappadi@nvidia.com \
--cc=vincent.guittot@linaro.org \
--cc=yuyang.du@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).