All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: peterz@infradead.org, mingo@kernel.org
Cc: linux-kernel@vger.kernel.org, linaro-kernel@lists.linaro.org,
	alex.shi@linaro.org
Subject: [PATCH 4/4] sched: Idle task shortcut optimization
Date: Fri, 17 Jan 2014 10:04:04 +0100	[thread overview]
Message-ID: <1389949444-14821-4-git-send-email-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <1389949444-14821-1-git-send-email-daniel.lezcano@linaro.org>

With the previous patch, we have no ambiguity on going to idle. So we can pick
directly the idle task instead of looking up all the domains which will in any
case return no task except the idle_task.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 kernel/sched/core.c      |   43 ++++++++++++++++++++++++++++++++++++++-----
 kernel/sched/idle_task.c |   15 +++++----------
 2 files changed, 43 insertions(+), 15 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index b7e3635..c7a8f4e 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2586,7 +2586,43 @@ pick_next_task(struct rq *rq)
 			return p;
 	}
 
-	BUG(); /* the idle class will always have a runnable task */
+	/*
+	 * We must have at least one task to run, the idle task is
+	 * returned by the shortcut in pick_next_task_or_idle. If we
+	 * fall here, we don't have any task to run, so something is
+	 * wrong when we thought the cpu was not going to idle.
+	 */
+	BUG();
+}
+
+static inline struct task_struct *pick_next_task_or_idle(struct rq *rq)
+{
+	if (likely(rq->nr_running))
+		return pick_next_task(rq);
+
+	rq->idle_stamp = 0;
+
+	/*
+	 * If there is a task balanced on this cpu, pick the next task,
+	 * otherwise fall in the optimization by picking the idle task
+	 * directly.
+	 */
+	if (idle_balance(rq))
+		return pick_next_task(rq);
+
+	rq->idle_stamp = rq_clock(rq);
+
+	/*
+	 * Optimization: pick_next_task will return rq->idle in any case but
+	 * after walking through the different sched domains. Let's add a
+	 * shortcut to directly return the idle task.
+	 */
+	schedstat_inc(rq, sched_goidle);
+#ifdef CONFIG_SMP
+	/* Trigger the post schedule to do an idle_enter for CFS */
+	rq->post_schedule = 1;
+#endif
+	return rq->idle;
 }
 
 /*
@@ -2679,11 +2715,8 @@ need_resched:
 
 	pre_schedule(rq, prev);
 
-	if (unlikely(!rq->nr_running))
-		rq->idle_stamp = idle_balance(rq) ? 0 : rq_clock(rq);
-
 	put_prev_task(rq, prev);
-	next = pick_next_task(rq);
+	next = pick_next_task_or_idle(rq);
 	clear_tsk_need_resched(prev);
 	clear_preempt_need_resched();
 	rq->skip_clock_update = 0;
diff --git a/kernel/sched/idle_task.c b/kernel/sched/idle_task.c
index 516c3d9..0b4c94b 100644
--- a/kernel/sched/idle_task.c
+++ b/kernel/sched/idle_task.c
@@ -33,16 +33,6 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl
 	resched_task(rq->idle);
 }
 
-static struct task_struct *pick_next_task_idle(struct rq *rq)
-{
-	schedstat_inc(rq, sched_goidle);
-#ifdef CONFIG_SMP
-	/* Trigger the post schedule to do an idle_enter for CFS */
-	rq->post_schedule = 1;
-#endif
-	return rq->idle;
-}
-
 /*
  * It is not legal to sleep in the idle task - print a warning
  * message if some code attempts to do it:
@@ -60,6 +50,11 @@ static void put_prev_task_idle(struct rq *rq, struct task_struct *prev)
 {
 }
 
+static struct task_struct *pick_next_task_idle(struct rq *rq)
+{
+	return NULL;
+}
+
 static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued)
 {
 }
-- 
1.7.9.5


  parent reply	other threads:[~2014-01-17  9:05 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-17  9:04 [PATCH 1/4] sched: Remove 'cpu' parameter for idle_balance() Daniel Lezcano
2014-01-17  9:04 ` [PATCH 2/4] sched: Fix race in idle_balance() Daniel Lezcano
2014-01-17 13:33   ` Peter Zijlstra
2014-01-17 13:44     ` Daniel Lezcano
2014-02-11 12:15   ` [tip:sched/core] " tip-bot for Daniel Lezcano
2014-01-17  9:04 ` [PATCH 3/4] sched: Move idle_stamp up to the core Daniel Lezcano
2014-02-11 12:16   ` [tip:sched/core] sched: Move rq->idle_stamp " tip-bot for Daniel Lezcano
2014-01-17  9:04 ` Daniel Lezcano [this message]
2014-01-17 14:09   ` [PATCH 4/4] sched: Idle task shortcut optimization Peter Zijlstra
2014-01-17 15:09     ` Daniel Lezcano
2014-01-17 15:23       ` Peter Zijlstra
2014-01-17 14:26   ` Peter Zijlstra
2014-01-17 15:06     ` Daniel Lezcano
2014-01-17 15:23       ` Peter Zijlstra
2014-01-17 15:26         ` Daniel Lezcano
2014-01-17 15:33           ` Peter Zijlstra
2014-01-17 16:06             ` Daniel Lezcano
2014-01-17 16:37             ` Daniel Lezcano
2014-01-17 16:45               ` [PATCH 1/2] sched/deadline: Fix compilation error Daniel Lezcano
2014-01-17 16:45                 ` [PATCH 2/2] sched: Use idle task shortcut Daniel Lezcano
2014-01-21  8:41             ` [PATCH 4/4] sched: Idle task shortcut optimization Daniel Lezcano
2014-01-21  9:06               ` Peter Zijlstra
2014-01-21  9:28                 ` Daniel Lezcano
2014-02-11 12:15 ` [tip:sched/core] sched: Remove 'cpu' parameter from idle_balance( ) tip-bot for Daniel Lezcano

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=1389949444-14821-4-git-send-email-daniel.lezcano@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=alex.shi@linaro.org \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@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.