Qian Cai <cai@xxxxxx> writes: > On Thu, 2019-10-31 at 20:39 +1100, Daniel Axtens wrote: >> /* >> * In this function, newly allocated vm_struct has VM_UNINITIALIZED >> * flag. It means that vm_struct is not fully initialized. >> @@ -3377,6 +3411,9 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, >> >> setup_vmalloc_vm_locked(vms[area], vas[area], VM_ALLOC, >> pcpu_get_vm_areas); >> + >> + /* assume success here */ >> + kasan_populate_vmalloc(sizes[area], vms[area]); >> } >> spin_unlock(&vmap_area_lock); > > Here it is all wrong. GFP_KERNEL with in_atomic(). I think this fix will work, I will do a v12 with it included. diff --git a/mm/vmalloc.c b/mm/vmalloc.c index a4b950a02d0b..bf030516258c 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3417,11 +3417,14 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets, setup_vmalloc_vm_locked(vms[area], vas[area], VM_ALLOC, pcpu_get_vm_areas); + } + spin_unlock(&vmap_area_lock); + /* populate the shadow space outside of the lock */ + for (area = 0; area < nr_vms; area++) { /* assume success here */ kasan_populate_vmalloc(sizes[area], vms[area]); } - spin_unlock(&vmap_area_lock); kfree(vas); return vms;