[RFC PATCH 6/7] kasan: allow arches to hook into global registration

Daniel Axtens dja at axtens.net
Thu May 23 16:59:47 AEST 2019


Christophe Leroy <christophe.leroy at c-s.fr> writes:

> Le 23/05/2019 à 07:21, Daniel Axtens a écrit :
>> Not all arches have a specific space carved out for modules -
>> some, such as powerpc, just use regular vmalloc space. Therefore,
>> globals in these modules cannot be backed by real shadow memory.
>
> Can you explain in more details the reason why ?

At this point, purely simplicity. As you discuss below, it's possible to
do better.

>
> PPC32 also uses regular vmalloc space, and it has been possible to 
> manage globals on it, by simply implementing a module_alloc() function.
>
> See 
> https://elixir.bootlin.com/linux/v5.2-rc1/source/arch/powerpc/mm/kasan/kasan_init_32.c#L135
>
> It is also possible to easily define a different area for modules, by 
> replacing the call to vmalloc_exec() by a call to __vmalloc_node_range() 
> as done by vmalloc_exec(), but with different bounds than 
> VMALLOC_START/VMALLOC_END
>
> See https://elixir.bootlin.com/linux/v5.2-rc1/source/mm/vmalloc.c#L2633
>
> Today in PPC64 (unlike PPC32), there is already a split between VMALLOC 
> space and IOREMAP space. I'm sure it would be easy to split it once more 
> for modules.
>

OK, good to know, I'll look into one of those approaches for the next
spin!

Regards,
Daniel


> Christophe
>
>> 
>> In order to allow arches to perform this check, add a hook.
>> 
>> Signed-off-by: Daniel Axtens <dja at axtens.net>
>> ---
>>   include/linux/kasan.h | 5 +++++
>>   mm/kasan/generic.c    | 3 +++
>>   2 files changed, 8 insertions(+)
>> 
>> diff --git a/include/linux/kasan.h b/include/linux/kasan.h
>> index dfee2b42d799..4752749e4797 100644
>> --- a/include/linux/kasan.h
>> +++ b/include/linux/kasan.h
>> @@ -18,6 +18,11 @@ struct task_struct;
>>   static inline bool kasan_arch_is_ready(void)	{ return true; }
>>   #endif
>>   
>> +#ifndef kasan_arch_can_register_global
>> +static inline bool kasan_arch_can_register_global(const void * addr)	{ return true; }
>> +#endif
>> +
>> +
>>   #ifndef ARCH_HAS_KASAN_EARLY_SHADOW
>>   extern unsigned char kasan_early_shadow_page[PAGE_SIZE];
>>   extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE];
>> diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
>> index 0336f31bbae3..935b06f659a0 100644
>> --- a/mm/kasan/generic.c
>> +++ b/mm/kasan/generic.c
>> @@ -208,6 +208,9 @@ static void register_global(struct kasan_global *global)
>>   {
>>   	size_t aligned_size = round_up(global->size, KASAN_SHADOW_SCALE_SIZE);
>>   
>> +	if (!kasan_arch_can_register_global(global->beg))
>> +		return;
>> +
>>   	kasan_unpoison_shadow(global->beg, global->size);
>>   
>>   	kasan_poison_shadow(global->beg + aligned_size,
>> 


More information about the Linuxppc-dev mailing list