^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Module Name: nsalloc - Namespace allocation and deletion utilities
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "acnamesp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define _COMPONENT ACPI_NAMESPACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ACPI_MODULE_NAME("nsalloc")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * FUNCTION: acpi_ns_create_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * PARAMETERS: name - Name of the new node (4 char ACPI name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * RETURN: New namespace node (Null on failure)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * DESCRIPTION: Create a namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct acpi_namespace_node *acpi_ns_create_node(u32 name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct acpi_namespace_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #ifdef ACPI_DBG_TRACK_ALLOCATIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) u32 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ACPI_FUNCTION_TRACE(ns_create_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) node = acpi_os_acquire_object(acpi_gbl_namespace_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #ifdef ACPI_DBG_TRACK_ALLOCATIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) temp = acpi_gbl_ns_node_list->total_allocated -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) acpi_gbl_ns_node_list->total_freed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) if (temp > acpi_gbl_ns_node_list->max_occupied) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) acpi_gbl_ns_node_list->max_occupied = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) node->name.integer = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ACPI_SET_DESCRIPTOR_TYPE(node, ACPI_DESC_TYPE_NAMED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) return_PTR(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * FUNCTION: acpi_ns_delete_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * PARAMETERS: node - Node to be deleted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * RETURN: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * DESCRIPTION: Delete a namespace node. All node deletions must come through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * here. Detaches any attached objects, including any attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * data. If a handler is associated with attached data, it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * invoked before the node is deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) void acpi_ns_delete_node(struct acpi_namespace_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) union acpi_operand_object *next_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ACPI_FUNCTION_NAME(ns_delete_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Detach an object if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) acpi_ns_detach_object(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * Delete an attached data object list if present (objects that were
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * attached via acpi_attach_data). Note: After any normal object is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * detached above, the only possible remaining object(s) are data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * objects, in a linked list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) obj_desc = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) while (obj_desc && (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* Invoke the attached data deletion handler if present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (obj_desc->data.handler) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) obj_desc->data.handler(node, obj_desc->data.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) next_desc = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) acpi_ut_remove_reference(obj_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) obj_desc = next_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* Special case for the statically allocated root node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) if (node == acpi_gbl_root_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /* Now we can delete the node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) (void)acpi_os_release_object(acpi_gbl_namespace_cache, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Node %p, Remaining %X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) node, acpi_gbl_current_node_count));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * FUNCTION: acpi_ns_remove_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * PARAMETERS: node - Node to be removed/deleted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * RETURN: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * DESCRIPTION: Remove (unlink) and delete a namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) void acpi_ns_remove_node(struct acpi_namespace_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) struct acpi_namespace_node *parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct acpi_namespace_node *prev_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct acpi_namespace_node *next_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) ACPI_FUNCTION_TRACE_PTR(ns_remove_node, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) parent_node = node->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) prev_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) next_node = parent_node->child;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* Find the node that is the previous peer in the parent's child list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) while (next_node != node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) prev_node = next_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) next_node = next_node->peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (prev_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /* Node is not first child, unlink it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) prev_node->peer = node->peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Node is first child (has no previous peer).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * Link peer list to parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) parent_node->child = node->peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* Delete the node and any attached objects */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) acpi_ns_delete_node(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * FUNCTION: acpi_ns_install_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * PARAMETERS: walk_state - Current state of the walk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * parent_node - The parent of the new Node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * node - The new Node to install
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * type - ACPI object type of the new Node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * RETURN: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * DESCRIPTION: Initialize a new namespace node and install it amongst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * its peers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * Note: Current namespace lookup is linear search. This appears
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * to be sufficient as namespace searches consume only a small
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * fraction of the execution time of the ACPI subsystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namespace_node *parent_node, /* Parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct acpi_namespace_node *node, /* New Child */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) acpi_object_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) acpi_owner_id owner_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) struct acpi_namespace_node *child_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) ACPI_FUNCTION_TRACE(ns_install_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (walk_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) * Get the owner ID from the Walk state. The owner ID is used to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * track table deletion and deletion of objects created by methods.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) owner_id = walk_state->owner_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if ((walk_state->method_desc) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) (parent_node != walk_state->method_node)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * A method is creating a new node that is not a child of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * method (it is non-local). Mark the executing method as having
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * modified the namespace. This is used for cleanup when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * method exits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) walk_state->method_desc->method.info_flags |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ACPI_METHOD_MODIFIED_NAMESPACE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* Link the new entry into the parent and existing children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) node->peer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) node->parent = parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) child_node = parent_node->child;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!child_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) parent_node->child = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* Add node to the end of the peer list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) while (child_node->peer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) child_node = child_node->peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) child_node->peer = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* Init the new entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) node->owner_id = owner_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) node->type = (u8) type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) "%4.4s (%s) [Node %p Owner %3.3X] added to %4.4s (%s) [Node %p]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) acpi_ut_get_node_name(node),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) acpi_ut_get_type_name(node->type), node, owner_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) acpi_ut_get_node_name(parent_node),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) acpi_ut_get_type_name(parent_node->type),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) parent_node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * FUNCTION: acpi_ns_delete_children
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * PARAMETERS: parent_node - Delete this objects children
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * RETURN: None.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * DESCRIPTION: Delete all children of the parent object. In other words,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * deletes a "scope".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) struct acpi_namespace_node *next_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct acpi_namespace_node *node_to_delete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) ACPI_FUNCTION_TRACE_PTR(ns_delete_children, parent_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (!parent_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* Deallocate all children at this level */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) next_node = parent_node->child;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) while (next_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* Grandchildren should have all been deleted already */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (next_node->child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) parent_node, next_node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * Delete this child node and move on to the next child in the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) * No need to unlink the node since we are deleting the entire branch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) node_to_delete = next_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) next_node = next_node->peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) acpi_ns_delete_node(node_to_delete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* Clear the parent's child pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) parent_node->child = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * FUNCTION: acpi_ns_delete_namespace_subtree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * PARAMETERS: parent_node - Root of the subtree to be deleted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * RETURN: None.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * DESCRIPTION: Delete a subtree of the namespace. This includes all objects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * stored within the subtree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) struct acpi_namespace_node *child_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) u32 level = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) ACPI_FUNCTION_TRACE(ns_delete_namespace_subtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (!parent_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) /* Lock namespace for possible update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * Traverse the tree of objects until we bubble back up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * to where we started.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) while (level > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* Get the next node in this scope (NULL if none) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) child_node = acpi_ns_get_next_node(parent_node, child_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (child_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /* Found a child node - detach any attached object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) acpi_ns_detach_object(child_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* Check if this node has any children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if (child_node->child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) * There is at least one child of this node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * visit the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) level++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) parent_node = child_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) child_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * No more children of this parent node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * Move up to the grandparent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) level--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) * Now delete all of the children of this parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * all at the same time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) acpi_ns_delete_children(parent_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) /* New "last child" is this parent node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) child_node = parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* Move up the tree to the grandparent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) parent_node = parent_node->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) * FUNCTION: acpi_ns_delete_namespace_by_owner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) * PARAMETERS: owner_id - All nodes with this owner will be deleted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) * DESCRIPTION: Delete entries within the namespace that are owned by a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) * specific ID. Used to delete entire ACPI tables. All
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * reference counts are updated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * MUTEX: Locks namespace during deletion walk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct acpi_namespace_node *child_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct acpi_namespace_node *deletion_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct acpi_namespace_node *parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) u32 level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) ACPI_FUNCTION_TRACE_U32(ns_delete_namespace_by_owner, owner_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (owner_id == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) /* Lock namespace for possible update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) deletion_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) parent_node = acpi_gbl_root_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) child_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) level = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * Traverse the tree of nodes until we bubble back up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * to where we started.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) while (level > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) * Get the next child of this parent node. When child_node is NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * the first child of the parent is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) child_node = acpi_ns_get_next_node(parent_node, child_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (deletion_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) acpi_ns_delete_children(deletion_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) acpi_ns_remove_node(deletion_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) deletion_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (child_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (child_node->owner_id == owner_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) /* Found a matching child node - detach any attached object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) acpi_ns_detach_object(child_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /* Check if this node has any children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) if (child_node->child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * There is at least one child of this node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * visit the node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) level++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) parent_node = child_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) child_node = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) } else if (child_node->owner_id == owner_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) deletion_node = child_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) * No more children of this parent node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) * Move up to the grandparent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) level--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (level != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) if (parent_node->owner_id == owner_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) deletion_node = parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /* New "last child" is this parent node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) child_node = parent_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) /* Move up the tree to the grandparent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) parent_node = parent_node->parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }