diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-04 03:54:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-04 03:54:15 -0400 |
commit | 35e51fe82ddcd8fb7f129d6dd8491c097d388665 (patch) | |
tree | d6dd5e860c0e68a1af7976990c7d624e7362415d /arch/x86/kernel | |
parent | c0c770e610cc4cdcd66c7e939bdf89cc3e72f79d (diff) | |
parent | a0bfa1373859e9d11dc92561a8667588803e42d8 (diff) |
Merge branch 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6
* 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6:
cpuidle: stop depending on pm_idle
x86 idle: move mwait_idle_with_hints() to where it is used
cpuidle: replace xen access to x86 pm_idle and default_idle
cpuidle: create bootparam "cpuidle.off=1"
mrst_pmu: driver for Intel Moorestown Power Management Unit
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/acpi/cstate.c | 23 | ||||
-rw-r--r-- | arch/x86/kernel/process.c | 23 | ||||
-rw-r--r-- | arch/x86/kernel/process_32.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/process_64.c | 4 |
4 files changed, 29 insertions, 25 deletions
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index 5812404a0d4c..f50e7fb2a201 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
@@ -149,6 +149,29 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, | |||
149 | } | 149 | } |
150 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); | 150 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); |
151 | 151 | ||
152 | /* | ||
153 | * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, | ||
154 | * which can obviate IPI to trigger checking of need_resched. | ||
155 | * We execute MONITOR against need_resched and enter optimized wait state | ||
156 | * through MWAIT. Whenever someone changes need_resched, we would be woken | ||
157 | * up from MWAIT (without an IPI). | ||
158 | * | ||
159 | * New with Core Duo processors, MWAIT can take some hints based on CPU | ||
160 | * capability. | ||
161 | */ | ||
162 | void mwait_idle_with_hints(unsigned long ax, unsigned long cx) | ||
163 | { | ||
164 | if (!need_resched()) { | ||
165 | if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) | ||
166 | clflush((void *)¤t_thread_info()->flags); | ||
167 | |||
168 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
169 | smp_mb(); | ||
170 | if (!need_resched()) | ||
171 | __mwait(ax, cx); | ||
172 | } | ||
173 | } | ||
174 | |||
152 | void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx) | 175 | void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx) |
153 | { | 176 | { |
154 | unsigned int cpu = smp_processor_id(); | 177 | unsigned int cpu = smp_processor_id(); |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index e1ba8cb24e4e..e7e3b019c439 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -438,29 +438,6 @@ void cpu_idle_wait(void) | |||
438 | } | 438 | } |
439 | EXPORT_SYMBOL_GPL(cpu_idle_wait); | 439 | EXPORT_SYMBOL_GPL(cpu_idle_wait); |
440 | 440 | ||
441 | /* | ||
442 | * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, | ||
443 | * which can obviate IPI to trigger checking of need_resched. | ||
444 | * We execute MONITOR against need_resched and enter optimized wait state | ||
445 | * through MWAIT. Whenever someone changes need_resched, we would be woken | ||
446 | * up from MWAIT (without an IPI). | ||
447 | * | ||
448 | * New with Core Duo processors, MWAIT can take some hints based on CPU | ||
449 | * capability. | ||
450 | */ | ||
451 | void mwait_idle_with_hints(unsigned long ax, unsigned long cx) | ||
452 | { | ||
453 | if (!need_resched()) { | ||
454 | if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) | ||
455 | clflush((void *)¤t_thread_info()->flags); | ||
456 | |||
457 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
458 | smp_mb(); | ||
459 | if (!need_resched()) | ||
460 | __mwait(ax, cx); | ||
461 | } | ||
462 | } | ||
463 | |||
464 | /* Default MONITOR/MWAIT with no hints, used for default C1 state */ | 441 | /* Default MONITOR/MWAIT with no hints, used for default C1 state */ |
465 | static void mwait_idle(void) | 442 | static void mwait_idle(void) |
466 | { | 443 | { |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index a3d0dc59067b..7a3b65107a27 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/uaccess.h> | 38 | #include <linux/uaccess.h> |
39 | #include <linux/io.h> | 39 | #include <linux/io.h> |
40 | #include <linux/kdebug.h> | 40 | #include <linux/kdebug.h> |
41 | #include <linux/cpuidle.h> | ||
41 | 42 | ||
42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
43 | #include <asm/system.h> | 44 | #include <asm/system.h> |
@@ -109,7 +110,8 @@ void cpu_idle(void) | |||
109 | local_irq_disable(); | 110 | local_irq_disable(); |
110 | /* Don't trace irqs off for idle */ | 111 | /* Don't trace irqs off for idle */ |
111 | stop_critical_timings(); | 112 | stop_critical_timings(); |
112 | pm_idle(); | 113 | if (cpuidle_idle_call()) |
114 | pm_idle(); | ||
113 | start_critical_timings(); | 115 | start_critical_timings(); |
114 | } | 116 | } |
115 | tick_nohz_restart_sched_tick(); | 117 | tick_nohz_restart_sched_tick(); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ca6f7ab8df33..f693e44e1bf6 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/uaccess.h> | 37 | #include <linux/uaccess.h> |
38 | #include <linux/io.h> | 38 | #include <linux/io.h> |
39 | #include <linux/ftrace.h> | 39 | #include <linux/ftrace.h> |
40 | #include <linux/cpuidle.h> | ||
40 | 41 | ||
41 | #include <asm/pgtable.h> | 42 | #include <asm/pgtable.h> |
42 | #include <asm/system.h> | 43 | #include <asm/system.h> |
@@ -136,7 +137,8 @@ void cpu_idle(void) | |||
136 | enter_idle(); | 137 | enter_idle(); |
137 | /* Don't trace irqs off for idle */ | 138 | /* Don't trace irqs off for idle */ |
138 | stop_critical_timings(); | 139 | stop_critical_timings(); |
139 | pm_idle(); | 140 | if (cpuidle_idle_call()) |
141 | pm_idle(); | ||
140 | start_critical_timings(); | 142 | start_critical_timings(); |
141 | 143 | ||
142 | /* In many cases the interrupt that ended idle | 144 | /* In many cases the interrupt that ended idle |