Michael Bringmann <[email protected]> writes:
> During LPAR migration, the content of the device tree/sysfs may
> be updated including deletion and replacement of nodes in the
> tree. When nodes are added to the internal node structures, they
> are appended in FIFO order to a list of nodes maintained by the
> OF code APIs.
That hasn't been true for several years. The data structure is an n-ary
tree. What kernel version are you working on?
> When nodes are removed from the device tree, they
> are marked OF_DETACHED, but not actually deleted from the system
> to allow for pointers cached elsewhere in the kernel. The order
> and content of the entries in the list of nodes is not altered,
> though.
Something is going wrong if this is actually happening.
When the node is detached it should be *detached* from the tree of all
nodes, so it should not be discoverable other than by having an existing
pointer to it.
That's what __of_detach_node() does:
parent = np->parent;
if (WARN_ON(!parent))
return;
if (parent->child == np)
parent->child = np->sibling;
else {
struct device_node *prevsib;
for (prevsib = np->parent->child;
prevsib->sibling != np;
prevsib = prevsib->sibling)
;
prevsib->sibling = np->sibling;
}
ie. the node must already have a NULL parent, and then it is spliced out
of its parent's child list.
Please give us more info so we can work out what's actually happening.
cheers