Skip to contentSkip to conversation

Patch "x86/mtrr: Fix PAT init handling when MTRR is disabled" has been added to the 4.6-stable tree

PATCH [email protected] 1 participant 1 message Aug 14, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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 ad025a73f0e9344ac73ffe1b74c184033e08e7d5 Mon 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(void
 		pr_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_mt
 void 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