@@ -2182,6 +2182,25 @@ decay_va_pool_node(struct vmap_node *vn, bool full_decay)
21822182 reclaim_list_global (& decay_list );
21832183}
21842184
2185+ static void
2186+ kasan_release_vmalloc_node (struct vmap_node * vn )
2187+ {
2188+ struct vmap_area * va ;
2189+ unsigned long start , end ;
2190+
2191+ start = list_first_entry (& vn -> purge_list , struct vmap_area , list )-> va_start ;
2192+ end = list_last_entry (& vn -> purge_list , struct vmap_area , list )-> va_end ;
2193+
2194+ list_for_each_entry (va , & vn -> purge_list , list ) {
2195+ if (is_vmalloc_or_module_addr ((void * ) va -> va_start ))
2196+ kasan_release_vmalloc (va -> va_start , va -> va_end ,
2197+ va -> va_start , va -> va_end ,
2198+ KASAN_VMALLOC_PAGE_RANGE );
2199+ }
2200+
2201+ kasan_release_vmalloc (start , end , start , end , KASAN_VMALLOC_TLB_FLUSH );
2202+ }
2203+
21852204static void purge_vmap_node (struct work_struct * work )
21862205{
21872206 struct vmap_node * vn = container_of (work ,
@@ -2190,20 +2209,17 @@ static void purge_vmap_node(struct work_struct *work)
21902209 struct vmap_area * va , * n_va ;
21912210 LIST_HEAD (local_list );
21922211
2212+ if (IS_ENABLED (CONFIG_KASAN_VMALLOC ))
2213+ kasan_release_vmalloc_node (vn );
2214+
21932215 vn -> nr_purged = 0 ;
21942216
21952217 list_for_each_entry_safe (va , n_va , & vn -> purge_list , list ) {
21962218 unsigned long nr = va_size (va ) >> PAGE_SHIFT ;
2197- unsigned long orig_start = va -> va_start ;
2198- unsigned long orig_end = va -> va_end ;
21992219 unsigned int vn_id = decode_vn_id (va -> flags );
22002220
22012221 list_del_init (& va -> list );
22022222
2203- if (is_vmalloc_or_module_addr ((void * )orig_start ))
2204- kasan_release_vmalloc (orig_start , orig_end ,
2205- va -> va_start , va -> va_end );
2206-
22072223 nr_purged_pages += nr ;
22082224 vn -> nr_purged ++ ;
22092225
@@ -4784,7 +4800,8 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
47844800 & free_vmap_area_list );
47854801 if (va )
47864802 kasan_release_vmalloc (orig_start , orig_end ,
4787- va -> va_start , va -> va_end );
4803+ va -> va_start , va -> va_end ,
4804+ KASAN_VMALLOC_PAGE_RANGE | KASAN_VMALLOC_TLB_FLUSH );
47884805 vas [area ] = NULL ;
47894806 }
47904807
@@ -4834,7 +4851,8 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
48344851 & free_vmap_area_list );
48354852 if (va )
48364853 kasan_release_vmalloc (orig_start , orig_end ,
4837- va -> va_start , va -> va_end );
4854+ va -> va_start , va -> va_end ,
4855+ KASAN_VMALLOC_PAGE_RANGE | KASAN_VMALLOC_TLB_FLUSH );
48384856 vas [area ] = NULL ;
48394857 kfree (vms [area ]);
48404858 }
0 commit comments