powerpc/pseries: Do all node initialization in dlpar_parse_cc_node
authorTyrel Datwyler <tyreld@linux.vnet.ibm.com>
Thu, 15 Aug 2013 05:23:49 +0000 (22:23 -0700)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 27 Aug 2013 04:45:13 +0000 (14:45 +1000)
Currently the OF_DYNAMIC and kref initialization for a node happens in
dlpar_attach_node. However, a node passed to dlpar_attach_node may be a tree
containing child nodes, and no initialization traversal is done on the
tree. Since the children never get their kref initialized or the OF_DYNAMIC
flag set these nodes are prevented from ever being released from memory
should they become detached. This initialization step is better done at the
time each node is allocated in dlpar_parse_cc_node.

Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
Acked-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/pseries/dlpar.c

index a1a7b9a67ffde37f588f3fc6c9db88faab3d02ba..c85523355779292244d51ac03942a2bf0cca2c9a 100644 (file)
@@ -83,6 +83,9 @@ static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa)
                return NULL;
        }
 
+       of_node_set_flag(dn, OF_DYNAMIC);
+       kref_init(&dn->kref);
+
        return dn;
 }
 
@@ -256,8 +259,6 @@ int dlpar_attach_node(struct device_node *dn)
 {
        int rc;
 
-       of_node_set_flag(dn, OF_DYNAMIC);
-       kref_init(&dn->kref);
        dn->parent = derive_parent(dn->full_name);
        if (!dn->parent)
                return -ENOMEM;