ACPICA: Optimization: Reduce the number of namespace walks
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>
This commit is contained in:
parent
20d33aea7a
commit
a9fc03125e
@ -584,8 +584,22 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
|
|||||||
* want make the objects permanent.
|
* want make the objects permanent.
|
||||||
*/
|
*/
|
||||||
if (!(method_desc->method.flags & AOPOBJ_MODULE_LEVEL)) {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,12 +219,24 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp
|
|||||||
|
|
||||||
ACPI_FUNCTION_TRACE(ns_install_node);
|
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) {
|
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;
|
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 */
|
/* Link the new entry into the parent and existing children */
|
||||||
|
Loading…
Reference in New Issue
Block a user