]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 Dec 2017 10:06:09 +0000 (11:06 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 Dec 2017 10:06:09 +0000 (11:06 +0100)
added patches:
x86-mm-64-fix-reboot-interaction-with-cr4.pcide.patch
x86-mm-add-the-nopcid-boot-option-to-turn-off-pcid.patch
x86-mm-enable-cr4.pcide-on-supported-systems.patch

queue-4.4/series
queue-4.4/x86-mm-64-fix-reboot-interaction-with-cr4.pcide.patch [new file with mode: 0644]
queue-4.4/x86-mm-add-the-nopcid-boot-option-to-turn-off-pcid.patch [new file with mode: 0644]
queue-4.4/x86-mm-enable-cr4.pcide-on-supported-systems.patch [new file with mode: 0644]

index a7ff758dea4c9bbb430f46a88bf988aeddee5104..6f7b7b35a2f090b55d5193439f0b05b63e7718dc 100644 (file)
@@ -27,4 +27,7 @@ x86-mm-make-flush_tlb_mm_range-more-predictable.patch
 x86-mm-reimplement-flush_tlb_page-using-flush_tlb_mm_range.patch
 x86-mm-remove-the-up-asm-tlbflush.h-code-always-use-the-formerly-smp-code.patch
 x86-mm-disable-pcid-on-32-bit-kernels.patch
+x86-mm-add-the-nopcid-boot-option-to-turn-off-pcid.patch
+x86-mm-enable-cr4.pcide-on-supported-systems.patch
+x86-mm-64-fix-reboot-interaction-with-cr4.pcide.patch
 kbuild-add-fno-stack-check-to-kernel-build-options.patch
diff --git a/queue-4.4/x86-mm-64-fix-reboot-interaction-with-cr4.pcide.patch b/queue-4.4/x86-mm-64-fix-reboot-interaction-with-cr4.pcide.patch
new file mode 100644 (file)
index 0000000..bd33f29
--- /dev/null
@@ -0,0 +1,43 @@
+From 924c6b900cfdf376b07bccfd80e62b21914f8a5a Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Sun, 8 Oct 2017 21:53:05 -0700
+Subject: x86/mm/64: Fix reboot interaction with CR4.PCIDE
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit 924c6b900cfdf376b07bccfd80e62b21914f8a5a upstream.
+
+Trying to reboot via real mode fails with PCID on: long mode cannot
+be exited while CR4.PCIDE is set.  (No, I have no idea why, but the
+SDM and actual CPUs are in agreement here.)  The result is a GPF and
+a hang instead of a reboot.
+
+I didn't catch this in testing because neither my computer nor my VM
+reboots this way.  I can trigger it with reboot=bios, though.
+
+Fixes: 660da7c9228f ("x86/mm: Enable CR4.PCIDE on supported systems")
+Reported-and-tested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Andy Lutomirski <luto@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Borislav Petkov <bp@alien8.de>
+Link: https://lkml.kernel.org/r/f1e7d965998018450a7a70c2823873686a8b21c0.1507524746.git.luto@kernel.org
+Cc: Hugh Dickins <hughd@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/kernel/reboot.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -93,6 +93,10 @@ void __noreturn machine_real_restart(uns
+       load_cr3(initial_page_table);
+ #else
+       write_cr3(real_mode_header->trampoline_pgd);
++
++      /* Exiting long mode will fail if CR4.PCIDE is set. */
++      if (static_cpu_has(X86_FEATURE_PCID))
++              cr4_clear_bits(X86_CR4_PCIDE);
+ #endif
+       /* Jump to the identity-mapped low memory code */
diff --git a/queue-4.4/x86-mm-add-the-nopcid-boot-option-to-turn-off-pcid.patch b/queue-4.4/x86-mm-add-the-nopcid-boot-option-to-turn-off-pcid.patch
new file mode 100644 (file)
index 0000000..410d94e
--- /dev/null
@@ -0,0 +1,73 @@
+From 0790c9aad84901ca1bdc14746175549c8b5da215 Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Thu, 29 Jun 2017 08:53:20 -0700
+Subject: x86/mm: Add the 'nopcid' boot option to turn off PCID
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit 0790c9aad84901ca1bdc14746175549c8b5da215 upstream.
+
+The parameter is only present on x86_64 systems to save a few bytes,
+as PCID is always disabled on x86_32.
+
+Signed-off-by: Andy Lutomirski <luto@kernel.org>
+Reviewed-by: Nadav Amit <nadav.amit@gmail.com>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Arjan van de Ven <arjan@linux.intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Mel Gorman <mgorman@suse.de>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Rik van Riel <riel@redhat.com>
+Cc: linux-mm@kvack.org
+Link: http://lkml.kernel.org/r/8bbb2e65bcd249a5f18bfb8128b4689f08ac2b60.1498751203.git.luto@kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Cc: Hugh Dickins <hughd@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ Documentation/kernel-parameters.txt |    2 ++
+ arch/x86/kernel/cpu/common.c        |   18 ++++++++++++++++++
+ 2 files changed, 20 insertions(+)
+
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -2555,6 +2555,8 @@ bytes respectively. Such letter suffixes
+       nopat           [X86] Disable PAT (page attribute table extension of
+                       pagetables) support.
++      nopcid          [X86-64] Disable the PCID cpu feature.
++
+       norandmaps      Don't use address space randomization.  Equivalent to
+                       echo 0 > /proc/sys/kernel/randomize_va_space
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -162,6 +162,24 @@ static int __init x86_mpx_setup(char *s)
+ }
+ __setup("nompx", x86_mpx_setup);
++#ifdef CONFIG_X86_64
++static int __init x86_pcid_setup(char *s)
++{
++      /* require an exact match without trailing characters */
++      if (strlen(s))
++              return 0;
++
++      /* do not emit a message if the feature is not present */
++      if (!boot_cpu_has(X86_FEATURE_PCID))
++              return 1;
++
++      setup_clear_cpu_cap(X86_FEATURE_PCID);
++      pr_info("nopcid: PCID feature disabled\n");
++      return 1;
++}
++__setup("nopcid", x86_pcid_setup);
++#endif
++
+ static int __init x86_noinvpcid_setup(char *s)
+ {
+       /* noinvpcid doesn't accept parameters */
diff --git a/queue-4.4/x86-mm-enable-cr4.pcide-on-supported-systems.patch b/queue-4.4/x86-mm-enable-cr4.pcide-on-supported-systems.patch
new file mode 100644 (file)
index 0000000..6318533
--- /dev/null
@@ -0,0 +1,108 @@
+From 660da7c9228f685b2ebe664f9fd69aaddcc420b5 Mon Sep 17 00:00:00 2001
+From: Andy Lutomirski <luto@kernel.org>
+Date: Thu, 29 Jun 2017 08:53:21 -0700
+Subject: x86/mm: Enable CR4.PCIDE on supported systems
+
+From: Andy Lutomirski <luto@kernel.org>
+
+commit 660da7c9228f685b2ebe664f9fd69aaddcc420b5 upstream.
+
+We can use PCID if the CPU has PCID and PGE and we're not on Xen.
+
+By itself, this has no effect. A followup patch will start using PCID.
+
+Signed-off-by: Andy Lutomirski <luto@kernel.org>
+Reviewed-by: Nadav Amit <nadav.amit@gmail.com>
+Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Arjan van de Ven <arjan@linux.intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Juergen Gross <jgross@suse.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Mel Gorman <mgorman@suse.de>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Rik van Riel <riel@redhat.com>
+Cc: linux-mm@kvack.org
+Link: http://lkml.kernel.org/r/6327ecd907b32f79d5aa0d466f04503bbec5df88.1498751203.git.luto@kernel.org
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Cc: Hugh Dickins <hughd@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/tlbflush.h |    8 ++++++++
+ arch/x86/kernel/cpu/common.c    |   22 ++++++++++++++++++++++
+ arch/x86/xen/enlighten.c        |    6 ++++++
+ 3 files changed, 36 insertions(+)
+
+--- a/arch/x86/include/asm/tlbflush.h
++++ b/arch/x86/include/asm/tlbflush.h
+@@ -190,6 +190,14 @@ static inline void __flush_tlb_all(void)
+               __flush_tlb_global();
+       else
+               __flush_tlb();
++
++      /*
++       * Note: if we somehow had PCID but not PGE, then this wouldn't work --
++       * we'd end up flushing kernel translations for the current ASID but
++       * we might fail to flush kernel translations for other cached ASIDs.
++       *
++       * To avoid this issue, we force PCID off if PGE is off.
++       */
+ }
+ static inline void __flush_tlb_one(unsigned long addr)
+--- a/arch/x86/kernel/cpu/common.c
++++ b/arch/x86/kernel/cpu/common.c
+@@ -321,6 +321,25 @@ static __always_inline void setup_smap(s
+       }
+ }
++static void setup_pcid(struct cpuinfo_x86 *c)
++{
++      if (cpu_has(c, X86_FEATURE_PCID)) {
++              if (cpu_has(c, X86_FEATURE_PGE)) {
++                      cr4_set_bits(X86_CR4_PCIDE);
++              } else {
++                      /*
++                       * flush_tlb_all(), as currently implemented, won't
++                       * work if PCID is on but PGE is not.  Since that
++                       * combination doesn't exist on real hardware, there's
++                       * no reason to try to fully support it, but it's
++                       * polite to avoid corrupting data if we're on
++                       * an improperly configured VM.
++                       */
++                      clear_cpu_cap(c, X86_FEATURE_PCID);
++              }
++      }
++}
++
+ /*
+  * Some CPU features depend on higher CPUID levels, which may not always
+  * be available due to CPUID level capping or broken virtualization
+@@ -952,6 +971,9 @@ static void identify_cpu(struct cpuinfo_
+       setup_smep(c);
+       setup_smap(c);
++      /* Set up PCID */
++      setup_pcid(c);
++
+       /*
+        * The vendor-specific functions might have changed features.
+        * Now we do "generic changes."
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -433,6 +433,12 @@ static void __init xen_init_cpuid_mask(v
+               ~((1 << X86_FEATURE_MTRR) |  /* disable MTRR */
+                 (1 << X86_FEATURE_ACC));   /* thermal monitoring */
++      /*
++       * Xen PV would need some work to support PCID: CR3 handling as well
++       * as xen_flush_tlb_others() would need updating.
++       */
++      cpuid_leaf1_ecx_mask &= ~(1 << X86_FEATURE_PCID);  /* disable PCID */
++
+       if (!xen_initial_domain())
+               cpuid_leaf1_edx_mask &=
+                       ~((1 << X86_FEATURE_ACPI));  /* disable ACPI */