• G
    drivers/of: Avoid recursively calling unflatten_dt_node() · 50800082
    Gavin Shan 提交于
    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: NGavin Shan <gwshan@linux.vnet.ibm.com>
    Acked-by: NRob Herring <robh@kernel.org>
    Signed-off-by: NRob Herring <robh@kernel.org>
    50800082
fdt.c 31.1 KB