ACPI: acpi_os_allocate() fixes
authorLen Brown <len.brown@intel.com>
Mon, 10 Jul 2006 05:35:51 +0000 (01:35 -0400)
committerLen Brown <len.brown@intel.com>
Mon, 10 Jul 2006 06:37:22 +0000 (02:37 -0400)
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>
drivers/acpi/osl.c
drivers/acpi/parser/psutils.c
drivers/acpi/pci_link.c
drivers/acpi/utilities/utalloc.c
include/acpi/acmacros.h
include/acpi/platform/aclinux.h

index eedb05c6dc7b6d14e901f0c68abb021c4426b097..47dfde95b8f8272caf3281afb91e2c3186a9f19c 100644 (file)
@@ -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
index 182474ae8ce9ed4f00e649b9781ad19477646722..d405387b74146790fe3ba2f671fb0ef681cb1643 100644 (file)
@@ -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 */
index 8197c0e40769f68785559c58ce0002058ed6aa25..7f3e7e77e79436e9984c52a4d6c80345f3f3265d 100644 (file)
@@ -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;
 }
 
index 5cff17dc78b331855b143ebffa7d95b749dcab68..f6cbc0b1bfd057f3d51257b7c1c35b12564ce708 100644 (file)
@@ -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
index f1ac6109556e8d69fa53d3157bfbff877dbafb37..192fa095a51583ab6df2bff319ed842c0597ace1 100644 (file)
 
 /* 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
index 3f853cabbd4159d7e905e8955864171cabdd70d3..f0118262ac2715adadddfb518f461cfdb4b57450 100644 (file)
 
 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__ */