Patch "x86/mtrr: Fix PAT init handling when MTRR is disabled" has been added to the 4.6-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/mtrr: Fix PAT init handling when MTRR is disabled
to the 4.6-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-mtrr-fix-pat-init-handling-when-mtrr-is-disabled.patch
and it can be found in the queue-4.6 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
ad025a73f0e9344ac73ffe1b74c184033e08e7d5Mon Sep 17 00:00:00 2001
From: Toshi Kani <[email protected]>
Date: Wed, 23 Mar 2016 15:42:01 -0600
Subject: x86/mtrr: Fix PAT init handling when MTRR is disabled
From: Toshi Kani <[email protected]>
commit ad025a73f0e9344ac73ffe1b74c184033e08e7d5 upstream.
get_mtrr_state() calls pat_init() on BSP even if MTRR is disabled. This results in calling pat_init() on BSP only since APs do not call pat_init() when MTRR is disabled. This inconsistency between BSP and APs leads to undefined behavior.
Make BSP's calling condition to pat_init() consistent with AP's, mtrr_ap_init() and mtrr_aps_init().
--- arch/x86/kernel/cpu/mtrr/generic.c | 24 ++++++++++++++---------- arch/x86/kernel/cpu/mtrr/main.c | 3 +++ arch/x86/kernel/cpu/mtrr/mtrr.h | 1 + 3 files changed, 18 insertions(+), 10 deletions(-)
arch/x86/kernel/cpu/mtrr/generic.c +14 -10
@@ -444,11 +444,24 @@ static void __init print_mtrr_state(voidpr_debug ("TOM2: %016llx aka %lldM\n" , mtrr_tom2, mtrr_tom2>>20 ); } +/* PAT setup for BP. We need to go through sync steps here */ +void __init mtrr_bp_pat_init (void ) +{ +unsigned long flags; + +local_irq_save (flags); +prepare_set (); + +pat_init (); + +post_set (); +local_irq_restore (flags); +} +/* Grab all of the MTRR state for this CPU into *state */ bool __init get_mtrr_state (void ) {struct mtrr_var_range *vrs; -unsigned long flags;unsigned lo, dummy;unsigned int i;
@@ -481,15 +494,6 @@ bool __init get_mtrr_state(void) mtrr_state_set =1 ; -/* PAT setup for BP. We need to go through sync steps here */ -local_irq_save (flags); -prepare_set (); - -pat_init (); - -post_set (); -local_irq_restore (flags); -return !!(mtrr_state.enabled &MTRR_STATE_MTRR_ENABLED ); }
arch/x86/kernel/cpu/mtrr/main.c +3 -0
@@ -752,6 +752,9 @@ void __init mtrr_bp_init(void)/* BIOS may override */ __mtrr_enabled =get_mtrr_state (); +if (mtrr_enabled ()) +mtrr_bp_pat_init (); +if (mtrr_cleanup (phys_addr)) { changed_by_mtrr_cleanup =1 ; mtrr_if->set_all ();
arch/x86/kernel/cpu/mtrr/mtrr.h +1 -0
@@ -52,6 +52,7 @@ void set_mtrr_prepare_save(struct set_mtvoid fill_mtrr_var_range (unsigned int index,u32 base_lo,u32 base_hi,u32 mask_lo,u32 mask_hi);bool get_mtrr_state (void ); +void mtrr_bp_pat_init (void );extern void set_mtrr_ops (const struct mtrr_ops *ops);
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/x86-mm-pat-replace-cpu_has_pat-with-boot_cpu_has.patch queue-4.6/x86-mtrr-fix-xorg-crashes-in-qemu-sessions.patch queue-4.6/libnvdimm-pfn-dax-fix-initialization-vs-autodetect-for-mode-alignment.patch queue-4.6/x86-mm-pat-add-support-of-non-default-pat-msr-setting.patch queue-4.6/x86-xen-pat-remove-pat-table-init-code-from-xen.patch queue-4.6/x86-mtrr-fix-pat-init-handling-when-mtrr-is-disabled.patch queue-4.6/x86-mm-pat-add-pat_disable-interface.patch queue-4.6/x86-mm-pat-fix-bug_on-in-mmap_mem-on-qemu-i386.patch queue-4.6/x86-pat-document-the-pat-initialization-sequence.patch