x86/cpu: Drop wp_works_ok member of struct cpuinfo_x86
authorMathias Krause <minipli@googlemail.com>
Sun, 12 Feb 2017 21:12:08 +0000 (22:12 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 11 Mar 2017 13:30:24 +0000 (14:30 +0100)
Remove the wp_works_ok member of struct cpuinfo_x86. It's an
optimization back from Linux v0.99 times where we had no fixup support
yet and did the CR0.WP test via special code in the page fault handler.
The < 0 test was an optimization to not do the special casing for each
NULL ptr access violation but just for the first one doing the WP test.
Today it serves no real purpose as the test no longer needs special code
in the page fault handler and the only call side -- mem_init() -- calls
it just once, anyway. However, Xen pre-initializes it to 1, to skip the
test.

Doing the test again for Xen should be no issue at all, as even the
commit introducing skipping the test (commit d560bc61575e ("x86, xen:
Suppress WP test on Xen")) mentioned it being ban aid only. And, in
fact, testing the patch on Xen showed nothing breaks.

The pre-fixup times are long gone and with the removal of the fallback
handling code in commit a5c2a893dbd4 ("x86, 386 removal: Remove
CONFIG_X86_WP_WORKS_OK") the kernel requires a working CR0.WP anyway.
So just get rid of the "optimization" and do the test unconditionally.

Signed-off-by: Mathias Krause <minipli@googlemail.com>
Acked-by: Borislav Petkov <bp@alien8.de>
Cc: Jesper Nilsson <jesper.nilsson@axis.com>
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Arnd Hannemann <hannemann@nets.rwth-aachen.de>
Cc: Mikael Starvik <starvik@axis.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: "David S. Miller" <davem@davemloft.net>
Link: http://lkml.kernel.org/r/1486933932-585-3-git-send-email-minipli@googlemail.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/proc.c
arch/x86/kernel/setup.c
arch/x86/mm/init_32.c
arch/x86/xen/enlighten.c

index 893f80e30bfb7bb90040c444a49c862af8c7348c..4aa93b560a2b2075c94f338438469dc773f92330 100644 (file)
@@ -89,9 +89,7 @@ struct cpuinfo_x86 {
        __u8                    x86_vendor;     /* CPU vendor */
        __u8                    x86_model;
        __u8                    x86_mask;
-#ifdef CONFIG_X86_32
-       char                    wp_works_ok;    /* It doesn't on 386's */
-#else
+#ifdef CONFIG_X86_64
        /* Number of 4K pages in DTLB/ITLB combined(in pages): */
        int                     x86_tlbsize;
 #endif
index 18ca99f2798b16443291827269389bf0ad52bf94..6df621ae62a7c00cb4f95dbf5c41ec83e5397f71 100644 (file)
@@ -31,14 +31,13 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)
                   "fpu\t\t: %s\n"
                   "fpu_exception\t: %s\n"
                   "cpuid level\t: %d\n"
-                  "wp\t\t: %s\n",
+                  "wp\t\t: yes\n",
                   static_cpu_has_bug(X86_BUG_FDIV) ? "yes" : "no",
                   static_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no",
                   static_cpu_has_bug(X86_BUG_COMA) ? "yes" : "no",
                   static_cpu_has(X86_FEATURE_FPU) ? "yes" : "no",
                   static_cpu_has(X86_FEATURE_FPU) ? "yes" : "no",
-                  c->cpuid_level,
-                  c->wp_works_ok ? "yes" : "no");
+                  c->cpuid_level);
 }
 #else
 static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)
index 4bf0c8926a1c061bb22c1973962a0d668bfa3d98..7cd7bbefd418da5ffa7534a6697f70e08abfcc29 100644 (file)
@@ -173,14 +173,11 @@ static struct resource bss_resource = {
 
 
 #ifdef CONFIG_X86_32
-/* cpu data as detected by the assembly code in head.S */
-struct cpuinfo_x86 new_cpu_data = {
-       .wp_works_ok = -1,
-};
+/* cpu data as detected by the assembly code in head_32.S */
+struct cpuinfo_x86 new_cpu_data;
+
 /* common cpu data for all cpus */
-struct cpuinfo_x86 boot_cpu_data __read_mostly = {
-       .wp_works_ok = -1,
-};
+struct cpuinfo_x86 boot_cpu_data __read_mostly;
 EXPORT_SYMBOL(boot_cpu_data);
 
 unsigned int def_to_bigsmp;
index 2b4b53e6793f16b24d2e96199166c724d068f339..4dddfaf6569a87a67680c0da377d07be0735f5a7 100644 (file)
@@ -716,15 +716,17 @@ void __init paging_init(void)
  */
 static void __init test_wp_bit(void)
 {
+       int wp_works_ok;
+
        printk(KERN_INFO
   "Checking if this processor honours the WP bit even in supervisor mode...");
 
        /* Any page-aligned address will do, the test is non-destructive */
        __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_KERNEL_RO);
-       boot_cpu_data.wp_works_ok = do_test_wp_bit();
+       wp_works_ok = do_test_wp_bit();
        clear_fixmap(FIX_WP_TEST);
 
-       if (!boot_cpu_data.wp_works_ok) {
+       if (!wp_works_ok) {
                printk(KERN_CONT "No.\n");
                panic("Linux doesn't support CPUs with broken WP.");
        } else {
@@ -811,8 +813,7 @@ void __init mem_init(void)
        BUG_ON(VMALLOC_START                            >= VMALLOC_END);
        BUG_ON((unsigned long)high_memory               > VMALLOC_START);
 
-       if (boot_cpu_data.wp_works_ok < 0)
-               test_wp_bit();
+       test_wp_bit();
 }
 
 #ifdef CONFIG_MEMORY_HOTPLUG
index ec1d5c46e58f7cd0719c84686b627e10b7b18dcd..bc3dab5d47ca408721094b570a52570cfa3dba0d 100644 (file)
@@ -1595,7 +1595,6 @@ asmlinkage __visible void __init xen_start_kernel(void)
        /* set up basic CPUID stuff */
        cpu_detect(&new_cpu_data);
        set_cpu_cap(&new_cpu_data, X86_FEATURE_FPU);
-       new_cpu_data.wp_works_ok = 1;
        new_cpu_data.x86_capability[CPUID_1_EDX] = cpuid_edx(1);
 #endif