Re: [PATCH v3 1/3] vmalloc: add __GFP_SKIP_KASAN support

From: Dev Jain

Date: Sun Apr 26 2026 - 23:35:29 EST




On 25/04/26 12:02 am, Catalin Marinas wrote:
> On Fri, Apr 24, 2026 at 06:31:55PM +0530, Dev Jain wrote:
>> From: Muhammad Usama Anjum <usama.anjum@xxxxxxx>
>>
>> For allocations that will be accessed only with match-all pointers
>> (e.g., kernel stacks), setting tags is wasted work. If the caller
>> already set __GFP_SKIP_KASAN, skip tag setting of vmalloc pages.
>>
>> Before this patch, __GFP_SKIP_KASAN wasn't being used with vmalloc
>> APIs. So it wasn't being checked. Now its being checked and acted
>> upon. Other KASAN modes are unchanged because __GFP_SKIP_KASAN isn't
>> defined there.
>>
>> This is a preparatory patch for optimizing kernel stack allocations.
>>
>> Co-developed-by: Ryan Roberts <ryan.roberts@xxxxxxx>
>> Co-developed-by: Dev Jain <dev.jain@xxxxxxx>
>> Signed-off-by: Muhammad Usama Anjum <usama.anjum@xxxxxxx>
>
> Co-developers need to sign off as well. See submitting-patches.rst. Same
> comment about your SoB as on patch 3.

oops I forgot, I'll do that.
>
>> ---
>> mm/vmalloc.c | 20 +++++++++++++++++---
>> 1 file changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
>> index b31b208f6ecb3..c94fcb2725b6b 100644
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -3939,7 +3939,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
>> __GFP_NOFAIL | __GFP_ZERO |\
>> __GFP_NORETRY | __GFP_RETRY_MAYFAIL |\
>> GFP_NOFS | GFP_NOIO | GFP_KERNEL_ACCOUNT |\
>> - GFP_USER | __GFP_NOLOCKDEP)
>> + GFP_USER | __GFP_NOLOCKDEP | __GFP_SKIP_KASAN)
>>
>> static gfp_t vmalloc_fix_flags(gfp_t flags)
>> {
>> @@ -3980,6 +3980,9 @@ static gfp_t vmalloc_fix_flags(gfp_t flags)
>> *
>> * %__GFP_NOWARN can be used to suppress failure messages.
>> *
>> + * %__GFP_SKIP_KASAN can be used to skip unpoisoning of mapped pages
>> + * (when prot=%PAGE_KERNEL).
>> + *
>> * Can not be called from interrupt nor NMI contexts.
>> * Return: the address of the area or %NULL on failure
>> */
>> @@ -3993,6 +3996,10 @@ void *__vmalloc_node_range_noprof(unsigned long size, unsigned long align,
>> kasan_vmalloc_flags_t kasan_flags = KASAN_VMALLOC_NONE;
>> unsigned long original_align = align;
>> unsigned int shift = PAGE_SHIFT;
>> + bool skip_vmalloc_kasan = gfp_mask & __GFP_SKIP_KASAN;
>> +
>> + /* Don't skip metadata kasan unpoisoning */
>> + gfp_mask &= ~__GFP_SKIP_KASAN;
>>
>> if (WARN_ON_ONCE(!size))
>> return NULL;
>> @@ -4041,7 +4048,7 @@ void *__vmalloc_node_range_noprof(unsigned long size, unsigned long align,
>> * kasan_unpoison_vmalloc().
>> */
>> if (pgprot_val(prot) == pgprot_val(PAGE_KERNEL)) {
>> - if (kasan_hw_tags_enabled()) {
>> + if (kasan_hw_tags_enabled() && !skip_vmalloc_kasan) {
>> /*
>> * Modify protection bits to allow tagging.
>> * This must be done before mapping.
>> @@ -4054,6 +4061,12 @@ void *__vmalloc_node_range_noprof(unsigned long size, unsigned long align,
>> * poisoned and zeroed by kasan_unpoison_vmalloc().
>> */
>> gfp_mask |= __GFP_SKIP_KASAN | __GFP_SKIP_ZERO;
>> + } else if (skip_vmalloc_kasan) {
>> + /*
>> + * Skip page_alloc unpoisoning physical pages backing
>> + * VM_ALLOC mapping, as requested by caller.
>> + */
>> + gfp_mask |= __GFP_SKIP_KASAN;
>> }
>
> This playing around with some of the GFP flags meant for metadata and
> the actual page allocation gets confusing. You remove __GFP_SKIP_KASAN
> early from gfp_mask, add it back here. You might as well just remove it
> when calling __get_vm_area_node() and we won't have to figure out why
> it's added back above.

Okay I'll do this.
>
> The __GFP_SKIP_ZERO flag is meant for the page allocator and used in
> this function later to actually tell kasan to initialise the memory (not
> skip this). __GFP_SKIP_KASAN, OTOH, is used to actually tell both
> vmalloc() and the underlying page allocator to avoid tagging. I wonder
> whether it would be better to have a VM_SKIP_KASAN flag instead and
> leave the GFP flags alone.

Lemme reply on the other reply

>