Skip to content

Commit

Permalink
ACPICA: Optimization: Reduce the number of namespace walks
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alexey Starikovskiy authored and Len Brown committed Jul 7, 2010
1 parent 20d33ae commit a9fc031
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
18 changes: 16 additions & 2 deletions drivers/acpi/acpica/dsmethod.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

Expand Down
20 changes: 16 additions & 4 deletions drivers/acpi/acpica/nsalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit a9fc031

Please sign in to comment.