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: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
b3cf257623
commit
e21c1ca3f9
|
@ -136,16 +136,6 @@ void acpi_os_vprintf(const char *fmt, va_list args)
|
|||
#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)
|
||||
{
|
||||
if (efi_enabled) {
|
||||
|
@ -1115,26 +1105,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
|
|||
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
|
||||
|
|
|
@ -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) */
|
||||
|
||||
op = acpi_os_acquire_object(acpi_gbl_ps_node_cache);
|
||||
memset(op, 0, sizeof(struct acpi_parse_obj_common));
|
||||
} else {
|
||||
/* Extended parseop */
|
||||
|
||||
op = acpi_os_acquire_object(acpi_gbl_ps_node_ext_cache);
|
||||
memset(op, 0, sizeof(struct acpi_parse_obj_named));
|
||||
}
|
||||
|
||||
/* Initialize the Op */
|
||||
|
|
|
@ -780,11 +780,6 @@ static int acpi_pci_link_resume(struct acpi_pci_link *link)
|
|||
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)
|
||||
{
|
||||
struct list_head *node = NULL;
|
||||
|
@ -794,7 +789,6 @@ static int irqrouter_resume(struct sys_device *dev)
|
|||
/* Make sure SCI is enabled again (Apple firmware bug?) */
|
||||
acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK);
|
||||
|
||||
acpi_in_resume = 1;
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
|
@ -803,7 +797,6 @@ static int irqrouter_resume(struct sys_device *dev)
|
|||
}
|
||||
acpi_pci_link_resume(link);
|
||||
}
|
||||
acpi_in_resume = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -285,6 +285,7 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer,
|
|||
return (status);
|
||||
}
|
||||
|
||||
#ifdef NOT_USED_BY_LINUX
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_allocate
|
||||
|
@ -360,3 +361,4 @@ void *acpi_ut_allocate_zeroed(acpi_size size,
|
|||
|
||||
return (allocation);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -724,9 +724,15 @@
|
|||
|
||||
/* Memory allocation */
|
||||
|
||||
#ifndef ACPI_ALLOCATE
|
||||
#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_FREE(a) kfree(a)
|
||||
#endif
|
||||
#ifndef ACPI_FREE
|
||||
#define ACPI_FREE(a) acpio_os_free(a)
|
||||
#endif
|
||||
#define ACPI_MEM_TRACKING(a)
|
||||
|
||||
#else
|
||||
|
|
|
@ -104,4 +104,26 @@
|
|||
|
||||
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__ */
|
||||
|
|
Loading…
Reference in New Issue