lkml.org 
[lkml]   [2020]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 104/117] of: Fix reserved-memory overlap detection
    Date
    From: Vincent Whitchurch <vincent.whitchurch@axis.com>

    [ Upstream commit ca05f33316559a04867295dd49f85aeedbfd6bfd ]

    The reserved-memory overlap detection code fails to detect overlaps if
    either of the regions starts at address 0x0. The code explicitly checks
    for and ignores such regions, apparently in order to ignore dynamically
    allocated regions which have an address of 0x0 at this point. These
    dynamically allocated regions also have a size of 0x0 at this point, so
    fix this by removing the check and sorting the dynamically allocated
    regions ahead of any static regions at address 0x0.

    For example, there are two overlaps in this case but they are not
    currently reported:

    foo@0 {
    reg = <0x0 0x2000>;
    };

    bar@0 {
    reg = <0x0 0x1000>;
    };

    baz@1000 {
    reg = <0x1000 0x1000>;
    };

    quux {
    size = <0x1000>;
    };

    but they are after this patch:

    OF: reserved mem: OVERLAP DETECTED!
    bar@0 (0x00000000--0x00001000) overlaps with foo@0 (0x00000000--0x00002000)
    OF: reserved mem: OVERLAP DETECTED!
    foo@0 (0x00000000--0x00002000) overlaps with baz@1000 (0x00001000--0x00002000)

    Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
    Link: https://lore.kernel.org/r/ded6fd6b47b58741aabdcc6967f73eca6a3f311e.1603273666.git-series.vincent.whitchurch@axis.com
    Signed-off-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/of/of_reserved_mem.c | 13 +++++++++++--
    1 file changed, 11 insertions(+), 2 deletions(-)

    diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
    index 366d8c3c79893..f15bb936dfd84 100644
    --- a/drivers/of/of_reserved_mem.c
    +++ b/drivers/of/of_reserved_mem.c
    @@ -222,6 +222,16 @@ static int __init __rmem_cmp(const void *a, const void *b)
    if (ra->base > rb->base)
    return 1;

    + /*
    + * Put the dynamic allocations (address == 0, size == 0) before static
    + * allocations at address 0x0 so that overlap detection works
    + * correctly.
    + */
    + if (ra->size < rb->size)
    + return -1;
    + if (ra->size > rb->size)
    + return 1;
    +
    return 0;
    }

    @@ -239,8 +249,7 @@ static void __init __rmem_check_for_overlap(void)

    this = &reserved_mem[i];
    next = &reserved_mem[i + 1];
    - if (!(this->base && next->base))
    - continue;
    +
    if (this->base + this->size > next->base) {
    phys_addr_t this_end, next_end;

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-11-09 14:37    [W:4.151 / U:0.568 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site