| From 224bb1e5d67ba0f2872c98002d6a6f991ac6fd4a Mon Sep 17 00:00:00 2001 |
| From: Toshi Kani <toshi.kani@hpe.com> |
| Date: Wed, 23 Mar 2016 15:41:58 -0600 |
| Subject: x86/mm/pat: Add pat_disable() interface |
| |
| From: Toshi Kani <toshi.kani@hpe.com> |
| |
| commit 224bb1e5d67ba0f2872c98002d6a6f991ac6fd4a upstream. |
| |
| In preparation for fixing a regression caused by: |
| |
| 9cd25aac1f44 ("x86/mm/pat: Emulate PAT when it is disabled") |
| |
| ... PAT needs to provide an interface that prevents the OS from |
| initializing the PAT MSR. |
| |
| PAT MSR initialization must be done on all CPUs using the specific |
| sequence of operations defined in the Intel SDM. This requires MTRRs |
| to be enabled since pat_init() is called as part of MTRR init |
| from mtrr_rendezvous_handler(). |
| |
| Make pat_disable() as the interface that prevents the OS from |
| initializing the PAT MSR. MTRR will call this interface when it |
| cannot provide the SDM-defined sequence to initialize PAT. |
| |
| This also assures that pat_disable() called from pat_bsp_init() |
| will set the PAT table properly when CPU does not support PAT. |
| |
| Signed-off-by: Toshi Kani <toshi.kani@hpe.com> |
| Reviewed-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Andrew Morton <akpm@linux-foundation.org> |
| Cc: Andy Lutomirski <luto@amacapital.net> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Borislav Petkov <bp@suse.de> |
| Cc: Brian Gerst <brgerst@gmail.com> |
| Cc: Denys Vlasenko <dvlasenk@redhat.com> |
| Cc: H. Peter Anvin <hpa@zytor.com> |
| Cc: Juergen Gross <jgross@suse.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Luis R. Rodriguez <mcgrof@suse.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Robert Elliott <elliott@hpe.com> |
| Cc: Toshi Kani <toshi.kani@hp.com> |
| Cc: konrad.wilk@oracle.com |
| Cc: paul.gortmaker@windriver.com |
| Cc: xen-devel@lists.xenproject.org |
| Link: http://lkml.kernel.org/r/1458769323-24491-3-git-send-email-toshi.kani@hpe.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/pat.h | 1 + |
| arch/x86/mm/pat.c | 13 ++++++++++++- |
| 2 files changed, 13 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/include/asm/pat.h |
| +++ b/arch/x86/include/asm/pat.h |
| @@ -5,6 +5,7 @@ |
| #include <asm/pgtable_types.h> |
| |
| bool pat_enabled(void); |
| +void pat_disable(const char *reason); |
| extern void pat_init(void); |
| void __init_cache_modes(u64); |
| |
| --- a/arch/x86/mm/pat.c |
| +++ b/arch/x86/mm/pat.c |
| @@ -39,11 +39,22 @@ |
| static bool boot_cpu_done; |
| |
| static int __read_mostly __pat_enabled = IS_ENABLED(CONFIG_X86_PAT); |
| +static void init_cache_modes(void); |
| |
| -static inline void pat_disable(const char *reason) |
| +void pat_disable(const char *reason) |
| { |
| + if (!__pat_enabled) |
| + return; |
| + |
| + if (boot_cpu_done) { |
| + WARN_ONCE(1, "x86/PAT: PAT cannot be disabled after initialization\n"); |
| + return; |
| + } |
| + |
| __pat_enabled = 0; |
| pr_info("x86/PAT: %s\n", reason); |
| + |
| + init_cache_modes(); |
| } |
| |
| static int __init nopat(char *str) |