mm: Add PG_arch_2 page flag
authorSteven Price <steven.price@arm.com>
Wed, 22 Apr 2020 14:25:27 +0000 (15:25 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 4 Sep 2020 11:46:06 +0000 (12:46 +0100)
For arm64 MTE support it is necessary to be able to mark pages that
contain user space visible tags that will need to be saved/restored e.g.
when swapped out.

To support this add a new arch specific flag (PG_arch_2). This flag is
only available on 64-bit architectures due to the limited number of
spare page flags on the 32-bit ones.

Signed-off-by: Steven Price <steven.price@arm.com>
[catalin.marinas@arm.com: use CONFIG_64BIT for guarding this new flag]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
fs/proc/page.c
include/linux/kernel-page-flags.h
include/linux/page-flags.h
include/trace/events/mmflags.h
tools/vm/page-types.c

index f909243..9f1077d 100644 (file)
@@ -217,6 +217,9 @@ u64 stable_page_flags(struct page *page)
        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_64BIT
+       u |= kpf_copy_bit(k, KPF_ARCH_2,        PG_arch_2);
+#endif
 
        return u;
 };
index abd20ef..eee1877 100644 (file)
@@ -17,5 +17,6 @@
 #define KPF_ARCH               38
 #define KPF_UNCACHED           39
 #define KPF_SOFTDIRTY          40
+#define KPF_ARCH_2             41
 
 #endif /* LINUX_KERNEL_PAGE_FLAGS_H */
index 6be1aa5..276140c 100644 (file)
@@ -135,6 +135,9 @@ enum pageflags {
 #if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT)
        PG_young,
        PG_idle,
+#endif
+#ifdef CONFIG_64BIT
+       PG_arch_2,
 #endif
        __NR_PAGEFLAGS,
 
index 5fb7520..67018d3 100644 (file)
 #define IF_HAVE_PG_IDLE(flag,string)
 #endif
 
+#ifdef CONFIG_64BIT
+#define IF_HAVE_PG_ARCH_2(flag,string) ,{1UL << flag, string}
+#else
+#define IF_HAVE_PG_ARCH_2(flag,string)
+#endif
+
 #define __def_pageflag_names                                           \
        {1UL << PG_locked,              "locked"        },              \
        {1UL << PG_waiters,             "waiters"       },              \
@@ -105,7 +111,8 @@ IF_HAVE_PG_MLOCK(PG_mlocked,                "mlocked"       )               \
 IF_HAVE_PG_UNCACHED(PG_uncached,       "uncached"      )               \
 IF_HAVE_PG_HWPOISON(PG_hwpoison,       "hwpoison"      )               \
 IF_HAVE_PG_IDLE(PG_young,              "young"         )               \
-IF_HAVE_PG_IDLE(PG_idle,               "idle"          )
+IF_HAVE_PG_IDLE(PG_idle,               "idle"          )               \
+IF_HAVE_PG_ARCH_2(PG_arch_2,           "arch_2"        )
 
 #define show_page_flags(flags)                                         \
        (flags) ? __print_flags(flags, "|",                             \
index 58c0eab..0517c74 100644 (file)
@@ -78,6 +78,7 @@
 #define KPF_ARCH               38
 #define KPF_UNCACHED           39
 #define KPF_SOFTDIRTY          40
+#define KPF_ARCH_2             41
 
 /* [48-] take some arbitrary free slots for expanding overloaded flags
  * not part of kernel API
@@ -135,6 +136,7 @@ static const char * const page_flag_names[] = {
        [KPF_ARCH]              = "h:arch",
        [KPF_UNCACHED]          = "c:uncached",
        [KPF_SOFTDIRTY]         = "f:softdirty",
+       [KPF_ARCH_2]            = "H:arch_2",
 
        [KPF_READAHEAD]         = "I:readahead",
        [KPF_SLOB_FREE]         = "P:slob_free",