Commit e21c1ca3 authored by Len Brown's avatar Len Brown

ACPI: acpi_os_allocate() fixes

Replace acpi_in_resume with a more general hack
to check irqs_disabled() on any kmalloc() from ACPI.
While setting (system_state != SYSTEM_RUNNING) on resume
seemed more general, Andrew Morton preferred this approach.

http://bugzilla.kernel.org/show_bug.cgi?id=3469

Make acpi_os_allocate() into an inline function to
allow /proc/slab_allocators to work.

Delete some memset() that could fault on allocation failure.
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent b3cf2576
...@@ -136,16 +136,6 @@ void acpi_os_vprintf(const char *fmt, va_list args) ...@@ -136,16 +136,6 @@ void acpi_os_vprintf(const char *fmt, va_list args)
#endif #endif
} }
extern int acpi_in_resume;
void *acpi_os_allocate(acpi_size size)
{
if (acpi_in_resume)
return kmalloc(size, GFP_ATOMIC);
else
return kmalloc(size, GFP_KERNEL);
}
acpi_status acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr) acpi_status acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr)
{ {
if (efi_enabled) { if (efi_enabled) {
...@@ -1115,26 +1105,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) ...@@ -1115,26 +1105,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
return (AE_OK); return (AE_OK);
} }
/*******************************************************************************
*
* FUNCTION: acpi_os_acquire_object
*
* PARAMETERS: Cache - Handle to cache object
* ReturnObject - Where the object is returned
*
* RETURN: Status
*
* DESCRIPTION: Return a zero-filled object.
*
******************************************************************************/
void *acpi_os_acquire_object(acpi_cache_t * cache)
{
void *object = kmem_cache_zalloc(cache, GFP_KERNEL);
WARN_ON(!object);
return object;
}
/****************************************************************************** /******************************************************************************
* *
* FUNCTION: acpi_os_validate_interface * FUNCTION: acpi_os_validate_interface
......
...@@ -139,12 +139,10 @@ union acpi_parse_object *acpi_ps_alloc_op(u16 opcode) ...@@ -139,12 +139,10 @@ union acpi_parse_object *acpi_ps_alloc_op(u16 opcode)
/* The generic op (default) is by far the most common (16 to 1) */ /* The generic op (default) is by far the most common (16 to 1) */
op = acpi_os_acquire_object(acpi_gbl_ps_node_cache); op = acpi_os_acquire_object(acpi_gbl_ps_node_cache);
memset(op, 0, sizeof(struct acpi_parse_obj_common));
} else { } else {
/* Extended parseop */ /* Extended parseop */
op = acpi_os_acquire_object(acpi_gbl_ps_node_ext_cache); op = acpi_os_acquire_object(acpi_gbl_ps_node_ext_cache);
memset(op, 0, sizeof(struct acpi_parse_obj_named));
} }
/* Initialize the Op */ /* Initialize the Op */
......
...@@ -780,11 +780,6 @@ static int acpi_pci_link_resume(struct acpi_pci_link *link) ...@@ -780,11 +780,6 @@ static int acpi_pci_link_resume(struct acpi_pci_link *link)
return 0; return 0;
} }
/*
* FIXME: this is a workaround to avoid nasty warning. It will be removed
* after every device calls pci_disable_device in .resume.
*/
int acpi_in_resume;
static int irqrouter_resume(struct sys_device *dev) static int irqrouter_resume(struct sys_device *dev)
{ {
struct list_head *node = NULL; struct list_head *node = NULL;
...@@ -794,7 +789,6 @@ static int irqrouter_resume(struct sys_device *dev) ...@@ -794,7 +789,6 @@ static int irqrouter_resume(struct sys_device *dev)
/* Make sure SCI is enabled again (Apple firmware bug?) */ /* Make sure SCI is enabled again (Apple firmware bug?) */
acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK); acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK);
acpi_in_resume = 1;
list_for_each(node, &acpi_link.entries) { list_for_each(node, &acpi_link.entries) {
link = list_entry(node, struct acpi_pci_link, node); link = list_entry(node, struct acpi_pci_link, node);
if (!link) { if (!link) {
...@@ -803,7 +797,6 @@ static int irqrouter_resume(struct sys_device *dev) ...@@ -803,7 +797,6 @@ static int irqrouter_resume(struct sys_device *dev)
} }
acpi_pci_link_resume(link); acpi_pci_link_resume(link);
} }
acpi_in_resume = 0;
return 0; return 0;
} }
......
...@@ -285,6 +285,7 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer, ...@@ -285,6 +285,7 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
return (status); return (status);
} }
#ifdef NOT_USED_BY_LINUX
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_allocate * FUNCTION: acpi_ut_allocate
...@@ -360,3 +361,4 @@ void *acpi_ut_allocate_zeroed(acpi_size size, ...@@ -360,3 +361,4 @@ void *acpi_ut_allocate_zeroed(acpi_size size,
return (allocation); return (allocation);
} }
#endif
...@@ -724,9 +724,15 @@ ...@@ -724,9 +724,15 @@
/* Memory allocation */ /* Memory allocation */
#ifndef ACPI_ALLOCATE
#define ACPI_ALLOCATE(a) acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__) #define ACPI_ALLOCATE(a) acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__)
#endif
#ifndef ACPI_ALLOCATE_ZEROED
#define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__) #define ACPI_ALLOCATE_ZEROED(a) acpi_ut_allocate_zeroed((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__)
#define ACPI_FREE(a) kfree(a) #endif
#ifndef ACPI_FREE
#define ACPI_FREE(a) acpio_os_free(a)
#endif
#define ACPI_MEM_TRACKING(a) #define ACPI_MEM_TRACKING(a)
#else #else
......
...@@ -104,4 +104,26 @@ ...@@ -104,4 +104,26 @@
static inline acpi_thread_id acpi_os_get_thread_id(void) { return 0; } static inline acpi_thread_id acpi_os_get_thread_id(void) { return 0; }
/*
* The irqs_disabled() check is for resume from RAM.
* Interrupts are off during resume, just like they are for boot.
* However, boot has (system_state != SYSTEM_RUNNING)
* to quiet __might_sleep() in kmalloc() and resume does not.
*/
#include <acpi/actypes.h>
static inline void *acpi_os_allocate(acpi_size size) {
return kmalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
}
static inline void *acpi_os_allocate_zeroed(acpi_size size) {
return kzalloc(size, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
}
static inline void *acpi_os_acquire_object(acpi_cache_t * cache) {
return kmem_cache_zalloc(cache, irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
}
#define ACPI_ALLOCATE(a) acpi_os_allocate(a)
#define ACPI_ALLOCATE_ZEROED(a) acpi_os_allocate_zeroed(a)
#define ACPI_FREE(a) kfree(a)
#endif /* __ACLINUX_H__ */ #endif /* __ACLINUX_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment