From: Greg Kroah-Hartman Date: Wed, 10 Oct 2007 19:23:03 +0000 (-0700) Subject: another 2.6.22 patch added X-Git-Tag: v2.6.23.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8ce718e9de0cdb65d818c4aaa2f5ff037e522781;p=thirdparty%2Fkernel%2Fstable-queue.git another 2.6.22 patch added --- diff --git a/queue-2.6.22/acpi-disable-lower-idle-c-states-across-suspend-resume.patch b/queue-2.6.22/acpi-disable-lower-idle-c-states-across-suspend-resume.patch new file mode 100644 index 00000000000..afb77af1254 --- /dev/null +++ b/queue-2.6.22/acpi-disable-lower-idle-c-states-across-suspend-resume.patch @@ -0,0 +1,102 @@ +From b04e7bdb984e3b7f62fb7f44146a529f88cc7639 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sat, 22 Sep 2007 22:29:05 +0000 +Subject: ACPI: disable lower idle C-states across suspend/resume + +From: Thomas Gleixner + +changeset b04e7bdb984e3b7f62fb7f44146a529f88cc7639 from mainline. + +device_suspend() calls ACPI suspend functions, which seems to have undesired +side effects on lower idle C-states. It took me some time to realize that +especially the VAIO BIOSes (both Andrews jinxed UP and my elfstruck SMP one) +show this effect. I'm quite sure that other bug reports against suspend/resume +about turning the system into a brick have the same root cause. + +After fishing in the dark for quite some time, I realized that removing the ACPI +processor module before suspend (this removes the lower C-state functionality) +made the problem disappear. Interestingly enough the propability of having a +bricked box is influenced by various factors (interrupts, size of the ram image, +...). Even adding a bunch of printks in the wrong places made the problem go +away. The previous periodic tick implementation simply pampered over the +problem, which explains why the dyntick / clockevents changes made this more +prominent. + +We avoid complex functionality during the boot process and we have to do the +same during suspend/resume. It is a similar scenario and equaly fragile. + +Add suspend / resume functions to the ACPI processor code and disable the lower +idle C-states across suspend/resume. Fall back to the default idle +implementation (halt) instead. + +Signed-off-by: Thomas Gleixner +Tested-by: Andrew Morton +Cc: Len Brown +Cc: Venkatesh Pallipadi +Cc: Rafael J. Wysocki +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/acpi/processor_core.c | 2 ++ + drivers/acpi/processor_idle.c | 19 ++++++++++++++++++- + include/acpi/processor.h | 2 ++ + 3 files changed, 22 insertions(+), 1 deletion(-) + +--- a/drivers/acpi/processor_core.c ++++ b/drivers/acpi/processor_core.c +@@ -93,6 +93,8 @@ static struct acpi_driver acpi_processor + .add = acpi_processor_add, + .remove = acpi_processor_remove, + .start = acpi_processor_start, ++ .suspend = acpi_processor_suspend, ++ .resume = acpi_processor_resume, + }, + }; + +--- a/drivers/acpi/processor_idle.c ++++ b/drivers/acpi/processor_idle.c +@@ -324,6 +324,23 @@ static void acpi_state_timer_broadcast(s + + #endif + ++/* ++ * Suspend / resume control ++ */ ++static int acpi_idle_suspend; ++ ++int acpi_processor_suspend(struct acpi_device * device, pm_message_t state) ++{ ++ acpi_idle_suspend = 1; ++ return 0; ++} ++ ++int acpi_processor_resume(struct acpi_device * device) ++{ ++ acpi_idle_suspend = 0; ++ return 0; ++} ++ + static void acpi_processor_idle(void) + { + struct acpi_processor *pr = NULL; +@@ -354,7 +371,7 @@ static void acpi_processor_idle(void) + } + + cx = pr->power.state; +- if (!cx) { ++ if (!cx || acpi_idle_suspend) { + if (pm_idle_save) + pm_idle_save(); + else +--- a/include/acpi/processor.h ++++ b/include/acpi/processor.h +@@ -279,6 +279,8 @@ int acpi_processor_power_init(struct acp + int acpi_processor_cst_has_changed(struct acpi_processor *pr); + int acpi_processor_power_exit(struct acpi_processor *pr, + struct acpi_device *device); ++int acpi_processor_suspend(struct acpi_device * device, pm_message_t state); ++int acpi_processor_resume(struct acpi_device * device); + + /* in processor_thermal.c */ + int acpi_processor_get_limit_info(struct acpi_processor *pr); diff --git a/queue-2.6.22/series b/queue-2.6.22/series index 4ab1aaaca2f..da7b4645c3c 100644 --- a/queue-2.6.22/series +++ b/queue-2.6.22/series @@ -1,3 +1,4 @@ +acpi-disable-lower-idle-c-states-across-suspend-resume.patch fix-esp-host-instance-numbering.patch fix-cls_u32-error-return-handling.patch fix-ieee80211-handling-of-bogus-hdrlength-field.patch