From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: nicolas.pitre@linaro.org, peterz@infradead.org, mingo@redhat.com,
tglx@linutronix.de, rjw@rjwysocki.net
Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
linaro-kernel@lists.linaro.org
Subject: [RFC PATCH 2/3] cpuidle: move the cpuidle_idle_call function to idle.c
Date: Thu, 30 Jan 2014 15:09:21 +0100 [thread overview]
Message-ID: <1391090962-15032-3-git-send-email-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <1391090962-15032-1-git-send-email-daniel.lezcano@linaro.org>
Now the cpuidle_idle_call does nothing more than calling the three individuals
function, we can move this function into the idle task code to ensure better
proximity to the scheduler code.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/cpuidle/cpuidle.c | 37 -------------------------------------
include/linux/cpuidle.h | 2 --
kernel/sched/idle.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index a8fbb28..a039344 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -176,43 +176,6 @@ void cpuidle_reflect(struct cpuidle_device *dev, int index)
EXPORT_SYMBOL(cpuidle_reflect);
/**
- * cpuidle_idle_call - the main idle loop
- *
- * NOTE: no locks or semaphores should be used here
- * return non-zero on failure
- */
-int cpuidle_idle_call(void)
-{
- struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
- struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
- int next_state, entered_state;
-
- /* ask the governor for the next state */
- next_state = cpuidle_select(drv, dev);
- if (next_state < 0)
- return next_state;
-
- if (need_resched()) {
- dev->last_residency = 0;
- /* give the governor an opportunity to reflect on the outcome */
- cpuidle_reflect(dev, next_state);
- local_irq_enable();
- return 0;
- }
-
- trace_cpu_idle_rcuidle(next_state, dev->cpu);
-
- entered_state = cpuidle_enter(drv, dev, next_state);
-
- trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
-
- /* give the governor an opportunity to reflect on the outcome */
- cpuidle_reflect(dev, entered_state);
-
- return 0;
-}
-
-/**
* cpuidle_install_idle_handler - installs the cpuidle idle loop handler
*/
void cpuidle_install_idle_handler(void)
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
index 1ebe9ff..74cdfc9 100644
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -126,7 +126,6 @@ extern int cpuidle_enter(struct cpuidle_driver *drv,
struct cpuidle_device *dev, int index);
extern void cpuidle_reflect(struct cpuidle_device *dev, int index);
-extern int cpuidle_idle_call(void);
extern int cpuidle_register_driver(struct cpuidle_driver *drv);
extern struct cpuidle_driver *cpuidle_get_driver(void);
extern struct cpuidle_driver *cpuidle_driver_ref(void);
@@ -148,7 +147,6 @@ extern int cpuidle_play_dead(void);
extern struct cpuidle_driver *cpuidle_get_cpu_driver(struct cpuidle_device *dev);
#else
static inline void disable_cpuidle(void) { }
-static inline int cpuidle_idle_call(void) { return -ENODEV; }
static inline int cpuidle_register_driver(struct cpuidle_driver *drv)
{return -ENODEV; }
static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 65d0427..3e85d38 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -62,6 +62,50 @@ void __weak arch_cpu_idle(void)
local_irq_enable();
}
+#ifdef CONFIG_CPU_IDLE
+/**
+ * cpuidle_idle_call - the main idle function
+ *
+ * NOTE: no locks or semaphores should be used here
+ * return non-zero on failure
+ */
+static int cpuidle_idle_call(void)
+{
+ struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
+ struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
+ int next_state, entered_state;
+
+ /* ask the governor for the next state */
+ next_state = cpuidle_select(drv, dev);
+ if (next_state < 0)
+ return next_state;
+
+ if (need_resched()) {
+ dev->last_residency = 0;
+ /* give the governor an opportunity to reflect on the outcome */
+ cpuidle_reflect(dev, next_state);
+ local_irq_enable();
+ return 0;
+ }
+
+ trace_cpu_idle_rcuidle(next_state, dev->cpu);
+
+ entered_state = cpuidle_enter(drv, dev, next_state);
+
+ trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);
+
+ /* give the governor an opportunity to reflect on the outcome */
+ cpuidle_reflect(dev, entered_state);
+
+ return 0;
+}
+#else
+static inline int cpuidle_idle_call(void)
+{
+ return -ENODEV;
+}
+#endif
+
/*
* Generic idle loop implementation
*/
--
1.7.9.5
next prev parent reply other threads:[~2014-01-30 14:09 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-30 14:09 [RFC PATCH 0/3] cpuidle/sched: move main idle function in the idle.c Daniel Lezcano
2014-01-30 14:09 ` [RFC PATCH 1/3] cpuidle: split cpuidle_idle_call main function into functions Daniel Lezcano
2014-01-30 15:27 ` Peter Zijlstra
2014-01-30 15:39 ` Daniel Lezcano
2014-01-30 19:39 ` Nicolas Pitre
2014-01-31 14:10 ` Daniel Lezcano
2014-01-30 14:09 ` Daniel Lezcano [this message]
2014-01-30 19:42 ` [RFC PATCH 2/3] cpuidle: move the cpuidle_idle_call function to idle.c Nicolas Pitre
2014-01-30 14:09 ` [RFC PATCH 3/3] idle: store the idle state index in the struct rq Daniel Lezcano
2014-01-30 15:31 ` Peter Zijlstra
2014-01-30 16:27 ` Daniel Lezcano
2014-01-30 16:35 ` Peter Zijlstra
2014-01-30 17:25 ` Daniel Lezcano
2014-01-30 17:50 ` Lorenzo Pieralisi
2014-01-30 21:02 ` Nicolas Pitre
2014-01-31 9:46 ` Vincent Guittot
2014-01-31 10:04 ` Lorenzo Pieralisi
2014-01-31 10:44 ` Daniel Lezcano
2014-01-31 8:45 ` Preeti Murthy
2014-01-31 9:02 ` Peter Zijlstra
2014-01-31 9:39 ` Preeti U Murthy
2014-01-31 10:24 ` Peter Zijlstra
2014-01-31 14:04 ` Daniel Lezcano
2014-01-31 14:12 ` Dietmar Eggemann
2014-01-31 15:07 ` Arjan van de Ven
2014-01-31 15:37 ` Daniel Lezcano
2014-01-31 15:50 ` Arjan van de Ven
2014-01-31 16:35 ` Daniel Lezcano
2014-01-31 16:42 ` Arjan van de Ven
2014-01-31 18:19 ` Nicolas Pitre
2014-02-01 6:00 ` Brown, Len
2014-02-01 15:31 ` Nicolas Pitre
2014-02-01 19:39 ` Brown, Len
2014-02-01 20:13 ` Nicolas Pitre
2014-02-01 15:40 ` Lorenzo Pieralisi
2014-02-03 12:54 ` Morten Rasmussen
2014-02-03 14:38 ` Arjan van de Ven
2014-02-03 14:56 ` Peter Zijlstra
2014-02-03 16:17 ` Arjan van de Ven
2014-02-11 16:41 ` Peter Zijlstra
2014-02-11 17:12 ` Arjan van de Ven
2014-02-11 19:47 ` Peter Zijlstra
2014-02-12 15:16 ` Lorenzo Pieralisi
2014-02-12 16:14 ` Arjan van de Ven
2014-02-12 17:37 ` Lorenzo Pieralisi
2014-02-12 19:05 ` Nicolas Pitre
2014-02-04 9:14 ` Ingo Molnar
2014-02-04 14:53 ` Arjan van de Ven
2014-02-04 14:56 ` Arjan van de Ven
2014-02-03 14:58 ` Nicolas Pitre
2014-01-31 10:15 ` Daniel Lezcano
2014-02-03 6:33 ` Preeti U Murthy
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=1391090962-15032-3-git-send-email-daniel.lezcano@linaro.org \
--to=daniel.lezcano@linaro.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nicolas.pitre@linaro.org \
--cc=peterz@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
/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 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).