diff options
author | David Shaohua Li <shaohua.li@intel.com> | 2005-08-03 23:46:33 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-08-03 23:50:36 -0400 |
commit | 11e981f1e02c2a36465cbb208b21cb8b6480f399 (patch) | |
tree | d812a362e9e530f0cfd7a189d79ede3e8d5a7f96 | |
parent | 8066eff0a1a0703ad901dbe5646a47dbfc089ef2 (diff) |
[ACPI] S3 resume: avoid kmalloc() might_sleep oops symptom
ACPI now uses kmalloc(...,GPF_ATOMIC) during suspend/resume.
http://bugzilla.kernel.org/show_bug.cgi?id=3469
Signed-off-by: David Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r-- | drivers/acpi/osl.c | 6 | ||||
-rw-r--r-- | drivers/acpi/pci_link.c | 7 |
2 files changed, 12 insertions, 1 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index bdd9f37f8101..7289da3c4db6 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -145,10 +145,14 @@ acpi_os_vprintf(const char *fmt, va_list args) | |||
145 | #endif | 145 | #endif |
146 | } | 146 | } |
147 | 147 | ||
148 | extern int acpi_in_resume; | ||
148 | void * | 149 | void * |
149 | acpi_os_allocate(acpi_size size) | 150 | acpi_os_allocate(acpi_size size) |
150 | { | 151 | { |
151 | return kmalloc(size, GFP_KERNEL); | 152 | if (acpi_in_resume) |
153 | return kmalloc(size, GFP_ATOMIC); | ||
154 | else | ||
155 | return kmalloc(size, GFP_KERNEL); | ||
152 | } | 156 | } |
153 | 157 | ||
154 | void | 158 | void |
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index 65cea07abbc3..834c2ceff1aa 100644 --- a/drivers/acpi/pci_link.c +++ b/drivers/acpi/pci_link.c | |||
@@ -798,6 +798,11 @@ acpi_pci_link_resume( | |||
798 | return_VALUE(0); | 798 | return_VALUE(0); |
799 | } | 799 | } |
800 | 800 | ||
801 | /* | ||
802 | * FIXME: this is a workaround to avoid nasty warning. It will be removed | ||
803 | * after every device calls pci_disable_device in .resume. | ||
804 | */ | ||
805 | int acpi_in_resume; | ||
801 | static int | 806 | static int |
802 | irqrouter_resume( | 807 | irqrouter_resume( |
803 | struct sys_device *dev) | 808 | struct sys_device *dev) |
@@ -807,6 +812,7 @@ irqrouter_resume( | |||
807 | 812 | ||
808 | ACPI_FUNCTION_TRACE("irqrouter_resume"); | 813 | ACPI_FUNCTION_TRACE("irqrouter_resume"); |
809 | 814 | ||
815 | acpi_in_resume = 1; | ||
810 | list_for_each(node, &acpi_link.entries) { | 816 | list_for_each(node, &acpi_link.entries) { |
811 | link = list_entry(node, struct acpi_pci_link, node); | 817 | link = list_entry(node, struct acpi_pci_link, node); |
812 | if (!link) { | 818 | if (!link) { |
@@ -816,6 +822,7 @@ irqrouter_resume( | |||
816 | } | 822 | } |
817 | acpi_pci_link_resume(link); | 823 | acpi_pci_link_resume(link); |
818 | } | 824 | } |
825 | acpi_in_resume = 0; | ||
819 | return_VALUE(0); | 826 | return_VALUE(0); |
820 | } | 827 | } |
821 | 828 | ||