• Guenter Roeck's avatar
    of/fdt: Add mutex protection for calls to __unflatten_device_tree() · f8062386
    Guenter Roeck authored
    __unflatten_device_tree() calls unflatten_dt_node(), which declares
    a static variable. It is therefore not reentrant.
    
    One of the callers of __unflatten_device_tree(), unflatten_device_tree(),
    is only called once during early initialization and does not need to be
    protected. The other caller, of_fdt_unflatten_tree(), can be called at
    any time, possibly multiple times in parallel. This can happen, for
    example, if multiple devicetree overlays have to be loaded and installed.
    
    Without this protection, errors such as the following may be seen.
    
    kernel: End of tree marker overwritten: e6a3a458
    kernel: find_target_node:
    	Failed to find target-indirect node at /fragment@0
    kernel: __of_overlay_create: of_build_overlay_info() failed for tree@/
    
    Add a mutex to of_fdt_unflatten_tree() to make the call reentrant.
    
    Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
    Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Cc: stable@vger.kernel.org # v4.1+
    Signed-off-by: default avatarRob Herring <robh@kernel.org>
    f8062386
fdt.c 29.6 KB