diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-07-27 17:47:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-28 11:31:58 -0400 |
commit | b032bf70df2e43149ce2b4e9a865b076c6140753 (patch) | |
tree | ba022a0bc85598a29e21b7aa3f101c8043c24024 /drivers/cpuidle/cpuidle.c | |
parent | 9ffc1699e36abd5baee188c8e36b1bb27d0d4278 (diff) |
ACPI/CPUIDLE: prevent setting pm_idle to NULL
pm_idle_save resp. pm_idle_old can be NULL when the restore code in
acpi_processor_cst_has_changed() resp. cpuidle_uninstall_idle_handler()
is called. This can set pm_idle unconditinally to NULL, which causes the
kernel to panic when calling pm_idle in the x86 idle code. This was
covered by an extra check for !pm_idle in the x86 idle code, which was
removed during the x86 idle code refactoring.
Instead of restoring the pm_idle check in the x86 code prevent the
acpi/cpuidle code to set pm_idle to NULL.
Reported by: Dhaval Giani http://lkml.org/lkml/2008/7/2/309
Based on a debug patch from Ingo Molnar
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/cpuidle/cpuidle.c')
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 5405769020a1..5ce07b517c58 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -94,7 +94,7 @@ void cpuidle_install_idle_handler(void) | |||
94 | */ | 94 | */ |
95 | void cpuidle_uninstall_idle_handler(void) | 95 | void cpuidle_uninstall_idle_handler(void) |
96 | { | 96 | { |
97 | if (enabled_devices && (pm_idle != pm_idle_old)) { | 97 | if (enabled_devices && pm_idle_old && (pm_idle != pm_idle_old)) { |
98 | pm_idle = pm_idle_old; | 98 | pm_idle = pm_idle_old; |
99 | cpuidle_kick_cpus(); | 99 | cpuidle_kick_cpus(); |
100 | } | 100 | } |