[PATCH 09/24] kasan: rework hw_{force=>flush}_async_tag_fault()

From: Pierre-Clément Tosi

Date: Sat Nov 07 2026 - 11:41:14 EST


Separate common arch-agnostic KASAN policy (fault reporting) from arch
HW details (fault flushing) by reworking the function's signature.

Update its only definition (in arm64) accordingly.

This resolves #include challenges arising from the circular dependency:

mte_check_tfsr_exit() ==> kasan_report_async()
kasan_report_async() ==> <linux/kasan.h>
<linux/kasan.h> ==> hw_force_async_tag_fault()
hw_force_async_tag_fault() ==> arch_force_async_tag_fault()
arch_force_async_tag_fault() ==> mte_check_tfsr_exit()

Cc: Alexander Potapenko <glider@xxxxxxxxxx>
Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: Andrey Konovalov <andreyknvl@xxxxxxxxx>
Cc: Andrey Ryabinin <ryabinin.a.a@xxxxxxxxx>
Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
Cc: kasan-dev@xxxxxxxxxxxxxxxx
Cc: linux-mm@xxxxxxxxx
Signed-off-by: Pierre-Clément Tosi <ptosi@xxxxxxxxxx>
---
arch/arm64/include/asm/memory.h | 2 +-
mm/kasan/hw_tags.c | 3 ++-
mm/kasan/kasan.h | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h
index a2b7a33966ff..8e751b56d20c 100644
--- a/arch/arm64/include/asm/memory.h
+++ b/arch/arm64/include/asm/memory.h
@@ -316,7 +316,7 @@ static inline const void *__tag_set(const void *addr, u8 tag)
#define arch_enable_tag_checks_write_only() mte_enable_kernel_store_only()
#define arch_suppress_tag_checks_start() mte_enable_tco()
#define arch_suppress_tag_checks_stop() mte_disable_tco()
-#define arch_force_async_tag_fault() mte_check_tfsr_exit()
+#define arch_flush_async_tag_fault() mte_get_reset_tfsr()
#define arch_get_random_tag() mte_get_random_tag()
#define arch_get_mem_tag(addr) mte_get_mem_tag(addr)
#define arch_set_mem_tag_range(addr, size, tag, init) \
diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c
index a848eb2f9910..c4772eebb80d 100644
--- a/mm/kasan/hw_tags.c
+++ b/mm/kasan/hw_tags.c
@@ -428,7 +428,8 @@ EXPORT_SYMBOL_IF_KUNIT(kasan_enable_hw_tags);

VISIBLE_IF_KUNIT void kasan_force_async_fault(void)
{
- hw_force_async_tag_fault();
+ if (hw_flush_async_tag_fault())
+ kasan_report_async();
}
EXPORT_SYMBOL_IF_KUNIT(kasan_force_async_fault);

diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index fc9169a54766..be5dcf6b052c 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -431,7 +431,7 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag)
#define hw_enable_tag_checks_asymm() arch_enable_tag_checks_asymm()
#define hw_suppress_tag_checks_start() arch_suppress_tag_checks_start()
#define hw_suppress_tag_checks_stop() arch_suppress_tag_checks_stop()
-#define hw_force_async_tag_fault() arch_force_async_tag_fault()
+#define hw_flush_async_tag_fault() arch_flush_async_tag_fault()
#define hw_enable_tag_checks_write_only() arch_enable_tag_checks_write_only()
#define hw_get_random_tag() arch_get_random_tag()
#define hw_get_mem_tag(addr) arch_get_mem_tag(addr)

--
2.56.0.455.g6c5a503b38-goog