mem = (void *)addr;
        }
 
-       mem = kasan_unpoison_vmalloc(mem, size);
-
        if (vmap_pages_range(addr, addr + size, PAGE_KERNEL,
                                pages, PAGE_SHIFT) < 0) {
                vm_unmap_ram(mem, count);
                return NULL;
        }
 
+       /* Mark the pages as accessible, now that they are mapped. */
+       mem = kasan_unpoison_vmalloc(mem, size);
+
        return mem;
 }
 EXPORT_SYMBOL(vm_map_ram);
 
        setup_vmalloc_vm(area, va, flags, caller);
 
-       area->addr = kasan_unpoison_vmalloc(area->addr, requested_size);
+       /*
+        * Mark pages for non-VM_ALLOC mappings as accessible. Do it now as a
+        * best-effort approach, as they can be mapped outside of vmalloc code.
+        * For VM_ALLOC mappings, the pages are marked as accessible after
+        * getting mapped in __vmalloc_node_range().
+        */
+       if (!(flags & VM_ALLOC))
+               area->addr = kasan_unpoison_vmalloc(area->addr, requested_size);
 
        return area;
 }
                        const void *caller)
 {
        struct vm_struct *area;
-       void *addr;
+       void *ret;
        unsigned long real_size = size;
        unsigned long real_align = align;
        unsigned int shift = PAGE_SHIFT;
                prot = arch_vmap_pgprot_tagged(prot);
 
        /* Allocate physical pages and map them into vmalloc space. */
-       addr = __vmalloc_area_node(area, gfp_mask, prot, shift, node);
-       if (!addr)
+       ret = __vmalloc_area_node(area, gfp_mask, prot, shift, node);
+       if (!ret)
                goto fail;
 
+       /* Mark the pages as accessible, now that they are mapped. */
+       area->addr = kasan_unpoison_vmalloc(area->addr, real_size);
+
        /*
         * In this function, newly allocated vm_struct has VM_UNINITIALIZED
         * flag. It means that vm_struct is not fully initialized.
        if (!(vm_flags & VM_DEFER_KMEMLEAK))
                kmemleak_vmalloc(area, size, gfp_mask);
 
-       return addr;
+       return area->addr;
 
 fail:
        if (shift > PAGE_SHIFT) {
        }
        spin_unlock(&vmap_area_lock);
 
-       /* mark allocated areas as accessible */
+       /*
+        * Mark allocated areas as accessible. Do it now as a best-effort
+        * approach, as they can be mapped outside of vmalloc code.
+        */
        for (area = 0; area < nr_vms; area++)
                vms[area]->addr = kasan_unpoison_vmalloc(vms[area]->addr,
                                                         vms[area]->size);