All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending
@ 2021-04-22 17:02 Rik van Riel
  2021-04-22 17:09 ` Vincent Guittot
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Rik van Riel @ 2021-04-22 17:02 UTC (permalink / raw)
  To: linux-kernel
  Cc: kernel-team, Vincent Guittot, Valentin Schneider, Peter Zijlstra,
	Ingo Molnar, Dietmar Eggemann, Mel Gorman

The try_to_wake_up function has an optimization where it can queue
a task for wakeup on its previous CPU, if the task is still in the
middle of going to sleep inside schedule().

Once schedule() re-enables IRQs, the task will be woken up with an
IPI, and placed back on the runqueue.

If we have such a wakeup pending, there is no need to search other
CPUs for runnable tasks. Just skip (or bail out early from) newidle
balancing, and run the just woken up task.

For a memcache like workload test, this reduces total CPU use by
about 2%, proportionally split between user and system time,
and p99 and p95 application response time by 10% on average.
The schedstats run_delay number shows a similar improvement.

Signed-off-by: Rik van Riel <riel@surriel.com>
---
 kernel/sched/fair.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 69680158963f..6a18688a37f8 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -10594,6 +10594,14 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
 	u64 curr_cost = 0;
 
 	update_misfit_status(NULL, this_rq);
+
+	/*
+	 * There is a task waiting to run. No need to search for one.
+	 * Return 0; the task will be enqueued when switching to idle.
+	 */
+	if (this_rq->ttwu_pending)
+		return 0;
+
 	/*
 	 * We must set idle_stamp _before_ calling idle_balance(), such that we
 	 * measure the duration of idle_balance() as idle time.
@@ -10661,7 +10669,8 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
 		 * Stop searching for tasks to pull if there are
 		 * now runnable tasks on this rq.
 		 */
-		if (pulled_task || this_rq->nr_running > 0)
+		if (pulled_task || this_rq->nr_running > 0 ||
+		    this_rq->ttwu_pending)
 			break;
 	}
 	rcu_read_unlock();
-- 
2.25.4



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

* Re: [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending
  2021-04-22 17:02 [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending Rik van Riel
@ 2021-04-22 17:09 ` Vincent Guittot
  2021-05-04  9:21   ` Peter Zijlstra
  2021-04-24  9:30 ` Mel Gorman
  2021-05-12 10:28 ` [tip: sched/core] " tip-bot2 for Rik van Riel
  2 siblings, 1 reply; 5+ messages in thread
From: Vincent Guittot @ 2021-04-22 17:09 UTC (permalink / raw)
  To: Rik van Riel
  Cc: linux-kernel, Kernel Team, Valentin Schneider, Peter Zijlstra,
	Ingo Molnar, Dietmar Eggemann, Mel Gorman

On Thu, 22 Apr 2021 at 19:02, Rik van Riel <riel@surriel.com> wrote:
>
> The try_to_wake_up function has an optimization where it can queue
> a task for wakeup on its previous CPU, if the task is still in the
> middle of going to sleep inside schedule().
>
> Once schedule() re-enables IRQs, the task will be woken up with an
> IPI, and placed back on the runqueue.
>
> If we have such a wakeup pending, there is no need to search other
> CPUs for runnable tasks. Just skip (or bail out early from) newidle
> balancing, and run the just woken up task.
>
> For a memcache like workload test, this reduces total CPU use by
> about 2%, proportionally split between user and system time,
> and p99 and p95 application response time by 10% on average.
> The schedstats run_delay number shows a similar improvement.
>
> Signed-off-by: Rik van Riel <riel@surriel.com>

Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

> ---
>  kernel/sched/fair.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 69680158963f..6a18688a37f8 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -10594,6 +10594,14 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
>         u64 curr_cost = 0;
>
>         update_misfit_status(NULL, this_rq);
> +
> +       /*
> +        * There is a task waiting to run. No need to search for one.
> +        * Return 0; the task will be enqueued when switching to idle.
> +        */
> +       if (this_rq->ttwu_pending)
> +               return 0;
> +
>         /*
>          * We must set idle_stamp _before_ calling idle_balance(), such that we
>          * measure the duration of idle_balance() as idle time.
> @@ -10661,7 +10669,8 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
>                  * Stop searching for tasks to pull if there are
>                  * now runnable tasks on this rq.
>                  */
> -               if (pulled_task || this_rq->nr_running > 0)
> +               if (pulled_task || this_rq->nr_running > 0 ||
> +                   this_rq->ttwu_pending)
>                         break;
>         }
>         rcu_read_unlock();
> --
> 2.25.4
>
>

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

* Re: [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending
  2021-04-22 17:02 [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending Rik van Riel
  2021-04-22 17:09 ` Vincent Guittot
@ 2021-04-24  9:30 ` Mel Gorman
  2021-05-12 10:28 ` [tip: sched/core] " tip-bot2 for Rik van Riel
  2 siblings, 0 replies; 5+ messages in thread
From: Mel Gorman @ 2021-04-24  9:30 UTC (permalink / raw)
  To: Rik van Riel
  Cc: linux-kernel, kernel-team, Vincent Guittot, Valentin Schneider,
	Peter Zijlstra, Ingo Molnar, Dietmar Eggemann

On Thu, Apr 22, 2021 at 01:02:36PM -0400, Rik van Riel wrote:
> The try_to_wake_up function has an optimization where it can queue
> a task for wakeup on its previous CPU, if the task is still in the
> middle of going to sleep inside schedule().
> 
> Once schedule() re-enables IRQs, the task will be woken up with an
> IPI, and placed back on the runqueue.
> 
> If we have such a wakeup pending, there is no need to search other
> CPUs for runnable tasks. Just skip (or bail out early from) newidle
> balancing, and run the just woken up task.
> 
> For a memcache like workload test, this reduces total CPU use by
> about 2%, proportionally split between user and system time,
> and p99 and p95 application response time by 10% on average.
> The schedstats run_delay number shows a similar improvement.
> 
> Signed-off-by: Rik van Riel <riel@surriel.com>

Acked-by: Mel Gorman <mgorman@suse.de>

-- 
Mel Gorman
SUSE Labs

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

* Re: [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending
  2021-04-22 17:09 ` Vincent Guittot
@ 2021-05-04  9:21   ` Peter Zijlstra
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Zijlstra @ 2021-05-04  9:21 UTC (permalink / raw)
  To: Vincent Guittot
  Cc: Rik van Riel, linux-kernel, Kernel Team, Valentin Schneider,
	Ingo Molnar, Dietmar Eggemann, Mel Gorman

On Thu, Apr 22, 2021 at 07:09:46PM +0200, Vincent Guittot wrote:
> On Thu, 22 Apr 2021 at 19:02, Rik van Riel <riel@surriel.com> wrote:
> >
> > The try_to_wake_up function has an optimization where it can queue
> > a task for wakeup on its previous CPU, if the task is still in the
> > middle of going to sleep inside schedule().
> >
> > Once schedule() re-enables IRQs, the task will be woken up with an
> > IPI, and placed back on the runqueue.
> >
> > If we have such a wakeup pending, there is no need to search other
> > CPUs for runnable tasks. Just skip (or bail out early from) newidle
> > balancing, and run the just woken up task.
> >
> > For a memcache like workload test, this reduces total CPU use by
> > about 2%, proportionally split between user and system time,
> > and p99 and p95 application response time by 10% on average.
> > The schedstats run_delay number shows a similar improvement.
> >
> > Signed-off-by: Rik van Riel <riel@surriel.com>
> 
> Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

Thanks!

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

* [tip: sched/core] sched,fair: Skip newidle_balance if a wakeup is pending
  2021-04-22 17:02 [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending Rik van Riel
  2021-04-22 17:09 ` Vincent Guittot
  2021-04-24  9:30 ` Mel Gorman
@ 2021-05-12 10:28 ` tip-bot2 for Rik van Riel
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot2 for Rik van Riel @ 2021-05-12 10:28 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Rik van Riel, Peter Zijlstra (Intel),
	Vincent Guittot, Mel Gorman, x86, linux-kernel

The following commit has been merged into the sched/core branch of tip:

Commit-ID:     e5e678e4fea26d73444f4427cbbaeab4fa79ecee
Gitweb:        https://git.kernel.org/tip/e5e678e4fea26d73444f4427cbbaeab4fa79ecee
Author:        Rik van Riel <riel@surriel.com>
AuthorDate:    Thu, 22 Apr 2021 13:02:36 -04:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 12 May 2021 11:43:23 +02:00

sched,fair: Skip newidle_balance if a wakeup is pending

The try_to_wake_up function has an optimization where it can queue
a task for wakeup on its previous CPU, if the task is still in the
middle of going to sleep inside schedule().

Once schedule() re-enables IRQs, the task will be woken up with an
IPI, and placed back on the runqueue.

If we have such a wakeup pending, there is no need to search other
CPUs for runnable tasks. Just skip (or bail out early from) newidle
balancing, and run the just woken up task.

For a memcache like workload test, this reduces total CPU use by
about 2%, proportionally split between user and system time,
and p99 and p95 application response time by 10% on average.
The schedstats run_delay number shows a similar improvement.

Signed-off-by: Rik van Riel <riel@surriel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
Acked-by: Mel Gorman <mgorman@suse.de>
Link: https://lkml.kernel.org/r/20210422130236.0bb353df@imladris.surriel.com
---
 kernel/sched/fair.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 3248e24..d10c6cc 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -10592,6 +10592,14 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
 	u64 curr_cost = 0;
 
 	update_misfit_status(NULL, this_rq);
+
+	/*
+	 * There is a task waiting to run. No need to search for one.
+	 * Return 0; the task will be enqueued when switching to idle.
+	 */
+	if (this_rq->ttwu_pending)
+		return 0;
+
 	/*
 	 * We must set idle_stamp _before_ calling idle_balance(), such that we
 	 * measure the duration of idle_balance() as idle time.
@@ -10657,7 +10665,8 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf)
 		 * Stop searching for tasks to pull if there are
 		 * now runnable tasks on this rq.
 		 */
-		if (pulled_task || this_rq->nr_running > 0)
+		if (pulled_task || this_rq->nr_running > 0 ||
+		    this_rq->ttwu_pending)
 			break;
 	}
 	rcu_read_unlock();

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

end of thread, other threads:[~2021-05-12 10:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-22 17:02 [PATCH v4] sched,fair: Skip newidle_balance if a wakeup is pending Rik van Riel
2021-04-22 17:09 ` Vincent Guittot
2021-05-04  9:21   ` Peter Zijlstra
2021-04-24  9:30 ` Mel Gorman
2021-05-12 10:28 ` [tip: sched/core] " tip-bot2 for Rik van Riel

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.