Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9fc0312 authored by Alexey Starikovskiy's avatar Alexey Starikovskiy Committed by Len Brown
Browse files

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: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 20d33aea
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -584,10 +584,24 @@ 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.

			/* 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);
			}
		}
	}

	/* Decrement the thread count on the method */

+16 −4
Original line number Diff line number Diff line
@@ -219,12 +219,24 @@ void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namesp

	ACPI_FUNCTION_TRACE(ns_install_node);

	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.
		 * 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) {
		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 */