mm: introduce ARCH_HAS_PTE_SPECIAL
authorLaurent Dufour <ldufour@linux.vnet.ibm.com>
Fri, 8 Jun 2018 00:06:08 +0000 (17:06 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Jun 2018 00:34:35 +0000 (17:34 -0700)
Currently the PTE special supports is turned on in per architecture
header files.  Most of the time, it is defined in
arch/*/include/asm/pgtable.h depending or not on some other per
architecture static definition.

This patch introduce a new configuration variable to manage this
directly in the Kconfig files.  It would later replace
__HAVE_ARCH_PTE_SPECIAL.

Here notes for some architecture where the definition of
__HAVE_ARCH_PTE_SPECIAL is not obvious:

arm
 __HAVE_ARCH_PTE_SPECIAL which is currently defined in
arch/arm/include/asm/pgtable-3level.h which is included by
arch/arm/include/asm/pgtable.h when CONFIG_ARM_LPAE is set.
So select ARCH_HAS_PTE_SPECIAL if ARM_LPAE.

powerpc
__HAVE_ARCH_PTE_SPECIAL is defined in 2 files:
 - arch/powerpc/include/asm/book3s/64/pgtable.h
 - arch/powerpc/include/asm/pte-common.h
The first one is included if (PPC_BOOK3S & PPC64) while the second is
included in all the other cases.
So select ARCH_HAS_PTE_SPECIAL all the time.

sparc:
__HAVE_ARCH_PTE_SPECIAL is defined if defined(__sparc__) &&
defined(__arch64__) which are defined through the compiler in
sparc/Makefile if !SPARC32 which I assume to be if SPARC64.
So select ARCH_HAS_PTE_SPECIAL if SPARC64

There is no functional change introduced by this patch.

Link: http://lkml.kernel.org/r/1523433816-14460-2-git-send-email-ldufour@linux.vnet.ibm.com
Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
Suggested-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Rich Felker <dalias@libc.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Palmer Dabbelt <palmer@sifive.com>
Cc: Albert Ou <albert@sifive.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Christophe LEROY <christophe.leroy@c-s.fr>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
24 files changed:
Documentation/features/vm/pte_special/arch-support.txt
arch/arc/Kconfig
arch/arc/include/asm/pgtable.h
arch/arm/Kconfig
arch/arm/include/asm/pgtable-3level.h
arch/arm64/Kconfig
arch/arm64/include/asm/pgtable.h
arch/powerpc/Kconfig
arch/powerpc/include/asm/book3s/64/pgtable.h
arch/powerpc/include/asm/pte-common.h
arch/riscv/Kconfig
arch/riscv/include/asm/pgtable-bits.h
arch/s390/Kconfig
arch/s390/include/asm/pgtable.h
arch/sh/Kconfig
arch/sh/include/asm/pgtable.h
arch/sparc/Kconfig
arch/sparc/include/asm/pgtable_64.h
arch/x86/Kconfig
arch/x86/include/asm/pgtable_types.h
include/linux/pfn_t.h
mm/Kconfig
mm/gup.c
mm/memory.c

index 6a608a6dcf71ded9919fbf7c4e621e592e9a9ab5..a8378424bc98450563e14cce59da34008001ca5d 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Feature name:          pte_special
-#         Kconfig:       __HAVE_ARCH_PTE_SPECIAL
+#         Kconfig:       ARCH_HAS_PTE_SPECIAL
 #         description:   arch supports the pte_special()/pte_mkspecial() VM APIs
 #
     -----------------------
index 89d47eac18b28fd663ffeee6ce18fc9c165a22c9..e81bcd271be72e7b1e2bbece5b2b7442ebd7b462 100644 (file)
@@ -48,6 +48,7 @@ config ARC
        select HAVE_GENERIC_DMA_COHERENT
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_LZMA
+       select ARCH_HAS_PTE_SPECIAL
 
 config MIGHT_HAVE_PCI
        bool
index 08fe33830d4b17337757d548399c897aa240de36..8ec5599a0957e3f2314a63450f46588125d94a82 100644 (file)
@@ -320,8 +320,6 @@ PTE_BIT_FUNC(mkexec,        |= (_PAGE_EXECUTE));
 PTE_BIT_FUNC(mkspecial,        |= (_PAGE_SPECIAL));
 PTE_BIT_FUNC(mkhuge,   |= (_PAGE_HW_SZ));
 
-#define __HAVE_ARCH_PTE_SPECIAL
-
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 {
        return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot));
index 8f460bdd4be1c6014bea8b3f69c0406c2e18a976..534563ac7f5f2115abff0e76703ae4f8baeeb57a 100644 (file)
@@ -8,6 +8,7 @@ config ARM
        select ARCH_HAS_DEVMEM_IS_ALLOWED
        select ARCH_HAS_ELF_RANDOMIZE
        select ARCH_HAS_FORTIFY_SOURCE
+       select ARCH_HAS_PTE_SPECIAL if ARM_LPAE
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_PHYS_TO_DMA
        select ARCH_HAS_STRICT_KERNEL_RWX if MMU && !XIP_KERNEL
index 2a4836087358bcb51bc844b1eabe5dbf58c2dc37..6d50a11d779345349cd2155fa433e3b9d6a75d08 100644 (file)
@@ -219,7 +219,6 @@ static inline pte_t pte_mkspecial(pte_t pte)
        pte_val(pte) |= L_PTE_SPECIAL;
        return pte;
 }
-#define        __HAVE_ARCH_PTE_SPECIAL
 
 #define pmd_write(pmd)         (pmd_isclear((pmd), L_PMD_SECT_RDONLY))
 #define pmd_dirty(pmd)         (pmd_isset((pmd), L_PMD_SECT_DIRTY))
index b25ed7834f6c354a5363e5b80e7da05d705d2861..4759566a78cbe303a5397c4a2ead8f1467585a41 100644 (file)
@@ -17,6 +17,7 @@ config ARM64
        select ARCH_HAS_GIGANTIC_PAGE if (MEMORY_ISOLATION && COMPACTION) || CMA
        select ARCH_HAS_KCOV
        select ARCH_HAS_MEMBARRIER_SYNC_CORE
+       select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_SG_CHAIN
        select ARCH_HAS_STRICT_KERNEL_RWX
index 7c4c8f318ba999afdac0b41300c9613fe161e91d..9f82d6b53851e4b6bedbb28f6d0e7480acd622a6 100644 (file)
@@ -306,8 +306,6 @@ static inline int pte_same(pte_t pte_a, pte_t pte_b)
 #define HPAGE_MASK             (~(HPAGE_SIZE - 1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
 
-#define __HAVE_ARCH_PTE_SPECIAL
-
 static inline pte_t pgd_pte(pgd_t pgd)
 {
        return __pte(pgd_val(pgd));
index 076fe309485631cc040245d06e00dfd7978cbdbe..8f959df2de7ac4b625c6e28227821ce7952bfb52 100644 (file)
@@ -135,6 +135,7 @@ config PPC
        select ARCH_HAS_GCOV_PROFILE_ALL
        select ARCH_HAS_PHYS_TO_DMA
        select ARCH_HAS_PMEM_API                if PPC64
+       select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_MEMBARRIER_CALLBACKS
        select ARCH_HAS_SCALED_CPUTIME          if VIRT_CPU_ACCOUNTING_NATIVE
        select ARCH_HAS_SG_CHAIN
index 42fe7c2ff2df9f8a86142b3b614f07113842becb..63cee159022b51400fbc52dd21ebd31f55f3db67 100644 (file)
@@ -335,9 +335,6 @@ extern unsigned long pci_io_base;
 /* Advertise special mapping type for AGP */
 #define HAVE_PAGE_AGP
 
-/* Advertise support for _PAGE_SPECIAL */
-#define __HAVE_ARCH_PTE_SPECIAL
-
 #ifndef __ASSEMBLY__
 
 /*
index 050b0d77532457c914af540f55255b5afe81471d..bef56141a549edac30af3ea20f7d1e6f759ba1fb 100644 (file)
@@ -208,9 +208,6 @@ static inline bool pte_user(pte_t pte)
 #define PAGE_AGP               (PAGE_KERNEL_NC)
 #define HAVE_PAGE_AGP
 
-/* Advertise support for _PAGE_SPECIAL */
-#define __HAVE_ARCH_PTE_SPECIAL
-
 #ifndef _PAGE_READ
 /* if not defined, we should not find _PAGE_WRITE too */
 #define _PAGE_READ 0
index 274bc064c41f84698b7023d616a243eebc57adcc..17f19e67993b10e462abb9ad8b3e88b8da6ee5df 100644 (file)
@@ -42,6 +42,7 @@ config RISCV
        select THREAD_INFO_IN_TASK
        select RISCV_TIMER
        select GENERIC_IRQ_MULTI_HANDLER
+       select ARCH_HAS_PTE_SPECIAL
 
 config MMU
        def_bool y
index 997ddbb1d37092abf4b54636fea035b5c678a207..2fa2942be221e480088ab1a5681c9240ef3a1e23 100644 (file)
@@ -42,7 +42,4 @@
                                          _PAGE_WRITE | _PAGE_EXEC |    \
                                          _PAGE_USER | _PAGE_GLOBAL))
 
-/* Advertise support for _PAGE_SPECIAL */
-#define __HAVE_ARCH_PTE_SPECIAL
-
 #endif /* _ASM_RISCV_PGTABLE_BITS_H */
index b7deee7e738f59ac52a84d236b0ff4657783d3c8..baed39772c845d74d91c292aba3b3ea4063aa130 100644 (file)
@@ -65,6 +65,7 @@ config S390
        select ARCH_HAS_GCOV_PROFILE_ALL
        select ARCH_HAS_GIGANTIC_PAGE if (MEMORY_ISOLATION && COMPACTION) || CMA
        select ARCH_HAS_KCOV
+       select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_SG_CHAIN
        select ARCH_HAS_STRICT_KERNEL_RWX
index 2d24d33bf188a0957927a6addd8a7eb38a5319f6..9809694e1389ef836f4d5ea1eb4d9b08be5e1260 100644 (file)
@@ -171,7 +171,6 @@ static inline int is_module_addr(void *addr)
 #define _PAGE_WRITE    0x020           /* SW pte write bit */
 #define _PAGE_SPECIAL  0x040           /* SW associated with special page */
 #define _PAGE_UNUSED   0x080           /* SW bit for pgste usage state */
-#define __HAVE_ARCH_PTE_SPECIAL
 
 #ifdef CONFIG_MEM_SOFT_DIRTY
 #define _PAGE_SOFT_DIRTY 0x002         /* SW pte soft dirty bit */
index ae619d54018c570b13f9a9ad9f9018c9a5f95e34..4d61a085982b3e2a669141372fd38c40c6ebb851 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 config SUPERH
        def_bool y
+       select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_NO_COHERENT_DMA_MMAP if !MMU
index 89c513a982fcbbd83ac87a77e0c95c32782b73e6..f6abfe2bca93b8254278f635420b1fbc410b4a99 100644 (file)
@@ -156,8 +156,6 @@ extern void page_table_range_init(unsigned long start, unsigned long end,
 #define HAVE_ARCH_UNMAPPED_AREA
 #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN
 
-#define __HAVE_ARCH_PTE_SPECIAL
-
 #include <asm-generic/pgtable.h>
 
 #endif /* __ASM_SH_PGTABLE_H */
index b42ba888217d573139e34d93644db8728382a09a..9a2b8877f1749a4ec067032c7c2002755f45e5d9 100644 (file)
@@ -88,6 +88,7 @@ config SPARC64
        select ARCH_USE_QUEUED_SPINLOCKS
        select GENERIC_TIME_VSYSCALL
        select ARCH_CLOCKSOURCE_DATA
+       select ARCH_HAS_PTE_SPECIAL
 
 config ARCH_DEFCONFIG
        string
index 44d6ac47e035f8fe65b91771e8a758dffae4ae92..1393a8ac596b0a050433b1afcc7d8a97302f47f2 100644 (file)
@@ -117,9 +117,6 @@ bool kern_addr_valid(unsigned long addr);
 #define _PAGE_PMD_HUGE    _AC(0x0100000000000000,UL) /* Huge page            */
 #define _PAGE_PUD_HUGE    _PAGE_PMD_HUGE
 
-/* Advertise support for _PAGE_SPECIAL */
-#define __HAVE_ARCH_PTE_SPECIAL
-
 /* SUN4U pte bits... */
 #define _PAGE_SZ4MB_4U   _AC(0x6000000000000000,UL) /* 4MB Page             */
 #define _PAGE_SZ512K_4U          _AC(0x4000000000000000,UL) /* 512K Page            */
index cb6e3a21929473ca003b8227a6f97fc4b8335f79..f182a4e8e5bd24cb58bf0ce8a659adb5aa0c8d81 100644 (file)
@@ -60,6 +60,7 @@ config X86
        select ARCH_HAS_KCOV                    if X86_64
        select ARCH_HAS_MEMBARRIER_SYNC_CORE
        select ARCH_HAS_PMEM_API                if X86_64
+       select ARCH_HAS_PTE_SPECIAL
        select ARCH_HAS_REFCOUNT
        select ARCH_HAS_UACCESS_FLUSHCACHE      if X86_64
        select ARCH_HAS_UACCESS_MCSAFE          if X86_64
index 1e5a406739536d2376b81845899710017896367b..99fff853c9444466b6bd63163da17d9676773647 100644 (file)
@@ -65,7 +65,6 @@
 #define _PAGE_PKEY_BIT2        (_AT(pteval_t, 0))
 #define _PAGE_PKEY_BIT3        (_AT(pteval_t, 0))
 #endif
-#define __HAVE_ARCH_PTE_SPECIAL
 
 #define _PAGE_PKEY_MASK (_PAGE_PKEY_BIT0 | \
                         _PAGE_PKEY_BIT1 | \
index a03c2642a87c259c23e1157dfaf21d46080eec91..21713dc14ce23605861f8ba71726648cce5c03c9 100644 (file)
@@ -122,7 +122,7 @@ pud_t pud_mkdevmap(pud_t pud);
 #endif
 #endif /* __HAVE_ARCH_PTE_DEVMAP */
 
-#ifdef __HAVE_ARCH_PTE_SPECIAL
+#ifdef CONFIG_ARCH_HAS_PTE_SPECIAL
 static inline bool pfn_t_special(pfn_t pfn)
 {
        return (pfn.val & PFN_SPECIAL) == PFN_SPECIAL;
@@ -132,5 +132,5 @@ static inline bool pfn_t_special(pfn_t pfn)
 {
        return false;
 }
-#endif /* __HAVE_ARCH_PTE_SPECIAL */
+#endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
 #endif /* _LINUX_PFN_T_H_ */
index 3e0b6e87f65d7e12f38f52fad9a4d3d5c023a08d..00bffa7a51122ca4ea3d7d3ef46c0e79322d2cc8 100644 (file)
@@ -754,3 +754,6 @@ config GUP_BENCHMARK
          performance of get_user_pages_fast().
 
          See tools/testing/selftests/vm/gup_benchmark.c
+
+config ARCH_HAS_PTE_SPECIAL
+       bool
index 541904a7c60fd596b1f5bc432fc7932bc005fadf..010153989b9bfe871230aae4b9676fef0bedf7d8 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1354,7 +1354,7 @@ static void undo_dev_pagemap(int *nr, int nr_start, struct page **pages)
        }
 }
 
-#ifdef __HAVE_ARCH_PTE_SPECIAL
+#ifdef CONFIG_ARCH_HAS_PTE_SPECIAL
 static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
                         int write, struct page **pages, int *nr)
 {
@@ -1430,7 +1430,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end,
 {
        return 0;
 }
-#endif /* __HAVE_ARCH_PTE_SPECIAL */
+#endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */
 
 #if defined(__HAVE_ARCH_PTE_DEVMAP) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
 static int __gup_device_huge(unsigned long pfn, unsigned long addr,
index 6a97893a8de78ec104b9aab1566115197a71dff8..42d2d4366c116b1f5850dccceeb5b93cbd6ee9eb 100644 (file)
@@ -817,7 +817,7 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr,
  * PFNMAP mappings in order to support COWable mappings.
  *
  */
-#ifdef __HAVE_ARCH_PTE_SPECIAL
+#ifdef CONFIG_ARCH_HAS_PTE_SPECIAL
 # define HAVE_PTE_SPECIAL 1
 #else
 # define HAVE_PTE_SPECIAL 0