The current way of disabling global pages at compile time prevents boot
time disabling of kaiser and creates unnecessary indirections.

Global pages can be supressed by __supported_pte_mask as well. The shadow
mappings set PAGE_GLOBAL for the minimal kernel mappings which are required
for entry/exit. These mappings are setup manually so the filtering does not
take place.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
---
 arch/x86/include/asm/pgtable_types.h |   16 +---------------
 arch/x86/mm/init.c                   |   13 ++++++++++---
 arch/x86/mm/pageattr.c               |   16 ++++++++--------
 3 files changed, 19 insertions(+), 26 deletions(-)

--- a/arch/x86/include/asm/pgtable_types.h
+++ b/arch/x86/include/asm/pgtable_types.h
@@ -191,23 +191,9 @@ enum page_cache_mode {
 #define PAGE_READONLY_EXEC     __pgprot(_PAGE_PRESENT | _PAGE_USER |   \
                                         _PAGE_ACCESSED)
 
-/*
- * Disable global pages for anything using the default
- * __PAGE_KERNEL* macros.
- *
- * PGE will still be enabled and _PAGE_GLOBAL may still be used carefully
- * for a few selected kernel mappings which must be visible to userspace,
- * when KAISER is enabled, like the entry/exit code and data.
- */
-#ifdef CONFIG_KAISER
-#define __PAGE_KERNEL_GLOBAL   0
-#else
-#define __PAGE_KERNEL_GLOBAL   _PAGE_GLOBAL
-#endif
-
 #define __PAGE_KERNEL_EXEC                                             \
        (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED |      \
-        __PAGE_KERNEL_GLOBAL)
+        _PAGE_GLOBAL)
 #define __PAGE_KERNEL          (__PAGE_KERNEL_EXEC | _PAGE_NX)
 
 #define __PAGE_KERNEL_RO               (__PAGE_KERNEL & ~_PAGE_RW)
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -161,6 +161,13 @@ struct map_range {
 
 static int page_size_mask;
 
+static void enable_global_pages(void)
+{
+#ifndef CONFIG_KAISER
+       __supported_pte_mask |= _PAGE_GLOBAL;
+#endif
+}
+
 static void __init probe_page_size_mask(void)
 {
        /*
@@ -179,11 +186,11 @@ static void __init probe_page_size_mask(
                cr4_set_bits_and_update_boot(X86_CR4_PSE);
 
        /* Enable PGE if available */
+       __supported_pte_mask |= _PAGE_GLOBAL;
        if (boot_cpu_has(X86_FEATURE_PGE)) {
                cr4_set_bits_and_update_boot(X86_CR4_PGE);
-               __supported_pte_mask |= _PAGE_GLOBAL;
-       } else
-               __supported_pte_mask &= ~_PAGE_GLOBAL;
+               enable_global_pages();
+       }
 
        /* Enable 1 GB linear kernel mappings if available: */
        if (direct_gbpages && boot_cpu_has(X86_FEATURE_GBPAGES)) {
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -585,9 +585,9 @@ try_preserve_large_page(pte_t *kpte, uns
         * for the ancient hardware that doesn't support it.
         */
        if (pgprot_val(req_prot) & _PAGE_PRESENT)
-               pgprot_val(req_prot) |= _PAGE_PSE | __PAGE_KERNEL_GLOBAL;
+               pgprot_val(req_prot) |= _PAGE_PSE | _PAGE_GLOBAL;
        else
-               pgprot_val(req_prot) &= ~(_PAGE_PSE | __PAGE_KERNEL_GLOBAL);
+               pgprot_val(req_prot) &= ~(_PAGE_PSE | _PAGE_GLOBAL);
 
        req_prot = canon_pgprot(req_prot);
 
@@ -705,9 +705,9 @@ static int
         * for the ancient hardware that doesn't support it.
         */
        if (pgprot_val(ref_prot) & _PAGE_PRESENT)
-               pgprot_val(ref_prot) |= __PAGE_KERNEL_GLOBAL;
+               pgprot_val(ref_prot) |= _PAGE_GLOBAL;
        else
-               pgprot_val(ref_prot) &= ~__PAGE_KERNEL_GLOBAL;
+               pgprot_val(ref_prot) &= ~_PAGE_GLOBAL;
 
        /*
         * Get the target pfn from the original entry:
@@ -938,9 +938,9 @@ static void populate_pte(struct cpa_data
         * support it.
         */
        if (pgprot_val(pgprot) & _PAGE_PRESENT)
-               pgprot_val(pgprot) |= __PAGE_KERNEL_GLOBAL;
+               pgprot_val(pgprot) |= _PAGE_GLOBAL;
        else
-               pgprot_val(pgprot) &= ~__PAGE_KERNEL_GLOBAL;
+               pgprot_val(pgprot) &= ~_PAGE_GLOBAL;
 
        pgprot = canon_pgprot(pgprot);
 
@@ -1242,9 +1242,9 @@ static int __change_page_attr(struct cpa
                 * support it.
                 */
                if (pgprot_val(new_prot) & _PAGE_PRESENT)
-                       pgprot_val(new_prot) |= __PAGE_KERNEL_GLOBAL;
+                       pgprot_val(new_prot) |= _PAGE_GLOBAL;
                else
-                       pgprot_val(new_prot) &= ~__PAGE_KERNEL_GLOBAL;
+                       pgprot_val(new_prot) &= ~_PAGE_GLOBAL;
 
                /*
                 * We need to keep the pfn from the existing PTE,


Reply via email to