Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

Len Brown d68909f4 b5240b32

+11 -1
+10
drivers/acpi/osl.c
··· 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:
+1 -1
drivers/acpi/utils.c
··· 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