Message ID | 20240503130147.1154804-4-joey.gouly@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: Permission Overlay Extension | expand |
On 5/3/24 06:01, Joey Gouly wrote: > #ifdef CONFIG_ARCH_HAS_PKEYS > -# 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 */ > -# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 > -# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 > -#ifdef CONFIG_PPC > +# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 > +# define VM_PKEY_BIT0 VM_HIGH_ARCH_0 > +# define VM_PKEY_BIT1 VM_HIGH_ARCH_1 > +# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 > +#if CONFIG_ARCH_PKEY_BITS > 3 > +# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 > +#else > +# define VM_PKEY_BIT3 0 > +#endif > +#if CONFIG_ARCH_PKEY_BITS > 4 It's certainly not pretty, but it does get the arch #ifdef out of generic code. We might need to rethink this if we get another architecture or two, but this seems manageable for now. Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
On 5/3/24 18:31, Joey Gouly wrote: > Use the new CONFIG_ARCH_PKEY_BITS to simplify setting these bits > for different architectures. > > Signed-off-by: Joey Gouly <joey.gouly@arm.com> > > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: linux-fsdevel@vger.kernel.org > Cc: linux-mm@kvack.org > --- > fs/proc/task_mmu.c | 2 ++ > include/linux/mm.h | 16 ++++++++++------ > 2 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c > index 23fbab954c20..0d152f460dcc 100644 > --- a/fs/proc/task_mmu.c > +++ b/fs/proc/task_mmu.c > @@ -692,7 +692,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 b6bdaa18b9e9..5605b938acce 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -329,12 +329,16 @@ extern unsigned int kobjsize(const void *objp); > #endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */ > > #ifdef CONFIG_ARCH_HAS_PKEYS > -# 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 */ > -# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 > -# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 > -#ifdef CONFIG_PPC > +# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 > +# define VM_PKEY_BIT0 VM_HIGH_ARCH_0 > +# define VM_PKEY_BIT1 VM_HIGH_ARCH_1 > +# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 > +#if CONFIG_ARCH_PKEY_BITS > 3 > +# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 > +#else > +# define VM_PKEY_BIT3 0 > +#endif > +#if CONFIG_ARCH_PKEY_BITS > 4 > # define VM_PKEY_BIT4 VM_HIGH_ARCH_4 > #else > # define VM_PKEY_BIT4 0 Agree with Dave that this is not very clean but does the job i.e getting rid of the platform #ifdef which in itself is an improvement. Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 23fbab954c20..0d152f460dcc 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -692,7 +692,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 b6bdaa18b9e9..5605b938acce 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -329,12 +329,16 @@ extern unsigned int kobjsize(const void *objp); #endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */ #ifdef CONFIG_ARCH_HAS_PKEYS -# 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 */ -# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 -# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 -#ifdef CONFIG_PPC +# define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 +# define VM_PKEY_BIT0 VM_HIGH_ARCH_0 +# define VM_PKEY_BIT1 VM_HIGH_ARCH_1 +# define VM_PKEY_BIT2 VM_HIGH_ARCH_2 +#if CONFIG_ARCH_PKEY_BITS > 3 +# define VM_PKEY_BIT3 VM_HIGH_ARCH_3 +#else +# define VM_PKEY_BIT3 0 +#endif +#if CONFIG_ARCH_PKEY_BITS > 4 # define VM_PKEY_BIT4 VM_HIGH_ARCH_4 #else # define VM_PKEY_BIT4 0
Use the new CONFIG_ARCH_PKEY_BITS to simplify setting these bits for different architectures. Signed-off-by: Joey Gouly <joey.gouly@arm.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: linux-fsdevel@vger.kernel.org Cc: linux-mm@kvack.org --- fs/proc/task_mmu.c | 2 ++ include/linux/mm.h | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-)