Message ID | 20230927140123.5283-10-joey.gouly@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Permission Overlay Extension | expand |
Hi Joey, kernel test robot noticed the following build errors: [auto build test ERROR on arm64/for-next/core] [also build test ERROR on linus/master v6.6-rc3 next-20230929] [cannot apply to akpm-mm/mm-everything kvmarm/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Joey-Gouly/arm64-sysreg-add-system-register-POR_EL-0-1/20230927-221459 base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core patch link: https://lore.kernel.org/r/20230927140123.5283-10-joey.gouly%40arm.com patch subject: [PATCH v1 09/20] arm64: define VM_PKEY_BIT* for arm64 config: arm64-randconfig-001-20230930 (https://download.01.org/0day-ci/archive/20230930/202309301944.jGh1qzvm-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230930/202309301944.jGh1qzvm-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202309301944.jGh1qzvm-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from fs/proc/meminfo.c:5: arch/arm64/include/asm/mman.h: In function 'arch_calc_vm_prot_bits': >> include/linux/mm.h:346:25: error: 'VM_HIGH_ARCH_2' undeclared (first use in this function) 346 | # define VM_PKEY_BIT0 VM_HIGH_ARCH_2 /* A protection key is a 3-bit value on arm64 */ | ^~~~~~~~~~~~~~ arch/arm64/include/asm/mman.h:20:29: note: in expansion of macro 'VM_PKEY_BIT0' 20 | ret |= pkey & 0x1 ? VM_PKEY_BIT0 : 0; | ^~~~~~~~~~~~ include/linux/mm.h:346:25: note: each undeclared identifier is reported only once for each function it appears in 346 | # define VM_PKEY_BIT0 VM_HIGH_ARCH_2 /* A protection key is a 3-bit value on arm64 */ | ^~~~~~~~~~~~~~ arch/arm64/include/asm/mman.h:20:29: note: in expansion of macro 'VM_PKEY_BIT0' 20 | ret |= pkey & 0x1 ? VM_PKEY_BIT0 : 0; | ^~~~~~~~~~~~ >> include/linux/mm.h:347:25: error: 'VM_HIGH_ARCH_3' undeclared (first use in this function) 347 | # define VM_PKEY_BIT1 VM_HIGH_ARCH_3 | ^~~~~~~~~~~~~~ arch/arm64/include/asm/mman.h:21:29: note: in expansion of macro 'VM_PKEY_BIT1' 21 | ret |= pkey & 0x2 ? VM_PKEY_BIT1 : 0; | ^~~~~~~~~~~~ >> include/linux/mm.h:348:25: error: 'VM_HIGH_ARCH_4' undeclared (first use in this function) 348 | # define VM_PKEY_BIT2 VM_HIGH_ARCH_4 | ^~~~~~~~~~~~~~ arch/arm64/include/asm/mman.h:22:29: note: in expansion of macro 'VM_PKEY_BIT2' 22 | ret |= pkey & 0x4 ? VM_PKEY_BIT2 : 0; | ^~~~~~~~~~~~ vim +/VM_HIGH_ARCH_2 +346 include/linux/mm.h 343 344 #if defined(CONFIG_ARM64) 345 # define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_2 > 346 # define VM_PKEY_BIT0 VM_HIGH_ARCH_2 /* A protection key is a 3-bit value on arm64 */ > 347 # define VM_PKEY_BIT1 VM_HIGH_ARCH_3 > 348 # define VM_PKEY_BIT2 VM_HIGH_ARCH_4 349 # define VM_PKEY_BIT3 0 350 # define VM_PKEY_BIT4 0 351 #endif 352
On 9/27/23 07:01, Joey Gouly wrote: > -#ifdef CONFIG_ARCH_HAS_PKEYS > +#if defined(CONFIG_ARCH_HAS_PKEYS) && !defined(CONFIG_ARM64) > # define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 > # define VM_PKEY_BIT0 VM_HIGH_ARCH_0 /* A protection key is a 4-bit value */ > # define VM_PKEY_BIT1 VM_HIGH_ARCH_1 /* on x86 and 5-bit value on ppc64 */ > @@ -341,6 +341,15 @@ extern unsigned int kobjsize(const void *objp); > #endif > #endif /* CONFIG_ARCH_HAS_PKEYS */ > > +#if defined(CONFIG_ARM64) > +# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_2 > +# define VM_PKEY_BIT0 VM_HIGH_ARCH_2 /* A protection key is a 3-bit value on arm64 */ > +# define VM_PKEY_BIT1 VM_HIGH_ARCH_3 > +# define VM_PKEY_BIT2 VM_HIGH_ARCH_4 > +# define VM_PKEY_BIT3 0 > +# define VM_PKEY_BIT4 0 > +#endif This might be a bit cleaner to just defer out to a per-arch header. It made sense for ppc and x86 to share their copy in here, but now that a third one is around we should probably move this to actual arch/ code.
diff --git a/arch/arm64/include/asm/mman.h b/arch/arm64/include/asm/mman.h index 5966ee4a6154..22de55518913 100644 --- a/arch/arm64/include/asm/mman.h +++ b/arch/arm64/include/asm/mman.h @@ -7,7 +7,7 @@ #include <uapi/asm/mman.h> static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot, - unsigned long pkey __always_unused) + unsigned long pkey) { unsigned long ret = 0; @@ -17,6 +17,10 @@ static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot, if (system_supports_mte() && (prot & PROT_MTE)) ret |= VM_MTE; + ret |= pkey & 0x1 ? VM_PKEY_BIT0 : 0; + ret |= pkey & 0x2 ? VM_PKEY_BIT1 : 0; + ret |= pkey & 0x4 ? VM_PKEY_BIT2 : 0; + return ret; } #define arch_calc_vm_prot_bits(prot, pkey) arch_calc_vm_prot_bits(prot, pkey) diff --git a/arch/arm64/mm/mmap.c b/arch/arm64/mm/mmap.c index 8f5b7ce857ed..ef75b04f9d02 100644 --- a/arch/arm64/mm/mmap.c +++ b/arch/arm64/mm/mmap.c @@ -98,6 +98,13 @@ pgprot_t vm_get_page_prot(unsigned long vm_flags) if (vm_flags & VM_MTE) prot |= PTE_ATTRINDX(MT_NORMAL_TAGGED); + if (vm_flags & VM_PKEY_BIT0) + prot |= PTE_PO_IDX_0; + if (vm_flags & VM_PKEY_BIT1) + prot |= PTE_PO_IDX_1; + if (vm_flags & VM_PKEY_BIT2) + prot |= PTE_PO_IDX_2; + return __pgprot(prot); } EXPORT_SYMBOL(vm_get_page_prot); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 3dd5be96691b..fcd94a39bb30 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -689,7 +689,9 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma) [ilog2(VM_PKEY_BIT0)] = "", [ilog2(VM_PKEY_BIT1)] = "", [ilog2(VM_PKEY_BIT2)] = "", +#if VM_PKEY_BIT3 [ilog2(VM_PKEY_BIT3)] = "", +#endif #if VM_PKEY_BIT4 [ilog2(VM_PKEY_BIT4)] = "", #endif diff --git a/include/linux/mm.h b/include/linux/mm.h index bf5d0b1b16f4..43d96c925b9b 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -328,7 +328,7 @@ extern unsigned int kobjsize(const void *objp); #define VM_HIGH_ARCH_5 BIT(VM_HIGH_ARCH_BIT_5) #endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */ -#ifdef CONFIG_ARCH_HAS_PKEYS +#if defined(CONFIG_ARCH_HAS_PKEYS) && !defined(CONFIG_ARM64) # define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 # define VM_PKEY_BIT0 VM_HIGH_ARCH_0 /* A protection key is a 4-bit value */ # define VM_PKEY_BIT1 VM_HIGH_ARCH_1 /* on x86 and 5-bit value on ppc64 */ @@ -341,6 +341,15 @@ extern unsigned int kobjsize(const void *objp); #endif #endif /* CONFIG_ARCH_HAS_PKEYS */ +#if defined(CONFIG_ARM64) +# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_2 +# define VM_PKEY_BIT0 VM_HIGH_ARCH_2 /* A protection key is a 3-bit value on arm64 */ +# define VM_PKEY_BIT1 VM_HIGH_ARCH_3 +# define VM_PKEY_BIT2 VM_HIGH_ARCH_4 +# define VM_PKEY_BIT3 0 +# define VM_PKEY_BIT4 0 +#endif + #ifdef CONFIG_X86_USER_SHADOW_STACK /* * VM_SHADOW_STACK should not be set with VM_SHARED because of lack of
Define the VM_PKEY_BIT* values for arm64, and convert them into the arm64 specific pgprot values. Signed-off-by: Joey Gouly <joey.gouly@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> --- arch/arm64/include/asm/mman.h | 6 +++++- arch/arm64/mm/mmap.c | 7 +++++++ fs/proc/task_mmu.c | 2 ++ include/linux/mm.h | 11 ++++++++++- 4 files changed, 24 insertions(+), 2 deletions(-)