All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernellwp@gmail.com (Wanpeng Li)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v9 05/10] sched: make scale_rt invariant with frequency
Date: Wed, 26 Nov 2014 13:18:05 +0800	[thread overview]
Message-ID: <5475628D.2080301@gmail.com> (raw)
In-Reply-To: <CAKfTPtCSJhTR2=1_g2UVxeEEKocBs+ouco4Z5SRO2oRSJ-O2mA@mail.gmail.com>

Hi Vincent,
On 11/25/14, 9:52 PM, Vincent Guittot wrote:
> On 25 November 2014 at 03:24, Wanpeng Li <kernellwp@gmail.com> wrote:
>> Hi Vincent,
>> On 11/4/14, 12:54 AM, Vincent Guittot wrote:
>>> The average running time of RT tasks is used to estimate the remaining
>>> compute
>>> capacity for CFS tasks. This remaining capacity is the original capacity
>>> scaled
>>> down by a factor (aka scale_rt_capacity). This estimation of available
>>> capacity
>>> must also be invariant with frequency scaling.
>>>
>>> A frequency scaling factor is applied on the running time of the RT tasks
>>> for
>>> computing scale_rt_capacity.
>>>
>>> In sched_rt_avg_update, we scale the RT execution time like below:
>>> rq->rt_avg += rt_delta * arch_scale_freq_capacity() >>
>>> SCHED_CAPACITY_SHIFT
>>>
>>> Then, scale_rt_capacity can be summarized by:
>>> scale_rt_capacity = SCHED_CAPACITY_SCALE -
>>>                  ((rq->rt_avg << SCHED_CAPACITY_SHIFT) / period)
>>
>> The 'period' aka 'total' in the scale_rt_capacity(), why it is
>> sched_avg_period() + delta instead of sched_avg_period()?
> The default value of sched_avg_period is 1sec which is "long" so we
> take into account the time consumed by RT tasks in the ongoing period
> .

Do you mean 'sched_avg_period() + delta' should be replaced by 'delta' 
since sched_avg_period() is "long"?

Regards,
Wanpeng Li

>
>> Regards,
>> Wanpeng Li
>>
>>
>>> We can optimize by removing right and left shift in the computation of
>>> rq->rt_avg
>>> and scale_rt_capacity
>>>
>>> The call to arch_scale_frequency_capacity in the rt scheduling path might
>>> be
>>> a concern for RT folks because I'm not sure whether we can rely on
>>> arch_scale_freq_capacity to be short and efficient ?
>>>
>>> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
>>> ---
>>>    kernel/sched/fair.c  | 17 +++++------------
>>>    kernel/sched/sched.h |  4 +++-
>>>    2 files changed, 8 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>>> index a5039da..b37c27b 100644
>>> --- a/kernel/sched/fair.c
>>> +++ b/kernel/sched/fair.c
>>> @@ -5785,7 +5785,7 @@ unsigned long __weak arch_scale_cpu_capacity(struct
>>> sched_domain *sd, int cpu)
>>>    static unsigned long scale_rt_capacity(int cpu)
>>>    {
>>>          struct rq *rq = cpu_rq(cpu);
>>> -       u64 total, available, age_stamp, avg;
>>> +       u64 total, used, age_stamp, avg;
>>>          s64 delta;
>>>          /*
>>> @@ -5801,19 +5801,12 @@ static unsigned long scale_rt_capacity(int cpu)
>>>          total = sched_avg_period() + delta;
>>>    -     if (unlikely(total < avg)) {
>>> -               /* Ensures that capacity won't end up being negative */
>>> -               available = 0;
>>> -       } else {
>>> -               available = total - avg;
>>> -       }
>>> +       used = div_u64(avg, total);
>>>    -     if (unlikely((s64)total < SCHED_CAPACITY_SCALE))
>>> -               total = SCHED_CAPACITY_SCALE;
>>> +       if (likely(used < SCHED_CAPACITY_SCALE))
>>> +               return SCHED_CAPACITY_SCALE - used;
>>>    -     total >>= SCHED_CAPACITY_SHIFT;
>>> -
>>> -       return div_u64(available, total);
>>> +       return 1;
>>>    }
>>>      static void update_cpu_capacity(struct sched_domain *sd, int cpu)
>>> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
>>> index c34bd11..fc5b152 100644
>>> --- a/kernel/sched/sched.h
>>> +++ b/kernel/sched/sched.h
>>> @@ -1312,9 +1312,11 @@ static inline int hrtick_enabled(struct rq *rq)
>>>      #ifdef CONFIG_SMP
>>>    extern void sched_avg_update(struct rq *rq);
>>> +extern unsigned long arch_scale_freq_capacity(struct sched_domain *sd,
>>> int cpu);
>>> +
>>>    static inline void sched_rt_avg_update(struct rq *rq, u64 rt_delta)
>>>    {
>>> -       rq->rt_avg += rt_delta;
>>> +       rq->rt_avg += rt_delta * arch_scale_freq_capacity(NULL,
>>> cpu_of(rq));
>>>          sched_avg_update(rq);
>>>    }
>>>    #else
>>

WARNING: multiple messages have this Message-ID (diff)
From: Wanpeng Li <kernellwp@gmail.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Preeti U Murthy <preeti@linux.vnet.ibm.com>,
	Morten Rasmussen <Morten.Rasmussen@arm.com>,
	Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>,
	LAK <linux-arm-kernel@lists.infradead.org>,
	Rik van Riel <riel@redhat.com>, Mike Galbraith <efault@gmx.de>,
	Nicolas Pitre <nicolas.pitre@linaro.org>,
	"linaro-kernel@lists.linaro.org" <linaro-kernel@lists.linaro.org>
Subject: Re: [PATCH v9 05/10] sched: make scale_rt invariant with frequency
Date: Wed, 26 Nov 2014 13:18:05 +0800	[thread overview]
Message-ID: <5475628D.2080301@gmail.com> (raw)
In-Reply-To: <CAKfTPtCSJhTR2=1_g2UVxeEEKocBs+ouco4Z5SRO2oRSJ-O2mA@mail.gmail.com>

Hi Vincent,
On 11/25/14, 9:52 PM, Vincent Guittot wrote:
> On 25 November 2014 at 03:24, Wanpeng Li <kernellwp@gmail.com> wrote:
>> Hi Vincent,
>> On 11/4/14, 12:54 AM, Vincent Guittot wrote:
>>> The average running time of RT tasks is used to estimate the remaining
>>> compute
>>> capacity for CFS tasks. This remaining capacity is the original capacity
>>> scaled
>>> down by a factor (aka scale_rt_capacity). This estimation of available
>>> capacity
>>> must also be invariant with frequency scaling.
>>>
>>> A frequency scaling factor is applied on the running time of the RT tasks
>>> for
>>> computing scale_rt_capacity.
>>>
>>> In sched_rt_avg_update, we scale the RT execution time like below:
>>> rq->rt_avg += rt_delta * arch_scale_freq_capacity() >>
>>> SCHED_CAPACITY_SHIFT
>>>
>>> Then, scale_rt_capacity can be summarized by:
>>> scale_rt_capacity = SCHED_CAPACITY_SCALE -
>>>                  ((rq->rt_avg << SCHED_CAPACITY_SHIFT) / period)
>>
>> The 'period' aka 'total' in the scale_rt_capacity(), why it is
>> sched_avg_period() + delta instead of sched_avg_period()?
> The default value of sched_avg_period is 1sec which is "long" so we
> take into account the time consumed by RT tasks in the ongoing period
> .

Do you mean 'sched_avg_period() + delta' should be replaced by 'delta' 
since sched_avg_period() is "long"?

Regards,
Wanpeng Li

>
>> Regards,
>> Wanpeng Li
>>
>>
>>> We can optimize by removing right and left shift in the computation of
>>> rq->rt_avg
>>> and scale_rt_capacity
>>>
>>> The call to arch_scale_frequency_capacity in the rt scheduling path might
>>> be
>>> a concern for RT folks because I'm not sure whether we can rely on
>>> arch_scale_freq_capacity to be short and efficient ?
>>>
>>> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
>>> ---
>>>    kernel/sched/fair.c  | 17 +++++------------
>>>    kernel/sched/sched.h |  4 +++-
>>>    2 files changed, 8 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>>> index a5039da..b37c27b 100644
>>> --- a/kernel/sched/fair.c
>>> +++ b/kernel/sched/fair.c
>>> @@ -5785,7 +5785,7 @@ unsigned long __weak arch_scale_cpu_capacity(struct
>>> sched_domain *sd, int cpu)
>>>    static unsigned long scale_rt_capacity(int cpu)
>>>    {
>>>          struct rq *rq = cpu_rq(cpu);
>>> -       u64 total, available, age_stamp, avg;
>>> +       u64 total, used, age_stamp, avg;
>>>          s64 delta;
>>>          /*
>>> @@ -5801,19 +5801,12 @@ static unsigned long scale_rt_capacity(int cpu)
>>>          total = sched_avg_period() + delta;
>>>    -     if (unlikely(total < avg)) {
>>> -               /* Ensures that capacity won't end up being negative */
>>> -               available = 0;
>>> -       } else {
>>> -               available = total - avg;
>>> -       }
>>> +       used = div_u64(avg, total);
>>>    -     if (unlikely((s64)total < SCHED_CAPACITY_SCALE))
>>> -               total = SCHED_CAPACITY_SCALE;
>>> +       if (likely(used < SCHED_CAPACITY_SCALE))
>>> +               return SCHED_CAPACITY_SCALE - used;
>>>    -     total >>= SCHED_CAPACITY_SHIFT;
>>> -
>>> -       return div_u64(available, total);
>>> +       return 1;
>>>    }
>>>      static void update_cpu_capacity(struct sched_domain *sd, int cpu)
>>> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
>>> index c34bd11..fc5b152 100644
>>> --- a/kernel/sched/sched.h
>>> +++ b/kernel/sched/sched.h
>>> @@ -1312,9 +1312,11 @@ static inline int hrtick_enabled(struct rq *rq)
>>>      #ifdef CONFIG_SMP
>>>    extern void sched_avg_update(struct rq *rq);
>>> +extern unsigned long arch_scale_freq_capacity(struct sched_domain *sd,
>>> int cpu);
>>> +
>>>    static inline void sched_rt_avg_update(struct rq *rq, u64 rt_delta)
>>>    {
>>> -       rq->rt_avg += rt_delta;
>>> +       rq->rt_avg += rt_delta * arch_scale_freq_capacity(NULL,
>>> cpu_of(rq));
>>>          sched_avg_update(rq);
>>>    }
>>>    #else
>>


  reply	other threads:[~2014-11-26  5:18 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-03 16:54 [PATCH v9 00/10] sched: consolidation of CPU capacity and usage Vincent Guittot
2014-11-03 16:54 ` Vincent Guittot
2014-11-03 16:54 ` [PATCH v9 01/10] sched: add utilization_avg_contrib Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:34   ` Morten Rasmussen
2014-11-21 12:34     ` Morten Rasmussen
2014-11-24 14:04     ` Vincent Guittot
2014-11-24 14:04       ` Vincent Guittot
2014-11-24 17:34       ` Morten Rasmussen
2014-11-24 17:34         ` Morten Rasmussen
2014-11-03 16:54 ` [PATCH v9 02/10] sched: Track group sched_entity usage contributions Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:35   ` Morten Rasmussen
2014-11-21 12:35     ` Morten Rasmussen
2014-11-24 14:04     ` Vincent Guittot
2014-11-24 14:04       ` Vincent Guittot
2014-11-24 15:39       ` Morten Rasmussen
2014-11-24 15:39         ` Morten Rasmussen
2014-11-03 16:54 ` [PATCH v9 03/10] sched: remove frequency scaling from cpu_capacity Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:35   ` Morten Rasmussen
2014-11-21 12:35     ` Morten Rasmussen
2014-11-03 16:54 ` [PATCH v9 04/10] sched: Make sched entity usage tracking scale-invariant Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:35   ` Morten Rasmussen
2014-11-21 12:35     ` Morten Rasmussen
2014-11-26 16:05     ` Dietmar Eggemann
2014-11-26 16:05       ` Dietmar Eggemann
2014-11-03 16:54 ` [PATCH v9 05/10] sched: make scale_rt invariant with frequency Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:35   ` Morten Rasmussen
2014-11-21 12:35     ` Morten Rasmussen
2014-11-24 14:24     ` Vincent Guittot
2014-11-24 14:24       ` Vincent Guittot
2014-11-24 17:05       ` Morten Rasmussen
2014-11-24 17:05         ` Morten Rasmussen
2014-11-25 13:48         ` Vincent Guittot
2014-11-25 13:48           ` Vincent Guittot
2014-11-26 11:57           ` Morten Rasmussen
2014-11-26 11:57             ` Morten Rasmussen
2014-11-25  2:24   ` Wanpeng Li
2014-11-25  2:24     ` Wanpeng Li
2014-11-25 13:52     ` Vincent Guittot
2014-11-25 13:52       ` Vincent Guittot
2014-11-26  5:18       ` Wanpeng Li [this message]
2014-11-26  5:18         ` Wanpeng Li
2014-11-26  8:27         ` Vincent Guittot
2014-11-26  8:27           ` Vincent Guittot
2014-11-03 16:54 ` [PATCH v9 06/10] sched: add per rq cpu_capacity_orig Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-03 16:54 ` [PATCH v9 07/10] sched: get CPU's usage statistic Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:36   ` Morten Rasmussen
2014-11-21 12:36     ` Morten Rasmussen
2014-11-03 16:54 ` [PATCH v9 08/10] sched: replace capacity_factor by usage Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-19 15:15   ` pang.xunlei
2014-11-19 15:15     ` pang.xunlei
2014-11-19 17:30     ` Vincent Guittot
2014-11-19 17:30       ` Vincent Guittot
2014-11-21 12:37   ` Morten Rasmussen
2014-11-21 12:37     ` Morten Rasmussen
2014-11-24 14:41     ` Vincent Guittot
2014-11-24 14:41       ` Vincent Guittot
2014-11-24 17:16       ` Morten Rasmussen
2014-11-24 17:16         ` Morten Rasmussen
2014-11-03 16:54 ` [PATCH v9 09/10] sched: add SD_PREFER_SIBLING for SMT level Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-03 16:54 ` [PATCH v9 10/10] sched: move cfs task on a CPU with higher capacity Vincent Guittot
2014-11-03 16:54   ` Vincent Guittot
2014-11-21 12:37   ` Morten Rasmussen
2014-11-21 12:37     ` Morten Rasmussen
2014-11-24 14:45     ` Vincent Guittot
2014-11-24 14:45       ` Vincent Guittot
2014-11-24 17:30       ` Morten Rasmussen
2014-11-24 17:30         ` Morten Rasmussen
2014-11-21 12:34 ` [PATCH v9 00/10] sched: consolidation of CPU capacity and usage Morten Rasmussen
2014-11-21 12:34   ` 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=5475628D.2080301@gmail.com \
    --to=kernellwp@gmail.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.