| From: "Matthew Wilcox (Oracle)" <willy@infradead.org> |
| Subject: x86: remove PG_uncached |
| Date: Wed, 21 Aug 2024 20:34:43 +0100 |
| |
| Convert x86 to use PG_arch_2 instead of PG_uncached and remove |
| PG_uncached. |
| |
| Link: https://lkml.kernel.org/r/20240821193445.2294269-11-willy@infradead.org |
| Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| Documentation/features/vm/PG_uncached/arch-support.txt | 30 ---------- |
| arch/arm64/Kconfig | 3 - |
| arch/x86/Kconfig | 5 - |
| arch/x86/mm/pat/memtype.c | 8 +- |
| fs/proc/page.c | 8 +- |
| include/linux/kernel-page-flags.h | 1 |
| include/linux/page-flags.h | 13 +--- |
| include/trace/events/mmflags.h | 23 +++---- |
| mm/Kconfig | 9 +-- |
| mm/huge_memory.c | 4 + |
| tools/mm/page-types.c | 3 - |
| 11 files changed, 31 insertions(+), 76 deletions(-) |
| |
| --- a/arch/arm64/Kconfig~x86-remove-pg_uncached |
| +++ a/arch/arm64/Kconfig |
| @@ -2100,7 +2100,8 @@ config ARM64_MTE |
| depends on ARM64_PAN |
| select ARCH_HAS_SUBPAGE_FAULTS |
| select ARCH_USES_HIGH_VMA_FLAGS |
| - select ARCH_USES_PG_ARCH_X |
| + select ARCH_USES_PG_ARCH_2 |
| + select ARCH_USES_PG_ARCH_3 |
| help |
| Memory Tagging (part of the ARMv8.5 Extensions) provides |
| architectural support for run-time, always-on detection of |
| --- a/arch/x86/Kconfig~x86-remove-pg_uncached |
| +++ a/arch/x86/Kconfig |
| @@ -1799,6 +1799,7 @@ config X86_PAT |
| def_bool y |
| prompt "x86 PAT support" if EXPERT |
| depends on MTRR |
| + select ARCH_USES_PG_ARCH_2 |
| help |
| Use PAT attributes to setup page level cache control. |
| |
| @@ -1810,10 +1811,6 @@ config X86_PAT |
| |
| If unsure, say Y. |
| |
| -config ARCH_USES_PG_UNCACHED |
| - def_bool y |
| - depends on X86_PAT |
| - |
| config X86_UMIP |
| def_bool y |
| prompt "User Mode Instruction Prevention" if EXPERT |
| --- a/arch/x86/mm/pat/memtype.c~x86-remove-pg_uncached |
| +++ a/arch/x86/mm/pat/memtype.c |
| @@ -104,7 +104,7 @@ __setup("debugpat", pat_debug_setup); |
| |
| #ifdef CONFIG_X86_PAT |
| /* |
| - * X86 PAT uses page flags arch_1 and uncached together to keep track of |
| + * X86 PAT uses page flags arch_1 and arch_2 together to keep track of |
| * memory type of pages that have backing page struct. |
| * |
| * X86 PAT supports 4 different memory types: |
| @@ -118,9 +118,9 @@ __setup("debugpat", pat_debug_setup); |
| |
| #define _PGMT_WB 0 |
| #define _PGMT_WC (1UL << PG_arch_1) |
| -#define _PGMT_UC_MINUS (1UL << PG_uncached) |
| -#define _PGMT_WT (1UL << PG_uncached | 1UL << PG_arch_1) |
| -#define _PGMT_MASK (1UL << PG_uncached | 1UL << PG_arch_1) |
| +#define _PGMT_UC_MINUS (1UL << PG_arch_2) |
| +#define _PGMT_WT (1UL << PG_arch_2 | 1UL << PG_arch_1) |
| +#define _PGMT_MASK (1UL << PG_arch_2 | 1UL << PG_arch_1) |
| #define _PGMT_CLEAR_MASK (~_PGMT_MASK) |
| |
| static inline enum page_cache_mode get_page_memtype(struct page *pg) |
| diff --git a/Documentation/features/vm/PG_uncached/arch-support.txt a/Documentation/features/vm/PG_uncached/arch-support.txt |
| deleted file mode 100644 |
| --- a/Documentation/features/vm/PG_uncached/arch-support.txt |
| +++ /dev/null |
| @@ -1,30 +0,0 @@ |
| -# |
| -# Feature name: PG_uncached |
| -# Kconfig: ARCH_USES_PG_UNCACHED |
| -# description: arch supports the PG_uncached page flag |
| -# |
| - ----------------------- |
| - | arch |status| |
| - ----------------------- |
| - | alpha: | TODO | |
| - | arc: | TODO | |
| - | arm: | TODO | |
| - | arm64: | TODO | |
| - | csky: | TODO | |
| - | hexagon: | TODO | |
| - | loongarch: | TODO | |
| - | m68k: | TODO | |
| - | microblaze: | TODO | |
| - | mips: | TODO | |
| - | nios2: | TODO | |
| - | openrisc: | TODO | |
| - | parisc: | TODO | |
| - | powerpc: | TODO | |
| - | riscv: | TODO | |
| - | s390: | TODO | |
| - | sh: | TODO | |
| - | sparc: | TODO | |
| - | um: | TODO | |
| - | x86: | ok | |
| - | xtensa: | TODO | |
| - ----------------------- |
| --- a/fs/proc/page.c~x86-remove-pg_uncached |
| +++ a/fs/proc/page.c |
| @@ -206,18 +206,16 @@ u64 stable_page_flags(const struct page |
| u |= kpf_copy_bit(page->flags, KPF_HWPOISON, PG_hwpoison); |
| #endif |
| |
| -#ifdef CONFIG_ARCH_USES_PG_UNCACHED |
| - u |= kpf_copy_bit(k, KPF_UNCACHED, PG_uncached); |
| -#endif |
| - |
| u |= kpf_copy_bit(k, KPF_RESERVED, PG_reserved); |
| u |= kpf_copy_bit(k, KPF_OWNER_2, PG_owner_2); |
| u |= kpf_copy_bit(k, KPF_PRIVATE, PG_private); |
| u |= kpf_copy_bit(k, KPF_PRIVATE_2, PG_private_2); |
| u |= kpf_copy_bit(k, KPF_OWNER_PRIVATE, PG_owner_priv_1); |
| u |= kpf_copy_bit(k, KPF_ARCH, PG_arch_1); |
| -#ifdef CONFIG_ARCH_USES_PG_ARCH_X |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_2 |
| u |= kpf_copy_bit(k, KPF_ARCH_2, PG_arch_2); |
| +#endif |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_3 |
| u |= kpf_copy_bit(k, KPF_ARCH_3, PG_arch_3); |
| #endif |
| |
| --- a/include/linux/kernel-page-flags.h~x86-remove-pg_uncached |
| +++ a/include/linux/kernel-page-flags.h |
| @@ -15,7 +15,6 @@ |
| #define KPF_PRIVATE_2 36 |
| #define KPF_OWNER_PRIVATE 37 |
| #define KPF_ARCH 38 |
| -#define KPF_UNCACHED 39 |
| #define KPF_SOFTDIRTY 40 |
| #define KPF_ARCH_2 41 |
| #define KPF_ARCH_3 42 |
| --- a/include/linux/page-flags.h~x86-remove-pg_uncached |
| +++ a/include/linux/page-flags.h |
| @@ -113,9 +113,6 @@ enum pageflags { |
| #ifdef CONFIG_MMU |
| PG_mlocked, /* Page is vma mlocked */ |
| #endif |
| -#ifdef CONFIG_ARCH_USES_PG_UNCACHED |
| - PG_uncached, /* Page has been mapped as uncached */ |
| -#endif |
| #ifdef CONFIG_MEMORY_FAILURE |
| PG_hwpoison, /* hardware poisoned page. Don't touch */ |
| #endif |
| @@ -123,8 +120,10 @@ enum pageflags { |
| PG_young, |
| PG_idle, |
| #endif |
| -#ifdef CONFIG_ARCH_USES_PG_ARCH_X |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_2 |
| PG_arch_2, |
| +#endif |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_3 |
| PG_arch_3, |
| #endif |
| __NR_PAGEFLAGS, |
| @@ -602,12 +601,6 @@ FOLIO_FLAG_FALSE(mlocked) |
| FOLIO_TEST_SET_FLAG_FALSE(mlocked) |
| #endif |
| |
| -#ifdef CONFIG_ARCH_USES_PG_UNCACHED |
| -PAGEFLAG(Uncached, uncached, PF_NO_COMPOUND) |
| -#else |
| -PAGEFLAG_FALSE(Uncached, uncached) |
| -#endif |
| - |
| #ifdef CONFIG_MEMORY_FAILURE |
| PAGEFLAG(HWPoison, hwpoison, PF_ANY) |
| TESTSCFLAG(HWPoison, hwpoison, PF_ANY) |
| --- a/include/trace/events/mmflags.h~x86-remove-pg_uncached |
| +++ a/include/trace/events/mmflags.h |
| @@ -71,12 +71,6 @@ |
| #define IF_HAVE_PG_MLOCK(_name) |
| #endif |
| |
| -#ifdef CONFIG_ARCH_USES_PG_UNCACHED |
| -#define IF_HAVE_PG_UNCACHED(_name) ,{1UL << PG_##_name, __stringify(_name)} |
| -#else |
| -#define IF_HAVE_PG_UNCACHED(_name) |
| -#endif |
| - |
| #ifdef CONFIG_MEMORY_FAILURE |
| #define IF_HAVE_PG_HWPOISON(_name) ,{1UL << PG_##_name, __stringify(_name)} |
| #else |
| @@ -89,10 +83,16 @@ |
| #define IF_HAVE_PG_IDLE(_name) |
| #endif |
| |
| -#ifdef CONFIG_ARCH_USES_PG_ARCH_X |
| -#define IF_HAVE_PG_ARCH_X(_name) ,{1UL << PG_##_name, __stringify(_name)} |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_2 |
| +#define IF_HAVE_PG_ARCH_2(_name) ,{1UL << PG_##_name, __stringify(_name)} |
| +#else |
| +#define IF_HAVE_PG_ARCH_2(_name) |
| +#endif |
| + |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_3 |
| +#define IF_HAVE_PG_ARCH_3(_name) ,{1UL << PG_##_name, __stringify(_name)} |
| #else |
| -#define IF_HAVE_PG_ARCH_X(_name) |
| +#define IF_HAVE_PG_ARCH_3(_name) |
| #endif |
| |
| #define DEF_PAGEFLAG_NAME(_name) { 1UL << PG_##_name, __stringify(_name) } |
| @@ -118,12 +118,11 @@ |
| DEF_PAGEFLAG_NAME(swapbacked), \ |
| DEF_PAGEFLAG_NAME(unevictable) \ |
| IF_HAVE_PG_MLOCK(mlocked) \ |
| -IF_HAVE_PG_UNCACHED(uncached) \ |
| IF_HAVE_PG_HWPOISON(hwpoison) \ |
| IF_HAVE_PG_IDLE(idle) \ |
| IF_HAVE_PG_IDLE(young) \ |
| -IF_HAVE_PG_ARCH_X(arch_2) \ |
| -IF_HAVE_PG_ARCH_X(arch_3) |
| +IF_HAVE_PG_ARCH_2(arch_2) \ |
| +IF_HAVE_PG_ARCH_3(arch_3) |
| |
| #define show_page_flags(flags) \ |
| (flags) ? __print_flags(flags, "|", \ |
| --- a/mm/huge_memory.c~x86-remove-pg_uncached |
| +++ a/mm/huge_memory.c |
| @@ -2993,8 +2993,10 @@ static void __split_huge_page_tail(struc |
| (1L << PG_workingset) | |
| (1L << PG_locked) | |
| (1L << PG_unevictable) | |
| -#ifdef CONFIG_ARCH_USES_PG_ARCH_X |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_2 |
| (1L << PG_arch_2) | |
| +#endif |
| +#ifdef CONFIG_ARCH_USES_PG_ARCH_3 |
| (1L << PG_arch_3) | |
| #endif |
| (1L << PG_dirty) | |
| --- a/mm/Kconfig~x86-remove-pg_uncached |
| +++ a/mm/Kconfig |
| @@ -1079,13 +1079,10 @@ config ARCH_USES_HIGH_VMA_FLAGS |
| config ARCH_HAS_PKEYS |
| bool |
| |
| -config ARCH_USES_PG_ARCH_X |
| +config ARCH_USES_PG_ARCH_2 |
| + bool |
| +config ARCH_USES_PG_ARCH_3 |
| bool |
| - help |
| - Enable the definition of PG_arch_x page flags with x > 1. Only |
| - suitable for 64-bit architectures with CONFIG_FLATMEM or |
| - CONFIG_SPARSEMEM_VMEMMAP enabled, otherwise there may not be |
| - enough room for additional bits in page->flags. |
| |
| config VM_EVENT_COUNTERS |
| default y |
| --- a/tools/mm/page-types.c~x86-remove-pg_uncached |
| +++ a/tools/mm/page-types.c |
| @@ -76,7 +76,7 @@ |
| #define KPF_PRIVATE_2 36 |
| #define KPF_OWNER_PRIVATE 37 |
| #define KPF_ARCH 38 |
| -#define KPF_UNCACHED 39 |
| +#define KPF_UNCACHED 39 /* unused */ |
| #define KPF_SOFTDIRTY 40 |
| #define KPF_ARCH_2 41 |
| |
| @@ -134,7 +134,6 @@ static const char * const page_flag_name |
| [KPF_PRIVATE_2] = "p:private_2", |
| [KPF_OWNER_PRIVATE] = "O:owner_private", |
| [KPF_ARCH] = "h:arch", |
| - [KPF_UNCACHED] = "c:uncached", |
| [KPF_SOFTDIRTY] = "f:softdirty", |
| [KPF_ARCH_2] = "H:arch_2", |
| |
| _ |