Patch "x86/boot/32: Fix UP boot on Quark and possibly other platforms" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/boot/32: Fix UP boot on Quark and possibly other platforms
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-boot-32-fix-up-boot-on-quark-and-possibly-other-platforms.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
d2b6dc61a8dd3c429609b993778cb54e75a5c5f0Mon Sep 17 00:00:00 2001
From: Andy Lutomirski <[email protected]>
Date: Mon, 8 May 2017 17:09:10 -0700
Subject: x86/boot/32: Fix UP boot on Quark and possibly other platforms
From: Andy Lutomirski <[email protected]>
commit d2b6dc61a8dd3c429609b993778cb54e75a5c5f0 upstream.
This partially reverts commit:
23b2a4ddebdd17f ("x86/boot/32: Defer resyncing initial_page_table until per-cpu is set up")
That commit had one definite bug and one potential bug. The definite bug is that setup_per_cpu_areas() uses a differnet generic implementation on UP kernels, so initial_page_table never got resynced. This was fine for access to percpu data (it's in the identity map on UP), but it breaks other users of initial_page_table. The potential bug is that helpers like efi_init() would be called before the tables were synced.
Avoid both problems by just syncing the page tables in setup_arch() *and* setup_per_cpu_areas().
--- arch/x86/kernel/setup.c | 15 +++++++++++++++ arch/x86/kernel/setup_percpu.c | 10 +++++----- 2 files changed, 20 insertions(+), 5 deletions(-)
arch/x86/kernel/setup.c +15 -0
@@ -1200,6 +1200,21 @@ void __init setup_arch(char **cmdline_p)kasan_init (); +#ifdef CONFIG_X86_32 +/* sync back kernel address range */ +clone_pgd_range (initial_page_table +KERNEL_PGD_BOUNDARY , + swapper_pg_dir +KERNEL_PGD_BOUNDARY , +KERNEL_PGD_PTRS ); + +/* +* sync back low identity map too. It is used for example +* in the 32-bit EFI stub. +*/ +clone_pgd_range (initial_page_table, + swapper_pg_dir +KERNEL_PGD_BOUNDARY , +min (KERNEL_PGD_PTRS ,KERNEL_PGD_BOUNDARY )); +#endif +tboot_probe ();map_vsyscall ();
arch/x86/kernel/setup_percpu.c +5 -5
@@ -290,11 +290,11 @@ void __init setup_per_cpu_areas(void)#ifdef CONFIG_X86_32 /* -* Sync back kernel address range. We want to make sure that -* all kernel mappings, including percpu mappings, are available -* in the smpboot asm. We can't reliably pick up percpu -* mappings using vmalloc_fault(), because exception dispatch -* needs percpu data. +* Sync back kernel address range again. We already did this in +* setup_arch(), but percpu data also needs to be available in +* the smpboot asm. We can't reliably pick up percpu mappings +* using vmalloc_fault(), because exception dispatch needs +* percpu data. */ clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY, swapper_pg_dir + KERNEL_PGD_BOUNDARY,
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/perf-tools-make-perf_event__synthesize_mmap_events-scale.patch queue-4.9/x86-mm-make-mmap-map_32bit-work-correctly.patch queue-4.9/x86-boot-32-defer-resyncing-initial_page_table-until-per-cpu-is-set-up.patch queue-4.9/x86-boot-32-fix-up-boot-on-quark-and-possibly-other-platforms.patch