linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times
@ 2016-04-22  9:07 Wanpeng Li
  2016-04-22 12:04 ` Rafael J. Wysocki
  2016-04-28 10:26 ` [tip:sched/core] sched/cpufreq: Optimize " tip-bot for Wanpeng Li
  0 siblings, 2 replies; 4+ messages in thread
From: Wanpeng Li @ 2016-04-22  9:07 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra, Rafael J. Wysocki; +Cc: linux-kernel, Wanpeng Li

From: Wanpeng Li <wanpeng.li@hotmail.com>

Sometimes delta_exec is 0 due to update_curr() is called multiple times,
this is captured by:

	u64 delta_exec = rq_clock_task(rq) - curr->se.exec_start;

This patch optimizes the cpufreq update kicker by bailing out when nothing 
changed, it will benefit the upcoming schedutil, since otherwise it will 
(over)react to the special util/max combination.

Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
v1 -> v2:
 * add From: head
v2 -> v3:
 * update changelog

 kernel/sched/deadline.c | 8 ++++----
 kernel/sched/rt.c       | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index affd97e..8f9b5af 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -717,10 +717,6 @@ static void update_curr_dl(struct rq *rq)
 	if (!dl_task(curr) || !on_dl_rq(dl_se))
 		return;
 
-	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
-	if (cpu_of(rq) == smp_processor_id())
-		cpufreq_trigger_update(rq_clock(rq));
-
 	/*
 	 * Consumed budget is computed considering the time as
 	 * observed by schedulable tasks (excluding time spent
@@ -736,6 +732,10 @@ static void update_curr_dl(struct rq *rq)
 		return;
 	}
 
+	/* kick cpufreq (see the comment in linux/cpufreq.h). */
+	if (cpu_of(rq) == smp_processor_id())
+		cpufreq_trigger_update(rq_clock(rq));
+
 	schedstat_set(curr->se.statistics.exec_max,
 		      max(curr->se.statistics.exec_max, delta_exec));
 
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index c41ea7a..19e1306 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -953,14 +953,14 @@ static void update_curr_rt(struct rq *rq)
 	if (curr->sched_class != &rt_sched_class)
 		return;
 
-	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
-	if (cpu_of(rq) == smp_processor_id())
-		cpufreq_trigger_update(rq_clock(rq));
-
 	delta_exec = rq_clock_task(rq) - curr->se.exec_start;
 	if (unlikely((s64)delta_exec <= 0))
 		return;
 
+	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
+	if (cpu_of(rq) == smp_processor_id())
+		cpufreq_trigger_update(rq_clock(rq));
+
 	schedstat_set(curr->se.statistics.exec_max,
 		      max(curr->se.statistics.exec_max, delta_exec));
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times
  2016-04-22  9:07 [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times Wanpeng Li
@ 2016-04-22 12:04 ` Rafael J. Wysocki
  2016-04-25 14:31   ` Peter Zijlstra
  2016-04-28 10:26 ` [tip:sched/core] sched/cpufreq: Optimize " tip-bot for Wanpeng Li
  1 sibling, 1 reply; 4+ messages in thread
From: Rafael J. Wysocki @ 2016-04-22 12:04 UTC (permalink / raw)
  To: Wanpeng Li, Peter Zijlstra
  Cc: Ingo Molnar, linux-kernel, Wanpeng Li, Linux PM

[Added linux-pm to the CC - can you please do so for PM-related patches 
in the future?]

On 4/22/2016 11:07 AM, Wanpeng Li wrote:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
>
> Sometimes delta_exec is 0 due to update_curr() is called multiple times,
> this is captured by:
>
> 	u64 delta_exec = rq_clock_task(rq) - curr->se.exec_start;
>
> This patch optimizes the cpufreq update kicker by bailing out when nothing
> changed, it will benefit the upcoming schedutil, since otherwise it will
> (over)react to the special util/max combination.
>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>

The changelog looks better now, thanks!

Peter, do I think correctly that you're going to take care of this one?  
Or do you want me to take it?

> ---
> v1 -> v2:
>   * add From: head
> v2 -> v3:
>   * update changelog
>
>   kernel/sched/deadline.c | 8 ++++----
>   kernel/sched/rt.c       | 8 ++++----
>   2 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
> index affd97e..8f9b5af 100644
> --- a/kernel/sched/deadline.c
> +++ b/kernel/sched/deadline.c
> @@ -717,10 +717,6 @@ static void update_curr_dl(struct rq *rq)
>   	if (!dl_task(curr) || !on_dl_rq(dl_se))
>   		return;
>   
> -	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
> -	if (cpu_of(rq) == smp_processor_id())
> -		cpufreq_trigger_update(rq_clock(rq));
> -
>   	/*
>   	 * Consumed budget is computed considering the time as
>   	 * observed by schedulable tasks (excluding time spent
> @@ -736,6 +732,10 @@ static void update_curr_dl(struct rq *rq)
>   		return;
>   	}
>   
> +	/* kick cpufreq (see the comment in linux/cpufreq.h). */
> +	if (cpu_of(rq) == smp_processor_id())
> +		cpufreq_trigger_update(rq_clock(rq));
> +
>   	schedstat_set(curr->se.statistics.exec_max,
>   		      max(curr->se.statistics.exec_max, delta_exec));
>   
> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
> index c41ea7a..19e1306 100644
> --- a/kernel/sched/rt.c
> +++ b/kernel/sched/rt.c
> @@ -953,14 +953,14 @@ static void update_curr_rt(struct rq *rq)
>   	if (curr->sched_class != &rt_sched_class)
>   		return;
>   
> -	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
> -	if (cpu_of(rq) == smp_processor_id())
> -		cpufreq_trigger_update(rq_clock(rq));
> -
>   	delta_exec = rq_clock_task(rq) - curr->se.exec_start;
>   	if (unlikely((s64)delta_exec <= 0))
>   		return;
>   
> +	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
> +	if (cpu_of(rq) == smp_processor_id())
> +		cpufreq_trigger_update(rq_clock(rq));
> +
>   	schedstat_set(curr->se.statistics.exec_max,
>   		      max(curr->se.statistics.exec_max, delta_exec));
>   

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times
  2016-04-22 12:04 ` Rafael J. Wysocki
@ 2016-04-25 14:31   ` Peter Zijlstra
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Zijlstra @ 2016-04-25 14:31 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Wanpeng Li, Ingo Molnar, linux-kernel, Wanpeng Li, Linux PM

On Fri, Apr 22, 2016 at 02:04:56PM +0200, Rafael J. Wysocki wrote:
> [Added linux-pm to the CC - can you please do so for PM-related patches in
> the future?]
> 
> On 4/22/2016 11:07 AM, Wanpeng Li wrote:
> >From: Wanpeng Li <wanpeng.li@hotmail.com>
> >
> >Sometimes delta_exec is 0 due to update_curr() is called multiple times,
> >this is captured by:
> >
> >	u64 delta_exec = rq_clock_task(rq) - curr->se.exec_start;
> >
> >This patch optimizes the cpufreq update kicker by bailing out when nothing
> >changed, it will benefit the upcoming schedutil, since otherwise it will
> >(over)react to the special util/max combination.
> >
> >Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> 
> The changelog looks better now, thanks!
> 
> Peter, do I think correctly that you're going to take care of this one?  Or
> do you want me to take it?

YEah, looks fine. I'll take it.

Thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tip:sched/core] sched/cpufreq: Optimize cpufreq update kicker to avoid update multiple times
  2016-04-22  9:07 [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times Wanpeng Li
  2016-04-22 12:04 ` Rafael J. Wysocki
@ 2016-04-28 10:26 ` tip-bot for Wanpeng Li
  1 sibling, 0 replies; 4+ messages in thread
From: tip-bot for Wanpeng Li @ 2016-04-28 10:26 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, peterz, linux-kernel, hpa, rafael.j.wysocki, mingo,
	wanpeng.li

Commit-ID:  594dd290cf5403a9a5818619dfff42d8e8e0518e
Gitweb:     http://git.kernel.org/tip/594dd290cf5403a9a5818619dfff42d8e8e0518e
Author:     Wanpeng Li <wanpeng.li@hotmail.com>
AuthorDate: Fri, 22 Apr 2016 17:07:24 +0800
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 28 Apr 2016 10:39:54 +0200

sched/cpufreq: Optimize cpufreq update kicker to avoid update multiple times

Sometimes delta_exec is 0 due to update_curr() is called multiple times,
this is captured by:

	u64 delta_exec = rq_clock_task(rq) - curr->se.exec_start;

This patch optimizes the cpufreq update kicker by bailing out when nothing
changed, it will benefit the upcoming schedutil, since otherwise it will
(over)react to the special util/max combination.

Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1461316044-9520-1-git-send-email-wanpeng.li@hotmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/sched/deadline.c | 8 ++++----
 kernel/sched/rt.c       | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index affd97e..8f9b5af 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -717,10 +717,6 @@ static void update_curr_dl(struct rq *rq)
 	if (!dl_task(curr) || !on_dl_rq(dl_se))
 		return;
 
-	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
-	if (cpu_of(rq) == smp_processor_id())
-		cpufreq_trigger_update(rq_clock(rq));
-
 	/*
 	 * Consumed budget is computed considering the time as
 	 * observed by schedulable tasks (excluding time spent
@@ -736,6 +732,10 @@ static void update_curr_dl(struct rq *rq)
 		return;
 	}
 
+	/* kick cpufreq (see the comment in linux/cpufreq.h). */
+	if (cpu_of(rq) == smp_processor_id())
+		cpufreq_trigger_update(rq_clock(rq));
+
 	schedstat_set(curr->se.statistics.exec_max,
 		      max(curr->se.statistics.exec_max, delta_exec));
 
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index c41ea7a..19e1306 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -953,14 +953,14 @@ static void update_curr_rt(struct rq *rq)
 	if (curr->sched_class != &rt_sched_class)
 		return;
 
-	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
-	if (cpu_of(rq) == smp_processor_id())
-		cpufreq_trigger_update(rq_clock(rq));
-
 	delta_exec = rq_clock_task(rq) - curr->se.exec_start;
 	if (unlikely((s64)delta_exec <= 0))
 		return;
 
+	/* Kick cpufreq (see the comment in linux/cpufreq.h). */
+	if (cpu_of(rq) == smp_processor_id())
+		cpufreq_trigger_update(rq_clock(rq));
+
 	schedstat_set(curr->se.statistics.exec_max,
 		      max(curr->se.statistics.exec_max, delta_exec));
 

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-04-28 10:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-22  9:07 [PATCH v3] sched/cpufreq: optimize cpufreq update kicker to avoid update multiple times Wanpeng Li
2016-04-22 12:04 ` Rafael J. Wysocki
2016-04-25 14:31   ` Peter Zijlstra
2016-04-28 10:26 ` [tip:sched/core] sched/cpufreq: Optimize " tip-bot for Wanpeng Li

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).