diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 12:21:46 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-26 12:21:46 -0500 |
commit | ea3d5226f52ef30f52aa0a04f47f5919c7facacf (patch) | |
tree | 090a48a6f6b2934d32a641ec6e61b3dc59a48514 /arch/i386/kernel/process.c | |
parent | 9654640d0af8f2de40ff3807d3695109d3463f54 (diff) |
Revert "[PATCH] i386: add idle notifier"
This reverts commit 2ff2d3d74705d34ab71b21f54634fcf50d57bdd5.
Uwe Bugla reports that he cannot mount a floppy drive any more, and Jiri
Slaby bisected it down to this commit.
Benjamin LaHaise also points out that this is a big hot-path, and that
interrupt delivery while idle is very common and should not go through
all these expensive gyrations.
Fix up conflicts in arch/i386/kernel/apic.c and arch/i386/kernel/irq.c
due to other unrelated irq changes.
Cc: Stephane Eranian <eranian@hpl.hp.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Andrew Morton <akpm@osdl.org>
Cc: Uwe Bugla <uwe.bugla@gmx.de>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/i386/kernel/process.c')
-rw-r--r-- | arch/i386/kernel/process.c | 53 |
1 files changed, 1 insertions, 52 deletions
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c index bea304d48cdb..393a67d5d943 100644 --- a/arch/i386/kernel/process.c +++ b/arch/i386/kernel/process.c | |||
@@ -49,7 +49,6 @@ | |||
49 | #include <asm/i387.h> | 49 | #include <asm/i387.h> |
50 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
51 | #include <asm/vm86.h> | 51 | #include <asm/vm86.h> |
52 | #include <asm/idle.h> | ||
53 | #ifdef CONFIG_MATH_EMULATION | 52 | #ifdef CONFIG_MATH_EMULATION |
54 | #include <asm/math_emu.h> | 53 | #include <asm/math_emu.h> |
55 | #endif | 54 | #endif |
@@ -82,42 +81,6 @@ void (*pm_idle)(void); | |||
82 | EXPORT_SYMBOL(pm_idle); | 81 | EXPORT_SYMBOL(pm_idle); |
83 | static DEFINE_PER_CPU(unsigned int, cpu_idle_state); | 82 | static DEFINE_PER_CPU(unsigned int, cpu_idle_state); |
84 | 83 | ||
85 | static ATOMIC_NOTIFIER_HEAD(idle_notifier); | ||
86 | |||
87 | void idle_notifier_register(struct notifier_block *n) | ||
88 | { | ||
89 | atomic_notifier_chain_register(&idle_notifier, n); | ||
90 | } | ||
91 | |||
92 | void idle_notifier_unregister(struct notifier_block *n) | ||
93 | { | ||
94 | atomic_notifier_chain_unregister(&idle_notifier, n); | ||
95 | } | ||
96 | |||
97 | static DEFINE_PER_CPU(volatile unsigned long, idle_state); | ||
98 | |||
99 | void enter_idle(void) | ||
100 | { | ||
101 | /* needs to be atomic w.r.t. interrupts, not against other CPUs */ | ||
102 | __set_bit(0, &__get_cpu_var(idle_state)); | ||
103 | atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL); | ||
104 | } | ||
105 | |||
106 | static void __exit_idle(void) | ||
107 | { | ||
108 | /* needs to be atomic w.r.t. interrupts, not against other CPUs */ | ||
109 | if (__test_and_clear_bit(0, &__get_cpu_var(idle_state)) == 0) | ||
110 | return; | ||
111 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); | ||
112 | } | ||
113 | |||
114 | void exit_idle(void) | ||
115 | { | ||
116 | if (current->pid) | ||
117 | return; | ||
118 | __exit_idle(); | ||
119 | } | ||
120 | |||
121 | void disable_hlt(void) | 84 | void disable_hlt(void) |
122 | { | 85 | { |
123 | hlt_counter++; | 86 | hlt_counter++; |
@@ -168,7 +131,6 @@ EXPORT_SYMBOL(default_idle); | |||
168 | */ | 131 | */ |
169 | static void poll_idle (void) | 132 | static void poll_idle (void) |
170 | { | 133 | { |
171 | local_irq_enable(); | ||
172 | cpu_relax(); | 134 | cpu_relax(); |
173 | } | 135 | } |
174 | 136 | ||
@@ -229,16 +191,7 @@ void cpu_idle(void) | |||
229 | play_dead(); | 191 | play_dead(); |
230 | 192 | ||
231 | __get_cpu_var(irq_stat).idle_timestamp = jiffies; | 193 | __get_cpu_var(irq_stat).idle_timestamp = jiffies; |
232 | |||
233 | /* | ||
234 | * Idle routines should keep interrupts disabled | ||
235 | * from here on, until they go to idle. | ||
236 | * Otherwise, idle callbacks can misfire. | ||
237 | */ | ||
238 | local_irq_disable(); | ||
239 | enter_idle(); | ||
240 | idle(); | 194 | idle(); |
241 | __exit_idle(); | ||
242 | } | 195 | } |
243 | tick_nohz_restart_sched_tick(); | 196 | tick_nohz_restart_sched_tick(); |
244 | preempt_enable_no_resched(); | 197 | preempt_enable_no_resched(); |
@@ -293,11 +246,7 @@ void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) | |||
293 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | 246 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
294 | smp_mb(); | 247 | smp_mb(); |
295 | if (!need_resched()) | 248 | if (!need_resched()) |
296 | __sti_mwait(eax, ecx); | 249 | __mwait(eax, ecx); |
297 | else | ||
298 | local_irq_enable(); | ||
299 | } else { | ||
300 | local_irq_enable(); | ||
301 | } | 250 | } |
302 | } | 251 | } |
303 | 252 | ||