summary refs log tree commit diff
path: root/drivers/acpi/namespace
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2006-03-17 16:44:00 -0500
committerLen Brown <len.brown@intel.com>2006-06-14 01:22:20 -0400
commit61686124f47d7c4b78610346c5f8f9d8a6d46bb5 (patch)
tree6fd91b2c1749907e58ef136107e53d634d7978c4 /drivers/acpi/namespace
parent144c87b4e03759214c362d267e01c2905f1ab095 (diff)
downloadlinux-61686124f47d7c4b78610346c5f8f9d8a6d46bb5.tar.gz
[ACPI] ACPICA 20060317
Implemented the use of a cache object for all internal
namespace nodes. Since there are about 1000 static nodes
in a typical system, this will decrease memory use for
cache implementations that minimize per-allocation overhead
(such as a slab allocator.)

Removed the reference count mechanism for internal
namespace nodes, since it was deemed unnecessary. This
reduces the size of each namespace node by about 5%-10%
on all platforms. Nodes are now 20 bytes for the 32-bit
case, and 32 bytes for the 64-bit case.

Optimized several internal data structures to reduce
object size on 64-bit platforms by packing data within
the 64-bit alignment. This includes the frequently used
ACPI_OPERAND_OBJECT, of which there can be ~1000 static
instances corresponding to the namespace objects.

Added two new strings for the predefined _OSI method:
"Windows 2001.1 SP1" and "Windows 2006".

Split the allocation tracking mechanism out to a separate
file, from utalloc.c to uttrack.c. This mechanism appears
to be only useful for application-level code. Kernels may
wish to not include uttrack.c in distributions.

Removed all remnants of the obsolete ACPI_REPORT_* macros
and the associated code. (These macros have been replaced
by the ACPI_ERROR and ACPI_WARNING macros.)

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/namespace')
-rw-r--r--drivers/acpi/namespace/nsalloc.c104
-rw-r--r--drivers/acpi/namespace/nsutils.c4
2 files changed, 13 insertions, 95 deletions
diff --git a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c
index acd4b6732ac4..8b921c96d6a5 100644
--- a/drivers/acpi/namespace/nsalloc.c
+++ b/drivers/acpi/namespace/nsalloc.c
@@ -47,9 +47,6 @@
 #define _COMPONENT          ACPI_NAMESPACE
 ACPI_MODULE_NAME("nsalloc")
 
-/* Local prototypes */
-static void acpi_ns_remove_reference(struct acpi_namespace_node *node);
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_create_node
@@ -61,14 +58,13 @@ static void acpi_ns_remove_reference(struct acpi_namespace_node *node);
  * DESCRIPTION: Create a namespace node
  *
  ******************************************************************************/
-
 struct acpi_namespace_node *acpi_ns_create_node(u32 name)
 {
 	struct acpi_namespace_node *node;
 
 	ACPI_FUNCTION_TRACE("ns_create_node");
 
-	node = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_namespace_node));
+	node = acpi_os_acquire_object(acpi_gbl_namespace_cache);
 	if (!node) {
 		return_PTR(NULL);
 	}
@@ -76,9 +72,7 @@ struct acpi_namespace_node *acpi_ns_create_node(u32 name)
 	ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++);
 
 	node->name.integer = name;
-	node->reference_count = 1;
 	ACPI_SET_DESCRIPTOR_TYPE(node, ACPI_DESC_TYPE_NAMED);
-
 	return_PTR(node);
 }
 
@@ -139,10 +133,10 @@ void acpi_ns_delete_node(struct acpi_namespace_node *node)
 	ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
 
 	/*
-	 * Detach an object if there is one then delete the node
+	 * Detach an object if there is one, then delete the node
 	 */
 	acpi_ns_detach_object(node);
-	ACPI_FREE(node);
+	(void)acpi_os_release_object(acpi_gbl_namespace_cache, node);
 	return_VOID;
 }
 
@@ -217,16 +211,6 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
 			  acpi_ut_get_node_name(parent_node),
 			  acpi_ut_get_type_name(parent_node->type),
 			  parent_node));
-
-	/*
-	 * Increment the reference count(s) of all parents up to
-	 * the root!
-	 */
-	while ((node = acpi_ns_get_parent_node(node)) != NULL) {
-		node->reference_count++;
-	}
-
-	return_VOID;
 }
 
 /*******************************************************************************
@@ -246,7 +230,6 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
 {
 	struct acpi_namespace_node *child_node;
 	struct acpi_namespace_node *next_node;
-	struct acpi_namespace_node *node;
 	u8 flags;
 
 	ACPI_FUNCTION_TRACE_PTR("ns_delete_children", parent_node);
@@ -292,26 +275,10 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
 		 */
 		acpi_ns_detach_object(child_node);
 
-		/*
-		 * Decrement the reference count(s) of all parents up to
-		 * the root! (counts were incremented when the node was created)
-		 */
-		node = child_node;
-		while ((node = acpi_ns_get_parent_node(node)) != NULL) {
-			node->reference_count--;
-		}
-
-		/* There should be only one reference remaining on this node */
-
-		if (child_node->reference_count != 1) {
-			ACPI_WARNING((AE_INFO,
-				      "Existing references (%d) on node being deleted (%p)",
-				      child_node->reference_count, child_node));
-		}
-
 		/* Now we can delete the node */
 
-		ACPI_FREE(child_node);
+		(void)acpi_os_release_object(acpi_gbl_namespace_cache,
+					     child_node);
 
 		/* And move on to the next child in the list */
 
@@ -358,8 +325,9 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
 
 		/* Get the next node in this scope (NULL if none) */
 
-		child_node = acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
-						   child_node);
+		child_node =
+		    acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
+					  child_node);
 		if (child_node) {
 
 			/* Found a child node - detach any attached object */
@@ -406,57 +374,6 @@ void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ns_remove_reference
- *
- * PARAMETERS:  Node           - Named node whose reference count is to be
- *                               decremented
- *
- * RETURN:      None.
- *
- * DESCRIPTION: Remove a Node reference.  Decrements the reference count
- *              of all parent Nodes up to the root.  Any node along
- *              the way that reaches zero references is freed.
- *
- ******************************************************************************/
-
-static void acpi_ns_remove_reference(struct acpi_namespace_node *node)
-{
-	struct acpi_namespace_node *parent_node;
-	struct acpi_namespace_node *this_node;
-
-	ACPI_FUNCTION_ENTRY();
-
-	/*
-	 * Decrement the reference count(s) of this node and all
-	 * nodes up to the root,  Delete anything with zero remaining references.
-	 */
-	this_node = node;
-	while (this_node) {
-
-		/* Prepare to move up to parent */
-
-		parent_node = acpi_ns_get_parent_node(this_node);
-
-		/* Decrement the reference count on this node */
-
-		this_node->reference_count--;
-
-		/* Delete the node if no more references */
-
-		if (!this_node->reference_count) {
-
-			/* Delete all children and delete the node */
-
-			acpi_ns_delete_children(this_node);
-			acpi_ns_delete_node(this_node);
-		}
-
-		this_node = parent_node;
-	}
-}
-
-/*******************************************************************************
- *
  * FUNCTION:    acpi_ns_delete_namespace_by_owner
  *
  * PARAMETERS:  owner_id    - All nodes with this owner will be deleted
@@ -482,9 +399,9 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
 		return_VOID;
 	}
 
+	deletion_node = NULL;
 	parent_node = acpi_gbl_root_node;
 	child_node = NULL;
-	deletion_node = NULL;
 	level = 1;
 
 	/*
@@ -501,7 +418,8 @@ void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
 					  child_node);
 
 		if (deletion_node) {
-			acpi_ns_remove_reference(deletion_node);
+			acpi_ns_delete_children(deletion_node);
+			acpi_ns_delete_node(deletion_node);
 			deletion_node = NULL;
 		}
 
diff --git a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c
index 586014ecf24b..9fa38ffc2e6e 100644
--- a/drivers/acpi/namespace/nsutils.c
+++ b/drivers/acpi/namespace/nsutils.c
@@ -81,7 +81,7 @@ acpi_ns_report_error(char *module_name,
 	u32 bad_name;
 	char *name = NULL;
 
-	acpi_ut_report_error(module_name, line_number);
+	acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
 
 	if (lookup_status == AE_BAD_CHARACTER) {
 
@@ -139,7 +139,7 @@ acpi_ns_report_method_error(char *module_name,
 	acpi_status status;
 	struct acpi_namespace_node *node = prefix_node;
 
-	acpi_ut_report_error(module_name, line_number);
+	acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
 
 	if (path) {
 		status = acpi_ns_get_node_by_path(path, prefix_node,