lkml.org 
[lkml]   [2022]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 5/5] memblock: Disable mirror feature if kernelcore is not specified
    Date
    From: Ma Wupeng <mawupeng1@huawei.com>

    If system have some mirrored memory and mirrored feature is not specified
    in boot parameter, the basic mirrored feature will be enabled and this will
    lead to the following situations:

    - memblock memory allocation prefers mirrored region. This may have some
    unexpected influence on numa affinity.

    - contiguous memory will be split into several parts if parts of them
    is mirrored memory via memblock_mark_mirror().

    To fix this, variable mirrored_kernelcore will be checked in
    memblock_mark_mirror(). Mark mirrored memory with flag MEMBLOCK_MIRROR iff
    kernelcore=mirror is added in the kernel parameters.

    Signed-off-by: Ma Wupeng <mawupeng1@huawei.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    ---
    mm/internal.h | 2 ++
    mm/memblock.c | 3 +++
    mm/page_alloc.c | 2 +-
    3 files changed, 6 insertions(+), 1 deletion(-)

    diff --git a/mm/internal.h b/mm/internal.h
    index c0f8fbe0445b..ddd2d6a46f1b 100644
    --- a/mm/internal.h
    +++ b/mm/internal.h
    @@ -861,4 +861,6 @@ struct folio *try_grab_folio(struct page *page, int refs, unsigned int flags);

    DECLARE_PER_CPU(struct per_cpu_nodestat, boot_nodestats);

    +extern bool mirrored_kernelcore;
    +
    #endif /* __MM_INTERNAL_H */
    diff --git a/mm/memblock.c b/mm/memblock.c
    index b1d2a0009733..a9f18b988b7f 100644
    --- a/mm/memblock.c
    +++ b/mm/memblock.c
    @@ -924,6 +924,9 @@ int __init_memblock memblock_clear_hotplug(phys_addr_t base, phys_addr_t size)
    */
    int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
    {
    + if (!mirrored_kernelcore)
    + return 0;
    +
    system_has_some_mirror = true;

    return memblock_setclr_flag(base, size, 1, MEMBLOCK_MIRROR);
    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index e008a3df0485..10dc35ec7479 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -356,7 +356,7 @@ static unsigned long required_kernelcore_percent __initdata;
    static unsigned long required_movablecore __initdata;
    static unsigned long required_movablecore_percent __initdata;
    static unsigned long zone_movable_pfn[MAX_NUMNODES] __initdata;
    -static bool mirrored_kernelcore __meminitdata;
    +bool mirrored_kernelcore __initdata_memblock;

    /* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */
    int movable_zone;
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-06-14 11:02    [W:3.268 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site