On 2025-12-04 at 01:43:36 +0100, Andrey Konovalov wrote:
On Wed, Dec 3, 2025 at 5:24 PM Maciej Wieczór-Retman m.wieczorretman@pm.me wrote:
I was sure the vms[0]->addr was already tagged (I recall checking this so I'm not sure if something changed or my previous check was wrong) but the problem here is that vms[0]->addr, vms[1]->addr ... were unpoisoned with random addresses, specifically different random addresses. So then later in the pcpu chunk code vms[1] related pointers would get the tag from vms[0]->addr.
So I think we still need a separate way to do __kasan_unpoison_vmalloc with a specific tag.
Why?
Assuming KASAN_VMALLOC_KEEP_TAG takes the tag from the pointer, just do:
tag = kasan_random_tag(); for (area = 0; ...) { vms[area]->addr = set_tag(vms[area]->addr, tag); __kasan_unpoison_vmalloc(vms[area]->addr, vms[area]->size, flags | KASAN_VMALLOC_KEEP_TAG); }
Or maybe even better:
vms[0]->addr = __kasan_unpoison_vmalloc(vms[0]->addr, vms[0]->size, flags); tag = get_tag(vms[0]->addr); for (area = 1; ...) { vms[area]->addr = set_tag(vms[area]->addr, tag); __kasan_unpoison_vmalloc(vms[area]->addr, vms[area]->size, flags | KASAN_VMALLOC_KEEP_TAG); }
This way we won't assign a random tag unless it's actually needed (i.e. when KASAN_VMALLOC_PROT_NORMAL is not provided; assuming we care to support that case).
Oh, right yes, that would work nicely. I thought putting these behind helpers would end up clean but this is very neat too.
I suppose I'll wait for Jiayuan to update his patch and then I'll make these changes on top of that.
Thanks! :)