mm: Add PG_arch_2 page flag

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>
This commit is contained in:
Steven Price 2020-04-22 15:25:27 +01:00 committed by Catalin Marinas
parent 637ec831ea
commit 4beba9486a
5 changed files with 17 additions and 1 deletions

View 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_PRIVATE_2, PG_private_2);
u |= kpf_copy_bit(k, KPF_OWNER_PRIVATE, PG_owner_priv_1); u |= kpf_copy_bit(k, KPF_OWNER_PRIVATE, PG_owner_priv_1);
u |= kpf_copy_bit(k, KPF_ARCH, PG_arch_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; return u;
}; };

View File

@ -17,5 +17,6 @@
#define KPF_ARCH 38 #define KPF_ARCH 38
#define KPF_UNCACHED 39 #define KPF_UNCACHED 39
#define KPF_SOFTDIRTY 40 #define KPF_SOFTDIRTY 40
#define KPF_ARCH_2 41
#endif /* LINUX_KERNEL_PAGE_FLAGS_H */ #endif /* LINUX_KERNEL_PAGE_FLAGS_H */

View File

@ -135,6 +135,9 @@ enum pageflags {
#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT) #if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT)
PG_young, PG_young,
PG_idle, PG_idle,
#endif
#ifdef CONFIG_64BIT
PG_arch_2,
#endif #endif
__NR_PAGEFLAGS, __NR_PAGEFLAGS,

View File

@ -79,6 +79,12 @@
#define IF_HAVE_PG_IDLE(flag,string) #define IF_HAVE_PG_IDLE(flag,string)
#endif #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 \ #define __def_pageflag_names \
{1UL << PG_locked, "locked" }, \ {1UL << PG_locked, "locked" }, \
{1UL << PG_waiters, "waiters" }, \ {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_UNCACHED(PG_uncached, "uncached" ) \
IF_HAVE_PG_HWPOISON(PG_hwpoison, "hwpoison" ) \ IF_HAVE_PG_HWPOISON(PG_hwpoison, "hwpoison" ) \
IF_HAVE_PG_IDLE(PG_young, "young" ) \ 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) \ #define show_page_flags(flags) \
(flags) ? __print_flags(flags, "|", \ (flags) ? __print_flags(flags, "|", \

View File

@ -78,6 +78,7 @@
#define KPF_ARCH 38 #define KPF_ARCH 38
#define KPF_UNCACHED 39 #define KPF_UNCACHED 39
#define KPF_SOFTDIRTY 40 #define KPF_SOFTDIRTY 40
#define KPF_ARCH_2 41
/* [48-] take some arbitrary free slots for expanding overloaded flags /* [48-] take some arbitrary free slots for expanding overloaded flags
* not part of kernel API * not part of kernel API
@ -135,6 +136,7 @@ static const char * const page_flag_names[] = {
[KPF_ARCH] = "h:arch", [KPF_ARCH] = "h:arch",
[KPF_UNCACHED] = "c:uncached", [KPF_UNCACHED] = "c:uncached",
[KPF_SOFTDIRTY] = "f:softdirty", [KPF_SOFTDIRTY] = "f:softdirty",
[KPF_ARCH_2] = "H:arch_2",
[KPF_READAHEAD] = "I:readahead", [KPF_READAHEAD] = "I:readahead",
[KPF_SLOB_FREE] = "P:slob_free", [KPF_SLOB_FREE] = "P:slob_free",