lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 119/247] of/fdt: Make sure no-map does not remove already reserved regions
    Date
    From: Nicolas Boichat <drinkcat@chromium.org>

    [ Upstream commit 8a5a75e5e9e55de1cef5d83ca3589cb4899193ef ]

    If the device tree is incorrectly configured, and attempts to
    define a "no-map" reserved memory that overlaps with the kernel
    data/code, the kernel would crash quickly after boot, with no
    obvious clue about the nature of the issue.

    For example, this would happen if we have the kernel mapped at
    these addresses (from /proc/iomem):
    40000000-41ffffff : System RAM
    40080000-40dfffff : Kernel code
    40e00000-411fffff : reserved
    41200000-413e0fff : Kernel data

    And we declare a no-map shared-dma-pool region at a fixed address
    within that range:
    mem_reserved: mem_region {
    compatible = "shared-dma-pool";
    reg = <0 0x40000000 0 0x01A00000>;
    no-map;
    };

    To fix this, when removing memory regions at early boot (which is
    what "no-map" regions do), we need to make sure that the memory
    is not already reserved. If we do, __reserved_mem_reserve_reg
    will throw an error:
    [ 0.000000] OF: fdt: Reserved memory: failed to reserve memory
    for node 'mem_region': base 0x0000000040000000, size 26 MiB
    and the code that will try to use the region should also fail,
    later on.

    We do not do anything for non-"no-map" regions, as memblock
    explicitly allows reserved regions to overlap, and the commit
    that this fixes removed the check for that precise reason.

    [ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ]

    Fixes: 094cb98179f19b7 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap")
    Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
    Reviewed-by: Stephen Boyd <swboyd@chromium.org>
    Signed-off-by: Quentin Perret <qperret@google.com>
    Link: https://lore.kernel.org/r/20210115114544.1830068-3-qperret@google.com
    Signed-off-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/of/fdt.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
    index aa15e5d183c18..21160a08ead4b 100644
    --- a/drivers/of/fdt.c
    +++ b/drivers/of/fdt.c
    @@ -1172,8 +1172,16 @@ int __init __weak early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size)
    int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
    phys_addr_t size, bool nomap)
    {
    - if (nomap)
    + if (nomap) {
    + /*
    + * If the memory is already reserved (by another region), we
    + * should not allow it to be marked nomap.
    + */
    + if (memblock_is_region_reserved(base, size))
    + return -EBUSY;
    +
    return memblock_mark_nomap(base, size);
    + }
    return memblock_reserve(base, size);
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-01 21:37    [W:4.206 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site