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: Tue, 25 Nov 2014 10:24:39 +0800	[thread overview]
Message-ID: <5473E867.6030607@gmail.com> (raw)
In-Reply-To: <1415033687-23294-6-git-send-email-vincent.guittot@linaro.org>

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()?

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>,
	peterz@infradead.org, mingo@kernel.org,
	linux-kernel@vger.kernel.org, preeti@linux.vnet.ibm.com,
	Morten.Rasmussen@arm.com, kamalesh@linux.vnet.ibm.com,
	linux-arm-kernel@lists.infradead.org
Cc: riel@redhat.com, efault@gmx.de, nicolas.pitre@linaro.org,
	linaro-kernel@lists.linaro.org
Subject: Re: [PATCH v9 05/10] sched: make scale_rt invariant with frequency
Date: Tue, 25 Nov 2014 10:24:39 +0800	[thread overview]
Message-ID: <5473E867.6030607@gmail.com> (raw)
In-Reply-To: <1415033687-23294-6-git-send-email-vincent.guittot@linaro.org>

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()?

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


  parent reply	other threads:[~2014-11-25  2:24 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 [this message]
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
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=5473E867.6030607@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.