@@ -2182,6 +2182,25 @@ decay_va_pool_node(struct vmap_node *vn, bool full_decay)
2182
2182
reclaim_list_global (& decay_list );
2183
2183
}
2184
2184
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
+
2185
2204
static void purge_vmap_node (struct work_struct * work )
2186
2205
{
2187
2206
struct vmap_node * vn = container_of (work ,
@@ -2190,20 +2209,17 @@ static void purge_vmap_node(struct work_struct *work)
2190
2209
struct vmap_area * va , * n_va ;
2191
2210
LIST_HEAD (local_list );
2192
2211
2212
+ if (IS_ENABLED (CONFIG_KASAN_VMALLOC ))
2213
+ kasan_release_vmalloc_node (vn );
2214
+
2193
2215
vn -> nr_purged = 0 ;
2194
2216
2195
2217
list_for_each_entry_safe (va , n_va , & vn -> purge_list , list ) {
2196
2218
unsigned long nr = va_size (va ) >> PAGE_SHIFT ;
2197
- unsigned long orig_start = va -> va_start ;
2198
- unsigned long orig_end = va -> va_end ;
2199
2219
unsigned int vn_id = decode_vn_id (va -> flags );
2200
2220
2201
2221
list_del_init (& va -> list );
2202
2222
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
-
2207
2223
nr_purged_pages += nr ;
2208
2224
vn -> nr_purged ++ ;
2209
2225
@@ -4784,7 +4800,8 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
4784
4800
& free_vmap_area_list );
4785
4801
if (va )
4786
4802
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 );
4788
4805
vas [area ] = NULL ;
4789
4806
}
4790
4807
@@ -4834,7 +4851,8 @@ struct vm_struct **pcpu_get_vm_areas(const unsigned long *offsets,
4834
4851
& free_vmap_area_list );
4835
4852
if (va )
4836
4853
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 );
4838
4856
vas [area ] = NULL ;
4839
4857
kfree (vms [area ]);
4840
4858
}
0 commit comments