• D
    x86/e820: Use much less memory for e820/e820_saved, save up to 120k · 18278229
    Denys Vlasenko 提交于
    The maximum size of e820 map array for EFI systems is defined as
    E820_X_MAX (E820MAX + 3 * MAX_NUMNODES).
    
    In x86_64 defconfig, this ends up with E820_X_MAX = 320, e820 and e820_saved
    are 6404 bytes each.
    
    With larger configs, for example Fedora kernels, E820_X_MAX = 3200, e820
    and e820_saved are 64004 bytes each. Most of this space is wasted.
    Typical machines have some 20-30 e820 areas at most.
    
    After previous patch, e820 and e820_saved are pointers to e280 maps.
    
    Change them to initially point to maps which are __initdata.
    
    At the very end of kernel init, just before __init[data] sections are freed
    in free_initmem(), allocate smaller blocks, copy maps there,
    and change pointers.
    
    The late switch makes sure that all functions which can be used to change
    e820 maps are no longer accessible (they are all __init functions).
    
    Run-tested.
    Signed-off-by: NDenys Vlasenko <dvlasenk@redhat.com>
    Acked-by: NThomas Gleixner <tglx@linutronix.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Yinghai Lu <yinghai@kernel.org>
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/20160918182125.21000-1-dvlasenk@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    18278229
e820.c 30.5 KB