ACPICA: Optimization: Reduce the number of namespace walks
authorAlexey Starikovskiy <astarikovskiy@suse.de>
Wed, 26 May 2010 05:59:51 +0000 (13:59 +0800)
committerLen Brown <len.brown@intel.com>
Wed, 7 Jul 2010 02:33:57 +0000 (22:33 -0400)
On control method exit, only walk the namespace if the method is
known to have created namespace objects outside of its local scope.

Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/nsalloc.c

index 0084633..64750ee 100644 (file)
@@ -584,8 +584,22 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
                 * want make the objects permanent.
                 */
                if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) {
-                       acpi_ns_delete_namespace_by_owner(method_desc->method.
-                                                         owner_id);
+
+                       /* Delete any direct children of (created by) this method */
+
+                       acpi_ns_delete_namespace_subtree(walk_state->
+                                                        method_node);
+
+                       /*
+                        * Delete any objects that were created by this method
+                        * elsewhere in the namespace (if any were created).
+                        */
+                       if (method_desc->method.
+                           flags & AOPOBJ_MODIFIED_NAMESPACE) {
+                               acpi_ns_delete_namespace_by_owner(method_desc->
+                                                                 method.
+                                                                 owner_id);
+                       }
                }
        }
 
index 8d3a43a..1e5ff80 100644 (file)
@@ -219,12 +219,24 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
 
        ACPI_FUNCTION_TRACE(ns_install_node);
 
-       /*
-        * Get the owner ID from the Walk state. The owner ID is used to track
-        * table deletion and deletion of objects created by methods.
-        */
        if (walk_state) {
+               /*
+                * Get the owner ID from the Walk state. The owner ID is used to
+                * track table deletion and deletion of objects created by methods.
+                */
                owner_id = walk_state->owner_id;
+
+               if ((walk_state->method_desc) &&
+                   (parent_node != walk_state->method_node)) {
+                       /*
+                        * A method is creating a new node that is not a child of the
+                        * method (it is non-local). Mark the executing method as having
+                        * modified the namespace. This is used for cleanup when the
+                        * method exits.
+                        */
+                       walk_state->method_desc->method.flags |=
+                           AOPOBJ_MODIFIED_NAMESPACE;
+               }
        }
 
        /* Link the new entry into the parent and existing children */