Message ID | 8557e32739e38d3cdf409789c2b3e1b405c743f4.1638308023.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | kasan, vmalloc, arm64: add vmalloc tagging support for SW/HW_TAGS | expand |
On Tue, Nov 30, 2021 at 11:07PM +0100, andrey.konovalov@linux.dev wrote: > From: Andrey Konovalov <andreyknvl@google.com> > > HW_TAGS KASAN relies on ARM Memory Tagging Extension (MTE). With MTE, > a memory region must be mapped as MT_NORMAL_TAGGED to allow setting > memory tags via MTE-specific instructions. > > This change adds proper protection bits to vmalloc() allocations. > These allocations are always backed by page_alloc pages, so the tags > will actually be getting set on the corresponding physical memory. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> This is also missing Signed-off-by from Vincenzo.
On Fri, Dec 3, 2021 at 1:42 PM Marco Elver <elver@google.com> wrote: > > On Tue, Nov 30, 2021 at 11:07PM +0100, andrey.konovalov@linux.dev wrote: > > From: Andrey Konovalov <andreyknvl@google.com> > > > > HW_TAGS KASAN relies on ARM Memory Tagging Extension (MTE). With MTE, > > a memory region must be mapped as MT_NORMAL_TAGGED to allow setting > > memory tags via MTE-specific instructions. > > > > This change adds proper protection bits to vmalloc() allocations. > > These allocations are always backed by page_alloc pages, so the tags > > will actually be getting set on the corresponding physical memory. > > > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > > Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > > This is also missing Signed-off-by from Vincenzo. Same here. Thanks!
diff --git a/arch/arm64/include/asm/vmalloc.h b/arch/arm64/include/asm/vmalloc.h index b9185503feae..3d35adf365bf 100644 --- a/arch/arm64/include/asm/vmalloc.h +++ b/arch/arm64/include/asm/vmalloc.h @@ -25,4 +25,14 @@ static inline bool arch_vmap_pmd_supported(pgprot_t prot) #endif +#define arch_vmalloc_pgprot_modify arch_vmalloc_pgprot_modify +static inline pgprot_t arch_vmalloc_pgprot_modify(pgprot_t prot) +{ + if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) && + (pgprot_val(prot) == pgprot_val(PAGE_KERNEL))) + prot = pgprot_tagged(prot); + + return prot; +} + #endif /* _ASM_ARM64_VMALLOC_H */ diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index b22369f540eb..965c4bf475f1 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -108,6 +108,13 @@ static inline int arch_vmap_pte_supported_shift(unsigned long size) } #endif +#ifndef arch_vmalloc_pgprot_modify +static inline pgprot_t arch_vmalloc_pgprot_modify(pgprot_t prot) +{ + return prot; +} +#endif + /* * Highlevel APIs for driver use */ diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 7be18b292679..f37d0ed99bf9 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3033,6 +3033,8 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, return NULL; } + prot = arch_vmalloc_pgprot_modify(prot); + if (vmap_allow_huge && !(vm_flags & VM_NO_HUGE_VMAP)) { unsigned long size_per_node;