aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaohua Li <shaohua.li@intel.com>2005-08-03 23:46:33 -0400
committerLen Brown <len.brown@intel.com>2005-08-03 23:50:36 -0400
commit11e981f1e02c2a36465cbb208b21cb8b6480f399 (patch)
treed812a362e9e530f0cfd7a189d79ede3e8d5a7f96
parent8066eff0a1a0703ad901dbe5646a47dbfc089ef2 (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.c6
-rw-r--r--drivers/acpi/pci_link.c7
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
148extern int acpi_in_resume;
148void * 149void *
149acpi_os_allocate(acpi_size size) 150acpi_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
154void 158void
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 */
805int acpi_in_resume;
801static int 806static int
802irqrouter_resume( 807irqrouter_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