Lines Matching +full:child +full:- +full:node
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
4 * Module Name: nsalloc - Namespace allocation and deletion utilities
19 * PARAMETERS: name - Name of the new node (4 char ACPI name)
21 * RETURN: New namespace node (Null on failure)
23 * DESCRIPTION: Create a namespace node
28 struct acpi_namespace_node *node; in acpi_ns_create_node() local
35 node = acpi_os_acquire_object(acpi_gbl_namespace_cache); in acpi_ns_create_node()
36 if (!node) { in acpi_ns_create_node()
40 ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++); in acpi_ns_create_node()
43 temp = acpi_gbl_ns_node_list->total_allocated - in acpi_ns_create_node()
44 acpi_gbl_ns_node_list->total_freed; in acpi_ns_create_node()
45 if (temp > acpi_gbl_ns_node_list->max_occupied) { in acpi_ns_create_node()
46 acpi_gbl_ns_node_list->max_occupied = temp; in acpi_ns_create_node()
50 node->name.integer = name; in acpi_ns_create_node()
51 ACPI_SET_DESCRIPTOR_TYPE(node, ACPI_DESC_TYPE_NAMED); in acpi_ns_create_node()
52 return_PTR(node); in acpi_ns_create_node()
59 * PARAMETERS: node - Node to be deleted
63 * DESCRIPTION: Delete a namespace node. All node deletions must come through
66 * invoked before the node is deleted.
70 void acpi_ns_delete_node(struct acpi_namespace_node *node) in acpi_ns_delete_node() argument
79 acpi_ns_detach_object(node); in acpi_ns_delete_node()
87 obj_desc = node->object; in acpi_ns_delete_node()
88 while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { in acpi_ns_delete_node()
92 if (obj_desc->data.handler) { in acpi_ns_delete_node()
93 obj_desc->data.handler(node, obj_desc->data.pointer); in acpi_ns_delete_node()
96 next_desc = obj_desc->common.next_object; in acpi_ns_delete_node()
101 /* Special case for the statically allocated root node */ in acpi_ns_delete_node()
103 if (node == acpi_gbl_root_node) { in acpi_ns_delete_node()
107 /* Now we can delete the node */ in acpi_ns_delete_node()
109 (void)acpi_os_release_object(acpi_gbl_namespace_cache, node); in acpi_ns_delete_node()
111 ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++); in acpi_ns_delete_node()
112 ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Node %p, Remaining %X\n", in acpi_ns_delete_node()
113 node, acpi_gbl_current_node_count)); in acpi_ns_delete_node()
120 * PARAMETERS: node - Node to be removed/deleted
124 * DESCRIPTION: Remove (unlink) and delete a namespace node
128 void acpi_ns_remove_node(struct acpi_namespace_node *node) in acpi_ns_remove_node() argument
134 ACPI_FUNCTION_TRACE_PTR(ns_remove_node, node); in acpi_ns_remove_node()
136 parent_node = node->parent; in acpi_ns_remove_node()
139 next_node = parent_node->child; in acpi_ns_remove_node()
141 /* Find the node that is the previous peer in the parent's child list */ in acpi_ns_remove_node()
143 while (next_node != node) { in acpi_ns_remove_node()
145 next_node = next_node->peer; in acpi_ns_remove_node()
150 /* Node is not first child, unlink it */ in acpi_ns_remove_node()
152 prev_node->peer = node->peer; in acpi_ns_remove_node()
155 * Node is first child (has no previous peer). in acpi_ns_remove_node()
158 parent_node->child = node->peer; in acpi_ns_remove_node()
161 /* Delete the node and any attached objects */ in acpi_ns_remove_node()
163 acpi_ns_delete_node(node); in acpi_ns_remove_node()
171 * PARAMETERS: walk_state - Current state of the walk
172 * parent_node - The parent of the new Node
173 * node - The new Node to install
174 * type - ACPI object type of the new Node
178 * DESCRIPTION: Initialize a new namespace node and install it amongst
188 struct acpi_namespace_node *node, /* New Child */ in acpi_ns_install_node() argument
201 owner_id = walk_state->owner_id; in acpi_ns_install_node()
203 if ((walk_state->method_desc) && in acpi_ns_install_node()
204 (parent_node != walk_state->method_node)) { in acpi_ns_install_node()
206 * A method is creating a new node that is not a child of the in acpi_ns_install_node()
207 * method (it is non-local). Mark the executing method as having in acpi_ns_install_node()
211 walk_state->method_desc->method.info_flags |= in acpi_ns_install_node()
218 node->peer = NULL; in acpi_ns_install_node()
219 node->parent = parent_node; in acpi_ns_install_node()
220 child_node = parent_node->child; in acpi_ns_install_node()
223 parent_node->child = node; in acpi_ns_install_node()
225 /* Add node to the end of the peer list */ in acpi_ns_install_node()
227 while (child_node->peer) { in acpi_ns_install_node()
228 child_node = child_node->peer; in acpi_ns_install_node()
231 child_node->peer = node; in acpi_ns_install_node()
236 node->owner_id = owner_id; in acpi_ns_install_node()
237 node->type = (u8) type; in acpi_ns_install_node()
240 "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n", in acpi_ns_install_node()
241 acpi_ut_get_node_name(node), in acpi_ns_install_node()
242 acpi_ut_get_type_name(node->type), node, owner_id, in acpi_ns_install_node()
244 acpi_ut_get_type_name(parent_node->type), in acpi_ns_install_node()
254 * PARAMETERS: parent_node - Delete this objects children
276 next_node = parent_node->child; in acpi_ns_delete_children()
281 if (next_node->child) { in acpi_ns_delete_children()
287 * Delete this child node and move on to the next child in the list. in acpi_ns_delete_children()
288 * No need to unlink the node since we are deleting the entire branch. in acpi_ns_delete_children()
291 next_node = next_node->peer; in acpi_ns_delete_children()
295 /* Clear the parent's child pointer */ in acpi_ns_delete_children()
297 parent_node->child = NULL; in acpi_ns_delete_children()
305 * PARAMETERS: parent_node - Root of the subtree to be deleted
339 /* Get the next node in this scope (NULL if none) */ in acpi_ns_delete_namespace_subtree()
344 /* Found a child node - detach any attached object */ in acpi_ns_delete_namespace_subtree()
348 /* Check if this node has any children */ in acpi_ns_delete_namespace_subtree()
350 if (child_node->child) { in acpi_ns_delete_namespace_subtree()
352 * There is at least one child of this node, in acpi_ns_delete_namespace_subtree()
353 * visit the node in acpi_ns_delete_namespace_subtree()
361 * No more children of this parent node. in acpi_ns_delete_namespace_subtree()
364 level--; in acpi_ns_delete_namespace_subtree()
372 /* New "last child" is this parent node */ in acpi_ns_delete_namespace_subtree()
378 parent_node = parent_node->parent; in acpi_ns_delete_namespace_subtree()
390 * PARAMETERS: owner_id - All nodes with this owner will be deleted
434 * Get the next child of this parent node. When child_node is NULL, in acpi_ns_delete_namespace_by_owner()
435 * the first child of the parent is returned in acpi_ns_delete_namespace_by_owner()
446 if (child_node->owner_id == owner_id) { in acpi_ns_delete_namespace_by_owner()
448 /* Found a matching child node - detach any attached object */ in acpi_ns_delete_namespace_by_owner()
453 /* Check if this node has any children */ in acpi_ns_delete_namespace_by_owner()
455 if (child_node->child) { in acpi_ns_delete_namespace_by_owner()
457 * There is at least one child of this node, in acpi_ns_delete_namespace_by_owner()
458 * visit the node in acpi_ns_delete_namespace_by_owner()
463 } else if (child_node->owner_id == owner_id) { in acpi_ns_delete_namespace_by_owner()
468 * No more children of this parent node. in acpi_ns_delete_namespace_by_owner()
471 level--; in acpi_ns_delete_namespace_by_owner()
473 if (parent_node->owner_id == owner_id) { in acpi_ns_delete_namespace_by_owner()
478 /* New "last child" is this parent node */ in acpi_ns_delete_namespace_by_owner()
484 parent_node = parent_node->parent; in acpi_ns_delete_namespace_by_owner()