Commit-ID:  9dac6290945142e6b87d9f027edfee676dcfbfda
Gitweb:     http://git.kernel.org/tip/9dac6290945142e6b87d9f027edfee676dcfbfda
Author:     Borislav Petkov <b...@suse.de>
AuthorDate: Thu, 4 Jun 2015 18:55:09 +0200
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Sun, 7 Jun 2015 15:28:52 +0200

x86/mm/pat: Untangle pat_init()

Split it into a BSP and AP version which makes the PAT
initialization path actually readable again.

Signed-off-by: Borislav Petkov <b...@suse.de>
Reviewed-by: Toshi Kani <toshi.k...@hp.com>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Andy Lutomirski <l...@amacapital.net>
Cc: elli...@hp.com
Cc: H. Peter Anvin <h...@zytor.com>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Luis R. Rodriguez <mcg...@suse.com>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: a...@arndb.de
Cc: h...@lst.de
Cc: h...@hmh.eng.br
Cc: jgr...@suse.com
Cc: konrad.w...@oracle.com
Cc: linux-mm <linux...@kvack.org>
Cc: linux-nvd...@lists.01.org
Cc: stefan.ba...@canonical.com
Cc: yi...@plexistor.com
Link: http://lkml.kernel.org/r/1433436928-31903-2-git-send-email...@alien8.de
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 arch/x86/mm/pat.c | 69 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 40 insertions(+), 29 deletions(-)

diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
index a1c9654..476d078 100644
--- a/arch/x86/mm/pat.c
+++ b/arch/x86/mm/pat.c
@@ -36,6 +36,8 @@
 #undef pr_fmt
 #define pr_fmt(fmt) "" fmt
 
+static bool boot_cpu_done;
+
 static int __read_mostly __pat_enabled = IS_ENABLED(CONFIG_X86_PAT);
 
 static inline void pat_disable(const char *reason)
@@ -194,31 +196,47 @@ void pat_init_cache_modes(void)
 
 #define PAT(x, y)      ((u64)PAT_ ## y << ((x)*8))
 
-void pat_init(void)
+static void pat_bsp_init(u64 pat)
 {
-       u64 pat;
-       bool boot_cpu = !boot_pat_state;
+       if (!cpu_has_pat) {
+               pat_disable("PAT not supported by CPU.");
+               return;
+       }
 
-       if (!pat_enabled())
+       rdmsrl(MSR_IA32_CR_PAT, boot_pat_state);
+       if (!boot_pat_state) {
+               pat_disable("PAT MSR is 0, disabled.");
                return;
+       }
 
+       wrmsrl(MSR_IA32_CR_PAT, pat);
+
+       pat_init_cache_modes();
+}
+
+static void pat_ap_init(u64 pat)
+{
        if (!cpu_has_pat) {
-               if (!boot_pat_state) {
-                       pat_disable("PAT not supported by CPU.");
-                       return;
-               } else {
-                       /*
-                        * If this happens we are on a secondary CPU, but
-                        * switched to PAT on the boot CPU. We have no way to
-                        * undo PAT.
-                        */
-                       pr_err("x86/PAT: PAT enabled, but not supported by 
secondary CPU\n");
-                       BUG();
-               }
+               /*
+                * If this happens we are on a secondary CPU, but switched to
+                * PAT on the boot CPU. We have no way to undo PAT.
+                */
+               panic("x86/PAT: PAT enabled, but not supported by secondary 
CPU\n");
        }
 
-       /* Set PWT to Write-Combining. All other bits stay the same */
+       wrmsrl(MSR_IA32_CR_PAT, pat);
+}
+
+void pat_init(void)
+{
+       u64 pat;
+
+       if (!pat_enabled())
+               return;
+
        /*
+        * Set PWT to Write-Combining. All other bits stay the same:
+        *
         * PTE encoding used in Linux:
         *      PAT
         *      |PCD
@@ -233,19 +251,12 @@ void pat_init(void)
        pat = PAT(0, WB) | PAT(1, WC) | PAT(2, UC_MINUS) | PAT(3, UC) |
              PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC);
 
-       /* Boot CPU check */
-       if (!boot_pat_state) {
-               rdmsrl(MSR_IA32_CR_PAT, boot_pat_state);
-               if (!boot_pat_state) {
-                       pat_disable("PAT read returns always zero, disabled.");
-                       return;
-               }
+       if (!boot_cpu_done) {
+               pat_bsp_init(pat);
+               boot_cpu_done = true;
+       } else {
+               pat_ap_init(pat);
        }
-
-       wrmsrl(MSR_IA32_CR_PAT, pat);
-
-       if (boot_cpu)
-               pat_init_cache_modes();
 }
 
 #undef PAT
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to