Commit d68909f4c3eee09c13d4e5c86512c6c075553dbd
1 parent
b5240b32b9
Exists in
master
and in
7 other branches
ACPI: avoid irqrouter_resume might_sleep oops on resume from S4
__might_sleep+0x8e/0x93 acpi_os_wait_semaphore+0x50/0xa3 acpi_ut_acquire_mutex+0x28/0x6a acpi_ns_get_node+0x46/0x88 acpi_ns_evaluate+0x2d/0xfc acpi_rs_set_srs_method_data+0xc5/0xe1 acpi_set_current_resources+0x31/0x3f acpi_pci_link_set+0xfc/0x1a5 irqrouter_resume+0x48/0x5f and __might_sleep+0x8e/0x93 kmem_cache_alloc+0x2a/0x8f acpi_evaluate_integer+0x32/0x96 acpi_bus_get_status+0x30/0x84 acpi_pci_link_set+0x12a/0x1a5 irqrouter_resume+0x48/0x5f http://bugzilla.kernel.org/show_bug.cgi?id=6810 Signed-off-by: Len Brown <len.brown@intel.com>
Showing 2 changed files with 11 additions and 1 deletions Side-by-side Diff
drivers/acpi/osl.c
... | ... | @@ -746,6 +746,16 @@ |
746 | 746 | ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Waiting for semaphore[%p|%d|%d]\n", |
747 | 747 | handle, units, timeout)); |
748 | 748 | |
749 | + /* | |
750 | + * This can be called during resume with interrupts off. | |
751 | + * Like boot-time, we should be single threaded and will | |
752 | + * always get the lock if we try -- timeout or not. | |
753 | + * If this doesn't succeed, then we will oops courtesy of | |
754 | + * might_sleep() in down(). | |
755 | + */ | |
756 | + if (!down_trylock(sem)) | |
757 | + return AE_OK; | |
758 | + | |
749 | 759 | switch (timeout) { |
750 | 760 | /* |
751 | 761 | * No Wait: |
drivers/acpi/utils.c
... | ... | @@ -262,7 +262,7 @@ |
262 | 262 | if (!data) |
263 | 263 | return AE_BAD_PARAMETER; |
264 | 264 | |
265 | - element = kmalloc(sizeof(union acpi_object), GFP_KERNEL); | |
265 | + element = kmalloc(sizeof(union acpi_object), irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL); | |
266 | 266 | if (!element) |
267 | 267 | return AE_NO_MEMORY; |
268 | 268 |