lkml.org 
[lkml]   [2010]   [Jul]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 37/50] x86, memblock: Add memblock_x86_to_bootmem()
    Date
    memblock_x86_to_bootmem() will reserve memblock.reserved.region in bootmem after bootmem is
    set up.

    We can use it to with all arches that support memblock later.

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    arch/x86/include/asm/memblock.h | 1 +
    arch/x86/mm/memblock.c | 30 ++++++++++++++++++++++++++++++
    2 files changed, 31 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/include/asm/memblock.h b/arch/x86/include/asm/memblock.h
    index c14219a..69cf853 100644
    --- a/arch/x86/include/asm/memblock.h
    +++ b/arch/x86/include/asm/memblock.h
    @@ -4,5 +4,6 @@
    #define ARCH_DISCARD_MEMBLOCK

    u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align);
    +void memblock_x86_to_bootmem(u64 start, u64 end);

    #endif
    diff --git a/arch/x86/mm/memblock.c b/arch/x86/mm/memblock.c
    index c602afb..7986a12 100644
    --- a/arch/x86/mm/memblock.c
    +++ b/arch/x86/mm/memblock.c
    @@ -86,3 +86,33 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align)
    return MEMBLOCK_ERROR;
    }

    +#ifndef CONFIG_NO_BOOTMEM
    +void __init memblock_x86_to_bootmem(u64 start, u64 end)
    +{
    + int count;
    + u64 final_start, final_end;
    + struct memblock_region *r;
    +
    + /* Take out region array itself */
    + if (memblock.reserved.regions != memblock_reserved_init_regions)
    + memblock_free(__pa(memblock.reserved.regions), sizeof(struct memblock_region) * memblock.reserved.max);
    +
    + count = memblock.reserved.cnt;
    + pr_info("(%d early reservations) ==> bootmem [%010llx-%010llx]\n", count, start, end - 1);
    + for_each_memblock(reserved, r) {
    + pr_info(" [%010llx-%010llx] ", (u64)r->base, (u64)r->base + r->size - 1);
    + final_start = max(start, r->base);
    + final_end = min(end, r->base + r->size);
    + if (final_start >= final_end) {
    + pr_cont("\n");
    + continue;
    + }
    + pr_cont(" ==> [%010llx-%010llx]\n", final_start, final_end - 1);
    + reserve_bootmem_generic(final_start, final_end - final_start, BOOTMEM_DEFAULT);
    + }
    +
    + /* Put region array back ? */
    + if (memblock.reserved.regions != memblock_reserved_init_regions)
    + memblock_reserve(__pa(memblock.reserved.regions), sizeof(struct memblock_region) * memblock.reserved.max);
    +}
    +#endif
    --
    1.6.4.2


    \
     
     \ /
      Last update: 2010-07-13 09:21    [W:4.095 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site