[RFC PATCH 3/7] kasan: allow architectures to provide an outline readiness check

Christophe Leroy christophe.leroy at c-s.fr
Thu May 23 16:14:00 AEST 2019



Le 23/05/2019 à 07:21, Daniel Axtens a écrit :
> In powerpc (as I understand it), we spend a lot of time in boot
> running in real mode before MMU paging is initialised. During
> this time we call a lot of generic code, including printk(). If
> we try to access the shadow region during this time, things fail.
> 
> My attempts to move early init before the first printk have not
> been successful. (Both previous RFCs for ppc64 - by 2 different
> people - have needed this trick too!)

I have been able to do it successfully for BOOK3E/64, see 
https://patchwork.ozlabs.org/patch/1068260/ for the details.

Christophe

> 
> So, allow architectures to define a kasan_arch_is_ready()
> hook that bails out of check_memory_region_inline() unless the
> arch has done all of the init.
> 
> Link: https://lore.kernel.org/patchwork/patch/592820/ # ppc64 hash series
> Link: https://patchwork.ozlabs.org/patch/795211/      # ppc radix series
> Originally-by: Balbir Singh <bsingharora at gmail.com>
> Cc: Aneesh Kumar K.V <aneesh.kumar at linux.vnet.ibm.com>
> Signed-off-by: Daniel Axtens <dja at axtens.net>
> [check_return_arch_not_ready() ==> static inline kasan_arch_is_ready()]
> Signed-off-by: Christophe Leroy <christophe.leroy at c-s.fr>
> ---
>   include/linux/kasan.h | 4 ++++
>   mm/kasan/generic.c    | 3 +++
>   2 files changed, 7 insertions(+)
> 
> diff --git a/include/linux/kasan.h b/include/linux/kasan.h
> index f6261840f94c..a630d53f1a36 100644
> --- a/include/linux/kasan.h
> +++ b/include/linux/kasan.h
> @@ -14,6 +14,10 @@ struct task_struct;
>   #include <asm/kasan.h>
>   #include <asm/pgtable.h>
>   
> +#ifndef kasan_arch_is_ready
> +static inline bool kasan_arch_is_ready(void)	{ return true; }
> +#endif
> +
>   extern unsigned char kasan_early_shadow_page[PAGE_SIZE];
>   extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE];
>   extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD];
> diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
> index a5b28e3ceacb..0336f31bbae3 100644
> --- a/mm/kasan/generic.c
> +++ b/mm/kasan/generic.c
> @@ -170,6 +170,9 @@ static __always_inline void check_memory_region_inline(unsigned long addr,
>   						size_t size, bool write,
>   						unsigned long ret_ip)
>   {
> +	if (!kasan_arch_is_ready())
> +		return;
> +
>   	if (unlikely(size == 0))
>   		return;
>   
> 


More information about the Linuxppc-dev mailing list