The patch titled Subject: revert kasan-remove-kfence-leftovers has been added to the -mm tree. Its filename is kfence-kasan-make-kfence-compatible-with-kasan-fix.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/kfence-kasan-make-kfence-compatible-with-kasan-fix.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/kfence-kasan-make-kfence-compatible-with-kasan-fix.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Subject: revert kasan-remove-kfence-leftovers Signed-off-by: Marco Elver <elver@xxxxxxxxxx> Signed-off-by: Alexander Potapenko <glider@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/kasan/kasan.h | 9 +++++++++ mm/kasan/shadow.c | 13 +++++++++++++ 2 files changed, 22 insertions(+) --- a/mm/kasan/kasan.h~kfence-kasan-make-kfence-compatible-with-kasan-fix +++ a/mm/kasan/kasan.h @@ -3,6 +3,7 @@ #define __MM_KASAN_KASAN_H #include <linux/kasan.h> +#include <linux/kfence.h> #include <linux/stackdepot.h> #ifdef CONFIG_KASAN_HW_TAGS @@ -304,12 +305,20 @@ static inline u8 random_tag(void) { retu static inline void poison_range(const void *address, size_t size, u8 value) { + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + hw_set_mem_tag_range(kasan_reset_tag(address), round_up(size, KASAN_GRANULE_SIZE), value); } static inline void unpoison_range(const void *address, size_t size) { + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + hw_set_mem_tag_range(kasan_reset_tag(address), round_up(size, KASAN_GRANULE_SIZE), get_tag(address)); } --- a/mm/kasan/shadow.c~kfence-kasan-make-kfence-compatible-with-kasan-fix +++ a/mm/kasan/shadow.c @@ -13,6 +13,7 @@ #include <linux/init.h> #include <linux/kasan.h> #include <linux/kernel.h> +#include <linux/kfence.h> #include <linux/kmemleak.h> #include <linux/memory.h> #include <linux/mm.h> @@ -84,6 +85,10 @@ void poison_range(const void *address, s address = kasan_reset_tag(address); size = round_up(size, KASAN_GRANULE_SIZE); + /* Skip KFENCE memory if called explicitly outside of sl*b. */ + if (is_kfence_address(address)) + return; + shadow_start = kasan_mem_to_shadow(address); shadow_end = kasan_mem_to_shadow(address + size); @@ -101,6 +106,14 @@ void unpoison_range(const void *address, */ address = kasan_reset_tag(address); + /* + * Skip KFENCE memory if called explicitly outside of sl*b. Also note + * that calls to ksize(), where size is not a multiple of machine-word + * size, would otherwise poison the invalid portion of the word. + */ + if (is_kfence_address(address)) + return; + poison_range(address, size, tag); if (size & KASAN_GRANULE_MASK) { _ Patches currently in -mm which might be from akpm@xxxxxxxxxxxxxxxxxxxx are kasan-remove-kfence-leftovers.patch mm.patch mm-fix-initialization-of-struct-page-for-holes-in-memory-layout-checkpatch-fixes.patch mm-vmstat-fix-proc-sys-vm-stat_refresh-generating-false-warnings-fix-2.patch kfence-kasan-make-kfence-compatible-with-kasan-fix.patch linux-next-rejects.patch kmap-stupid-hacks-to-make-it-compile.patch set_memory-allow-set_direct_map__noflush-for-multiple-pages-fix.patch arch-mm-wire-up-memfd_secret-system-call-were-relevant-fix.patch kernel-forkc-export-kernel_thread-to-modules.patch