]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
powerpc/64s: Remove PROT_SAO support
authorNicholas Piggin <npiggin@gmail.com>
Fri, 3 Jul 2020 01:19:57 +0000 (11:19 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 21 Jul 2020 14:01:25 +0000 (00:01 +1000)
ISA v3.1 does not support the SAO storage control attribute required to
implement PROT_SAO. PROT_SAO was used by specialised system software
(Lx86) that has been discontinued for about 7 years, and is not thought
to be used elsewhere, so removal should not cause problems.

We rather remove it than keep support for older processors, because
live migrating guest partitions to newer processors may not be possible
if SAO is in use (or worse allowed with silent races).

- PROT_SAO stays in the uapi header so code using it would still build.
- arch_validate_prot() is removed, the generic version rejects PROT_SAO
  so applications would get a failure at mmap() time.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
[mpe: Drop KVM change for the time being]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200703011958.1166620-3-npiggin@gmail.com
13 files changed:
arch/powerpc/include/asm/book3s/64/pgtable.h
arch/powerpc/include/asm/cputable.h
arch/powerpc/include/asm/mman.h
arch/powerpc/include/asm/nohash/64/pgtable.h
arch/powerpc/include/uapi/asm/mman.h
arch/powerpc/kernel/dt_cpu_ftrs.c
arch/powerpc/mm/book3s64/hash_utils.c
include/linux/mm.h
include/trace/events/mmflags.h
mm/ksm.c
tools/testing/selftests/powerpc/mm/.gitignore
tools/testing/selftests/powerpc/mm/Makefile
tools/testing/selftests/powerpc/mm/prot_sao.c [deleted file]

index 495fc0ccb45318404567b474d44528824477ff33..6de56c3b33c4217c40805ac4e3c76f84fc0c0e47 100644 (file)
 #define _PAGE_RW               (_PAGE_READ | _PAGE_WRITE)
 #define _PAGE_RWX              (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC)
 #define _PAGE_PRIVILEGED       0x00008 /* kernel access only */
-#define _PAGE_SAO              0x00010 /* Strong access order */
+
+#define _PAGE_CACHE_CTL                0x00030 /* Bits for the folowing cache modes */
+                       /*      No bits set is normal cacheable memory */
+                       /*      0x00010 unused, is SAO bit on radix POWER9 */
 #define _PAGE_NON_IDEMPOTENT   0x00020 /* non idempotent memory */
 #define _PAGE_TOLERANT         0x00030 /* tolerant memory, cache inhibited */
+
 #define _PAGE_DIRTY            0x00080 /* C: page changed */
 #define _PAGE_ACCESSED         0x00100 /* R: page referenced */
 /*
@@ -824,8 +828,6 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
        return hash__set_pte_at(mm, addr, ptep, pte, percpu);
 }
 
-#define _PAGE_CACHE_CTL        (_PAGE_SAO | _PAGE_NON_IDEMPOTENT | _PAGE_TOLERANT)
-
 #define pgprot_noncached pgprot_noncached
 static inline pgprot_t pgprot_noncached(pgprot_t prot)
 {
index dd0a2e77a6953306d59568d88c22d58c6e11ed29..a461c330080474891d16123b580ccf416e4b954c 100644 (file)
@@ -191,7 +191,7 @@ static inline void cpu_feature_keys_init(void) { }
 #define CPU_FTR_SPURR                  LONG_ASM_CONST(0x0000000001000000)
 #define CPU_FTR_DSCR                   LONG_ASM_CONST(0x0000000002000000)
 #define CPU_FTR_VSX                    LONG_ASM_CONST(0x0000000004000000)
-#define CPU_FTR_SAO                    LONG_ASM_CONST(0x0000000008000000)
+// Free                                        LONG_ASM_CONST(0x0000000008000000)
 #define CPU_FTR_CP_USE_DCBTZ           LONG_ASM_CONST(0x0000000010000000)
 #define CPU_FTR_UNALIGNED_LD_STD       LONG_ASM_CONST(0x0000000020000000)
 #define CPU_FTR_ASYM_SMT               LONG_ASM_CONST(0x0000000040000000)
@@ -435,7 +435,7 @@ static inline void cpu_feature_keys_init(void) { }
            CPU_FTR_MMCRA | CPU_FTR_SMT | \
            CPU_FTR_COHERENT_ICACHE | \
            CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
-           CPU_FTR_DSCR | CPU_FTR_SAO  | CPU_FTR_ASYM_SMT | \
+           CPU_FTR_DSCR | CPU_FTR_ASYM_SMT | \
            CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
            CPU_FTR_CFAR | CPU_FTR_HVMODE | \
            CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX )
@@ -444,7 +444,7 @@ static inline void cpu_feature_keys_init(void) { }
            CPU_FTR_MMCRA | CPU_FTR_SMT | \
            CPU_FTR_COHERENT_ICACHE | \
            CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
-           CPU_FTR_DSCR | CPU_FTR_SAO  | \
+           CPU_FTR_DSCR | \
            CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
            CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
            CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \
@@ -455,7 +455,7 @@ static inline void cpu_feature_keys_init(void) { }
            CPU_FTR_MMCRA | CPU_FTR_SMT | \
            CPU_FTR_COHERENT_ICACHE | \
            CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
-           CPU_FTR_DSCR | CPU_FTR_SAO  | \
+           CPU_FTR_DSCR | \
            CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
            CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
            CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
@@ -473,7 +473,7 @@ static inline void cpu_feature_keys_init(void) { }
            CPU_FTR_MMCRA | CPU_FTR_SMT | \
            CPU_FTR_COHERENT_ICACHE | \
            CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
-           CPU_FTR_DSCR | CPU_FTR_SAO  | \
+           CPU_FTR_DSCR | \
            CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
            CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \
            CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_ARCH_207S | \
index 4ba303ea27f5913780f1d2b731b4d0bc08c0e02d..7c07728af300b8b7a53fe75ff153886e3ba99d65 100644 (file)
 #include <linux/pkeys.h>
 #include <asm/cpu_has_feature.h>
 
+#ifdef CONFIG_PPC_MEM_KEYS
 static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
                unsigned long pkey)
 {
-#ifdef CONFIG_PPC_MEM_KEYS
-       return (((prot & PROT_SAO) ? VM_SAO : 0) | pkey_to_vmflag_bits(pkey));
-#else
-       return ((prot & PROT_SAO) ? VM_SAO : 0);
-#endif
+       return pkey_to_vmflag_bits(pkey);
 }
 #define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey)
 
 static inline pgprot_t arch_vm_get_page_prot(unsigned long vm_flags)
 {
-#ifdef CONFIG_PPC_MEM_KEYS
-       return (vm_flags & VM_SAO) ?
-               __pgprot(_PAGE_SAO | vmflag_to_pte_pkey_bits(vm_flags)) :
-               __pgprot(0 | vmflag_to_pte_pkey_bits(vm_flags));
-#else
-       return (vm_flags & VM_SAO) ? __pgprot(_PAGE_SAO) : __pgprot(0);
-#endif
+       return __pgprot(vmflag_to_pte_pkey_bits(vm_flags));
 }
 #define arch_vm_get_page_prot(vm_flags) arch_vm_get_page_prot(vm_flags)
-
-static inline bool arch_validate_prot(unsigned long prot, unsigned long addr)
-{
-       if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_SAO))
-               return false;
-       if ((prot & PROT_SAO) && !cpu_has_feature(CPU_FTR_SAO))
-               return false;
-       return true;
-}
-#define arch_validate_prot arch_validate_prot
+#endif
 
 #endif /* CONFIG_PPC64 */
 #endif /* _ASM_POWERPC_MMAN_H */
index 6cb8aa35719176a297218f94e6ef089351e5bd77..59ee9fa4ae09d2b498b6c2d16d45f708a4283ebe 100644 (file)
@@ -82,8 +82,6 @@
  */
 #include <asm/nohash/pte-book3e.h>
 
-#define _PAGE_SAO      0
-
 #define PTE_RPN_MASK   (~((1UL << PTE_RPN_SHIFT) - 1))
 
 /*
index c0c737215b00bdc70def55a5b35aa8216e456db0..3a700351fecafbf7f1b26d574cd65852dd6156f3 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm-generic/mman-common.h>
 
 
-#define PROT_SAO       0x10            /* Strong Access Ordering */
+#define PROT_SAO       0x10            /* Unsupported since v5.9 */
 
 #define MAP_RENAME      MAP_ANONYMOUS   /* In SunOS terminology */
 #define MAP_NORESERVE   0x40            /* don't reserve swap pages */
index 554bec785f6a2f869b55ce90a7467cd6d48fc1b6..9aa8537f7da2d3e7dc3886f47824d6f347939556 100644 (file)
@@ -622,7 +622,7 @@ static struct dt_cpu_feature_match __initdata
        {"processor-control-facility-v3", feat_enable_dbell, CPU_FTR_DBELL},
        {"processor-utilization-of-resources-register", feat_enable_purr, 0},
        {"no-execute", feat_enable, 0},
-       {"strong-access-ordering", feat_enable, CPU_FTR_SAO},
+       /* strong-access-ordering is unused */
        {"cache-inhibited-large-page", feat_enable_large_ci, 0},
        {"coprocessor-icswx", feat_enable, 0},
        {"hypervisor-virtualization-interrupt", feat_enable_hvi, 0},
index 9dfb0ceed5e32381eeed096f3c8c5c8d096dcac0..6f9f346a5f65ac717f39cc9066c41cf33e4e0eee 100644 (file)
@@ -232,8 +232,6 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
                rflags |= HPTE_R_I;
        else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_NON_IDEMPOTENT)
                rflags |= (HPTE_R_I | HPTE_R_G);
-       else if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_SAO)
-               rflags |= (HPTE_R_W | HPTE_R_I | HPTE_R_M);
        else
                /*
                 * Add memory coherence if cache inhibited is not set
index dc7b87310c1035c3e1cc02305e09d31fae7e2fb0..6c8333d6c991a982a0a7a5177f8238fa173ac1ec 100644 (file)
@@ -317,8 +317,6 @@ extern unsigned int kobjsize(const void *objp);
 
 #if defined(CONFIG_X86)
 # define VM_PAT                VM_ARCH_1       /* PAT reserves whole VMA at once (x86) */
-#elif defined(CONFIG_PPC)
-# define VM_SAO                VM_ARCH_1       /* Strong Access Ordering (powerpc) */
 #elif defined(CONFIG_PARISC)
 # define VM_GROWSUP    VM_ARCH_1
 #elif defined(CONFIG_IA64)
index 5fb7520343863648160da1564621e83422985d97..939092dbcb8bf37d9e17529a5081c0692f0f4672 100644 (file)
@@ -114,8 +114,6 @@ IF_HAVE_PG_IDLE(PG_idle,            "idle"          )
 
 #if defined(CONFIG_X86)
 #define __VM_ARCH_SPECIFIC_1 {VM_PAT,     "pat"           }
-#elif defined(CONFIG_PPC)
-#define __VM_ARCH_SPECIFIC_1 {VM_SAO,     "sao"           }
 #elif defined(CONFIG_PARISC) || defined(CONFIG_IA64)
 #define __VM_ARCH_SPECIFIC_1 {VM_GROWSUP,      "growsup"       }
 #elif !defined(CONFIG_MMU)
index 4102034cd55a1e1a0f65000340cd6b3637aefcef..d1cfa18689b57891e48e9720c546b5687f7a790c 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -2452,10 +2452,6 @@ int ksm_madvise(struct vm_area_struct *vma, unsigned long start,
                if (vma_is_dax(vma))
                        return 0;
 
-#ifdef VM_SAO
-               if (*vm_flags & VM_SAO)
-                       return 0;
-#endif
 #ifdef VM_SPARC_ADI
                if (*vm_flags & VM_SPARC_ADI)
                        return 0;
index 8f841f925baa558eeb4e669c4b86c221dd768fbf..8d041f508a5177cbd5ff8de0beced9fd11e04314 100644 (file)
@@ -2,7 +2,6 @@
 hugetlb_vs_thp_test
 subpage_prot
 tempfile
-prot_sao
 segv_errors
 wild_bctr
 large_vm_fork_separation
index f9fa0ba7435c4399bbce3dbacb6419b2a8227c21..5a86d59441dcbfd830b5339db4628f52a098bcae 100644 (file)
@@ -2,7 +2,7 @@
 noarg:
        $(MAKE) -C ../
 
-TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr \
+TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot segv_errors wild_bctr \
                  large_vm_fork_separation bad_accesses pkey_exec_prot
 TEST_GEN_PROGS_EXTENDED := tlbie_test
 TEST_GEN_FILES := tempfile
@@ -12,8 +12,6 @@ include ../../lib.mk
 
 $(TEST_GEN_PROGS): ../harness.c ../utils.c
 
-$(OUTPUT)/prot_sao: ../utils.c
-
 $(OUTPUT)/wild_bctr: CFLAGS += -m64
 $(OUTPUT)/large_vm_fork_separation: CFLAGS += -m64
 $(OUTPUT)/bad_accesses: CFLAGS += -m64
diff --git a/tools/testing/selftests/powerpc/mm/prot_sao.c b/tools/testing/selftests/powerpc/mm/prot_sao.c
deleted file mode 100644 (file)
index e2eed65..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright 2016, Michael Ellerman, IBM Corp.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/mman.h>
-
-#include <asm/cputable.h>
-
-#include "utils.h"
-
-#define SIZE (64 * 1024)
-
-int test_prot_sao(void)
-{
-       char *p;
-
-       /* 2.06 or later should support SAO */
-       SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
-
-       /*
-        * Ensure we can ask for PROT_SAO.
-        * We can't really verify that it does the right thing, but at least we
-        * confirm the kernel will accept it.
-        */
-       p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE | PROT_SAO,
-                MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-       FAIL_IF(p == MAP_FAILED);
-
-       /* Write to the mapping, to at least cause a fault */
-       memset(p, 0xaa, SIZE);
-
-       return 0;
-}
-
-int main(void)
-{
-       return test_harness(test_prot_sao, "prot-sao");
-}