[PATCH] arm64: mte: Make mte_check_tfsr_*() conditional on KASAN instead of MTE

Alexandru Elisei alexandru.elisei at arm.com
Tue Jun 11 03:41:58 PDT 2024


Hi,

On Tue, May 28, 2024 at 03:51:30PM -0700, Peter Collingbourne wrote:
> The check in mte_check_tfsr_el1() is only necessary if HW tag
> based KASAN is enabled. However, we were also executing the check
> if MTE is enabled and KASAN is enabled at build time but disabled
> at runtime. This turned out to cause a measurable increase in
> power consumption on a specific microarchitecture after enabling
> MTE. Moreover, on the same system, an increase in invalid syscall
> latency (as measured by [1]) of around 20-30% (depending on the
> cluster) was observed after enabling MTE; this almost entirely goes
> away after removing this check. Therefore, make the check conditional
> on whether KASAN is enabled rather than on whether MTE is enabled.
> 
> [1] https://lore.kernel.org/all/CAMn1gO4MwRV8bmFJ_SeY5tsYNPn2ZP56LjAhafygjFaKuu5ouw@mail.gmail.com/
> 
> Signed-off-by: Peter Collingbourne <pcc at google.com>
> Link: https://linux-review.googlesource.com/id/I22d98d1483dd400a95595946552b769a5a1ad7bd
> ---
>  arch/arm64/include/asm/mte.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/mte.h b/arch/arm64/include/asm/mte.h
> index 91fbd5c8a3911..0f84518632b4a 100644
> --- a/arch/arm64/include/asm/mte.h
> +++ b/arch/arm64/include/asm/mte.h
> @@ -182,7 +182,7 @@ void mte_check_tfsr_el1(void);
>  
>  static inline void mte_check_tfsr_entry(void)
>  {
> -	if (!system_supports_mte())
> +	if (!kasan_hw_tags_enabled())
>  		return;
>  
>  	mte_check_tfsr_el1();
> @@ -190,7 +190,7 @@ static inline void mte_check_tfsr_entry(void)
>  
>  static inline void mte_check_tfsr_exit(void)
>  {
> -	if (!system_supports_mte())
> +	if (!kasan_hw_tags_enabled())
>  		return;

The change looks correct to me - tag check faults for the kernel are
enabled only when hw kasan is enabled. The functions are already compiled
only when CONFIG_KASAN_HW_TAGS=y, so it makes sense to further restrict
them based on kasan_hw_tags_enabled():

Reviewed-by: Alexandru Elisei <alexandru.elisei at arm.com>

Can't speak for the performance results, altough skipping the dsb + isb on
the exit path sure looks nice.

Thanks,
Alex

>  
>  	/*
> -- 
> 2.45.1.288.g0e0cd299f1-goog
> 



More information about the linux-arm-kernel mailing list