kasan-vmalloc-add-vmalloc-tagging-for-hw_tags.patch removed from -mm tree
The patch titled
Subject: kasan, vmalloc: add vmalloc tagging for HW_TAGS
has been removed from the -mm tree. Its filename was
kasan-vmalloc-add-vmalloc-tagging-for-hw_tags.patch
This patch was dropped because it was merged into mainline or a subsystem tree
------------------------------------------------------
From: Andrey Konovalov <[email protected]>
Subject: kasan, vmalloc: add vmalloc tagging for HW_TAGS
Add vmalloc tagging support to HW_TAGS KASAN.
The key difference between HW_TAGS and the other two KASAN modes when it comes to vmalloc: HW_TAGS KASAN can only assign tags to physical memory. The other two modes have shadow memory covering every mapped virtual memory region.
Make __kasan_unpoison_vmalloc() for HW_TAGS KASAN:
- Skip non-VM_ALLOC mappings as HW_TAGS KASAN can only tag a single mapping of normal physical memory; see the comment in the function.
- Generate a random tag, tag the returned pointer and the allocation, and initialize the allocation at the same time.
- Propagate the tag into the page stucts to allow accesses through page_address(vmalloc_to_page()).
The rest of vmalloc-related KASAN hooks are not needed:
- The shadow-related ones are fully skipped.
- __kasan_poison_vmalloc() is kept as a no-op with a comment.
Poisoning and zeroing of physical pages that are backing vmalloc() allocations are skipped via __GFP_SKIP_KASAN_UNPOISON and __GFP_SKIP_ZERO:__kasan_unpoison_vmalloc() does that instead.
Enabling CONFIG_KASAN_VMALLOC with HW_TAGS is not yet allowed.
---
include/linux/kasan.h | 36 +++++++++++++-- kernel/scs.c | 4 - mm/kasan/hw_tags.c | 92 ++++++++++++++++++++++++++++++++++++++++ mm/kasan/shadow.c | 10 +++- mm/vmalloc.c | 51 +++++++++++++++++----- 5 files changed, 175 insertions(+), 18 deletions(-)
include/linux/kasan.h renamed from include/linux/kasan.h~kasan-vmalloc-add-vmalloc-tagging-for-hw_tags +32 -4
@@ -26,6 +26,12 @@ struct kunit_kasan_expectation {#endif +typedef unsigned int __bitwise kasan_vmalloc_flags_t ; + +#define KASAN_VMALLOC_NONE 0x00u +#define KASAN_VMALLOC_INIT 0x01u +#define KASAN_VMALLOC_VM_ALLOC 0x02u +#if defined(CONFIG_KASAN_GENERIC ) || defined(CONFIG_KASAN_SW_TAGS )#include <linux/pgtable.h>
@@ -397,18 +403,39 @@ static inline void kasan_init_hw_tags(vo#ifdef CONFIG_KASAN_VMALLOC +#if defined(CONFIG_KASAN_GENERIC ) || defined(CONFIG_KASAN_SW_TAGS ) +void kasan_populate_early_vm_area_shadow (void *start,unsigned long size);int kasan_populate_vmalloc (unsigned long addr,unsigned long size);void kasan_release_vmalloc (unsigned long start,unsigned long end,unsigned long free_region_start,unsigned long free_region_end); -void *__kasan_unpoison_vmalloc (const void *start,unsigned long size); +#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ + +static inline void kasan_populate_early_vm_area_shadow (void *start, +unsigned long size) +{ } +static inline int kasan_populate_vmalloc (unsigned long start, +unsigned long size) +{ +return 0 ; +} +static inline void kasan_release_vmalloc (unsigned long start, +unsigned long end, +unsigned long free_region_start, +unsigned long free_region_end) { } + +#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ + +void *__kasan_unpoison_vmalloc (const void *start,unsigned long size, +kasan_vmalloc_flags_t flags); static __always_inline void *kasan_unpoison_vmalloc(const void *start, -unsigned long size) +unsigned long size, +kasan_vmalloc_flags_t flags) {if (kasan_enabled ()) -return __kasan_unpoison_vmalloc (start, size); +return __kasan_unpoison_vmalloc (start, size, flags);return (void *)start; }
@@ -435,7 +462,8 @@ static inline void kasan_release_vmalloc unsigned long free_region_end) { }static inline void *kasan_unpoison_vmalloc (const void *start, -unsigned long size) +unsigned long size, +kasan_vmalloc_flags_t flags) {return (void *)start; }
kernel/scs.c renamed from kernel/scs.c~kasan-vmalloc-add-vmalloc-tagging-for-hw_tags +2 -2
@@ -32,7 +32,7 @@ static void *__scs_alloc(int node)for (i =0 ; i <NR_CACHED_SCS ; i++) { s =this_cpu_xchg (scs_cache[i],NULL );if (s) { -kasan_unpoison_vmalloc (s,SCS_SIZE ); +kasan_unpoison_vmalloc (s,SCS_SIZE ,KASAN_VMALLOC_NONE );memset (s,0 ,SCS_SIZE );return s; }
@@ -78,7 +78,7 @@ void scs_free(void *s)if (this_cpu_cmpxchg (scs_cache[i],0 , s) ==NULL )return ; -kasan_unpoison_vmalloc (s,SCS_SIZE ); +kasan_unpoison_vmalloc (s,SCS_SIZE ,KASAN_VMALLOC_NONE );vfree_atomic (s); }
mm/kasan/hw_tags.c renamed from mm/kasan/hw_tags.c~kasan-vmalloc-add-vmalloc-tagging-for-hw_tags +92 -0
98 lines not on this page · raw message
mm/kasan/shadow.c renamed from mm/kasan/shadow.c~kasan-vmalloc-add-vmalloc-tagging-for-hw_tags +9 -1
@@ -475,8 +475,16 @@ void kasan_release_vmalloc(unsigned long } } -void *__kasan_unpoison_vmalloc (const void *start,unsigned long size) +void *__kasan_unpoison_vmalloc (const void *start,unsigned long size, +kasan_vmalloc_flags_t flags) { +/* +* Software KASAN modes unpoison both VM_ALLOC and non-VM_ALLOC +* mappings, so the KASAN_VMALLOC_VM_ALLOC flag is ignored. +* Software KASAN modes can't optimize zeroing memory by combining it +* with setting memory tags, so the KASAN_VMALLOC_INIT flag is ignored. +*/ +if (!is_vmalloc_or_module_addr (start))return (void *)start;
mm/vmalloc.c renamed from mm/vmalloc.c~kasan-vmalloc-add-vmalloc-tagging-for-hw_tags +40 -11
94 lines not on this page · raw message
_
Patches currently in -mm which might be from [email protected] are
stacktrace-add-interface-based-on-shadow-call-stack.patch arm64-scs-save-scs_sp-values-per-cpu-when-switching-stacks.patch arm64-implement-stack_trace_save_shadow.patch kasan-use-stack_trace_save_shadow.patch