On 1/11/2018 3:46 PM, Linus Torvalds wrote: > On Thu, Jan 11, 2018 at 12:37 PM, Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote: >> >> 67a9108ed431 ("x86/efi: Build our own page table structures") >> >> got rid of EFI depending on real_mode_header->trampoline_pgd > > So I think it only got rid of by default - the codepath is still > there, the allocation is still there, it's just that it's not actually > used unless somebody does that "efi=old_mmap" thing. > > Looking around, there's at least one quirk for the SGI UV1 system that > enables EFI_OLD_MMAP automatically. There might be others that I > missed, but I think that's it. > > So it *can* trigger without "efi=old_mmap", but not on any normal machines. > > And as Pavel points out, even when the bug is active, it's pretty hard > to actually trigger. > > But yeah, there may be other EFI patches that I didn't notice that > changed things in other ways too. > > Linus The bug is not present in the latest upstream kernel because the efi_pgd is correctly aligned: arch/x86/platform/efi/efi_64.c int __init efi_alloc_page_tables(void) efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER); arch/x86/include/asm/pgalloc.h +#ifdef CONFIG_PAGE_TABLE_ISOLATION +#define PGD_ALLOCATION_ORDER 1 +#else +#define PGD_ALLOCATION_ORDER 0 +#endif Pavel's patch fixes kernels prior to 67a9108ed431 ("x86/efi: Build our own page table structures") where the efi pgd allocation looks like: arch/x86/realmode/init.c void __init reserve_real_mode(void) mem = memblock_find_in_range(0, 1<<20, size, PAGE_SIZE); base = __va(mem); real_mode_header = (struct real_mode_header *) base; void __init setup_real_mode(void) trampoline_pgd = (u64 *) __va(real_mode_header->trampoline_pgd); Kernel versions between 67a9108ed431 and the latest also have the bug and need a similar fix: arch/x86/platform/efi/efi_64.c int __init efi_alloc_page_tables(void) efi_pgd = (pgd_t *)__get_free_page(gfp_mask); int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) pgd = efi_pgd; efi_scratch.efi_pgt = (pgd_t *)__pa(efi_pgd); All of the code paths above are taken when *not* EFI_OLD_MMAP. - Steve