On Wed, 18 Nov, at 09:14:23AM, Ingo Molnar wrote: > > * Matt Fleming <[email protected]> wrote: > > > > > + npages = (_end - _text) >> PAGE_SHIFT; > > > > > > You really need to PFN_ALIGN _end and _text. Has been wrong in the > > > existing code as well. > > > > Hmm... very good point. > > So I think we should instead guarantee that _end and _text are page aligned. > > _text is already page aligned: > > SECTIONS > { > #ifdef CONFIG_X86_32 > . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR; > phys_startup_32 = startup_32 - LOAD_OFFSET; > #else > . = __START_KERNEL; > phys_startup_64 = startup_64 - LOAD_OFFSET; > #endif > > /* Text and read-only data */ > .text : AT(ADDR(.text) - LOAD_OFFSET) { > _text = .; > > The reason for aligning _end as well is that we already page-align the BSS > and BRK > sections of the kernel and its various section boundary symbols: > > /* BSS */ > . = ALIGN(PAGE_SIZE); > .bss : AT(ADDR(.bss) - LOAD_OFFSET) { > __bss_start = .; > *(.bss..page_aligned) > *(.bss) > . = ALIGN(PAGE_SIZE); > __bss_stop = .; > } > > . = ALIGN(PAGE_SIZE); > .brk : AT(ADDR(.brk) - LOAD_OFFSET) { > __brk_base = .; > . += 64 * 1024; /* 64k alignment slop space */ > *(.brk_reservation) /* areas brk users have reserved */ > __brk_limit = .; > } > > _end = .; > > STABS_DEBUG > DWARF_DEBUG > > _end is the only odd one out, so we should align it as well - because it's > easy to > make such pfn conversion bugs.
FWIW, I saw no changes in either 32-bit or 64-bit vmlinux size when building with the following patch, so it seems like a pretty easy win, --- >From 25ad518fa52e589f110376ae06e42fb20b3e4188 Mon Sep 17 00:00:00 2001 From: Matt Fleming <[email protected]> Date: Fri, 20 Nov 2015 11:46:11 +0000 Subject: [PATCH] x86: Page align _end to avoid pfn conversion bugs Ingo noted that if we can guarantee _end is aligned to PAGE_SIZE we can automatically avoid bugs along the lines of, size = _end - _text >> PAGE_SHIFT which is missing a call to PFN_ALIGN(). The EFI mixed mode contains this bug, for example. _text is already aligned to PAGE_SIZE through the use of LOAD_PHYSICAL_ADDR, and the BSS and BRK sections are explicitly aligned in the linker script, so it makes sense to align _end to match. Reported-by: Ingo Molnar <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: "H . Peter Anvin" <[email protected]> Cc: Toshi Kani <[email protected]> Cc: Sai Praneeth Prakhya <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Borislav Petkov <[email protected]> Signed-off-by: Matt Fleming <[email protected]> --- arch/x86/kernel/vmlinux.lds.S | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 74e4bf11f562..4f1994257a18 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -325,6 +325,7 @@ SECTIONS __brk_limit = .; } + . = ALIGN(PAGE_SIZE); _end = .; STABS_DEBUG -- 2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

