On Mon, May 22 2023 at 19:21, Baoquan He wrote: > On 05/22/23 at 01:10am, Thomas Gleixner wrote: > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 5ca55b357148..4b11a32df49d 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -1728,6 +1728,7 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end) > unsigned int num_purged_areas = 0; > struct list_head local_purge_list; > struct vmap_area *va, *n_va; > + struct vmap_block vb; > > lockdep_assert_held(&vmap_purge_lock); > > @@ -1736,6 +1737,14 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end) > list_replace_init(&purge_vmap_area_list, &local_purge_list); > spin_unlock(&purge_vmap_area_lock); > > + vb = container_of(va, struct vmap_block, va); This cannot work vmap_area is not embedded in vmap_block. vmap_block::va is a pointer. vmap_area does not link back to vmap_block, so there is no way to find it based on a vmap_area. Aside of that va is not initialized here :)