drivers/of: Avoid recursively calling unflatten_dt_node()
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Tue, 3 May 2016 13:22:48 +0000 (23:22 +1000)
committerRob Herring <robh@kernel.org>
Mon, 16 May 2016 12:22:34 +0000 (07:22 -0500)
commit50800082f17645620bfdd357ba9141c86b76363d
treed5e13e0dd6bf52d2908d090c9b4654aa7b8ecf8d
parentdfbd4c6eff35f1b1065cca046003cc9d7ff27222
drivers/of: Avoid recursively calling unflatten_dt_node()

In current implementation, unflatten_dt_node() is called recursively
to unflatten device nodes in FDT blob. It's stress to limited stack
capacity, especially to adopt the function to unflatten device sub-tree
that possibly has multiple root nodes. In that case, we runs out of
stack and the system can't boot up successfully.

In order to reuse the function to unflatten device sub-tree, this avoids
calling the function recursively, meaning the device nodes are unflattened
in one call on unflatten_dt_node(): two arrays are introduced to track the
parent path size and the device node of current level of depth, which will
be used by the device node on next level of depth to be unflattened. All
device nodes in more than 64 level of depth are dropped and hopefully,
the system can boot up successfully with the partial device-tree.

Also, the parameter "poffset" and "fpsize" are unused and dropped and the
parameter "dryrun" is figured out from "mem == NULL". Besides, the return
value of the function is changed to indicate the size of memory consumed by
the unflatten device tree or error code.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Rob Herring <robh@kernel.org>
drivers/of/fdt.c