[PATCH] powerpc: add for_each_node_by_foo helpers
Nathan Lynch
ntl at pobox.com
Wed Mar 15 16:16:57 EST 2006
Nathan Lynch wrote:
> Benjamin Herrenschmidt wrote:
> >
> > > > I recently showed a variety of scenarios that would blow up in funny
> > > > ways.. It's not enough.
> > >
> > > A variety of scenarios? I'm aware of only one [1], which is kind of a
> > > corner case, and has never come up in practice to my knowledge.
> > >
> > > If you know of others, I'd like to know the details.
> >
> > I actually have one in mind that I remember, but I'm pretty sure I saw
> > another one...
>
> More details, please. If you know of another issue besides the one
> pointed out already, I'd prefer to know the nature of it before
> putting more time into fixing this one.
Milton just pointed out to me another problem.
There is a race between add and remove operations in that a child can
be added to a node that is undergoing removal, which would cause an
inconsistent tree:
static int pSeries_reconfig_remove_node(struct device_node *np, int refs)
{
struct device_node *parent, *child;
parent = of_get_parent(np);
if (!parent)
return -EINVAL;
if ((child = of_get_next_child(np, NULL))) {
of_node_put(child);
return -EBUSY;
}
>>>> /* child could be added now */
remove_node_proc_entries(np);
notifier_call_chain(&pSeries_reconfig_chain,
PSERIES_RECONFIG_REMOVE, np);
of_detach_node(np, refs);
Unlike the double-remove problem, this one seems easy to fix :)
The check for the child should be moved under the devtree_lock, or we
could serialize reconfig operations with a mutex.
More information about the Linuxppc64-dev
mailing list