Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

execmem: don't remove ROX cache from the direct map

The memory allocated for the ROX cache was removed from the direct map to
reduce amount of direct map updates, however this cannot be tolerated by
/proc/kcore that accesses module memory using vread_iter() and the latter
does vmalloc_to_page() and copy_page_to_iter_nofault().

Instead of removing ROX cache memory from the direct map and mapping it as
ROX in vmalloc space, simply call set_memory_rox() that will take care of
proper permissions on both vmalloc and in the direct map.

Signed-off-by: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250126074733.1384926-5-rppt@kernel.org

authored by

Mike Rapoport (Microsoft) and committed by
Peter Zijlstra
925f4264 41d88484

+4 -13
+4 -13
mm/execmem.c
··· 257 257 static int execmem_cache_populate(struct execmem_range *range, size_t size) 258 258 { 259 259 unsigned long vm_flags = VM_ALLOW_HUGE_VMAP; 260 - unsigned long start, end; 261 260 struct vm_struct *vm; 262 261 size_t alloc_size; 263 262 int err = -ENOMEM; ··· 274 275 /* fill memory with instructions that will trap */ 275 276 execmem_fill_trapping_insns(p, alloc_size, /* writable = */ true); 276 277 277 - start = (unsigned long)p; 278 - end = start + alloc_size; 279 - 280 - vunmap_range(start, end); 281 - 282 - err = execmem_set_direct_map_valid(vm, false); 283 - if (err) 284 - goto err_free_mem; 285 - 286 - err = vmap_pages_range_noflush(start, end, range->pgprot, vm->pages, 287 - PMD_SHIFT); 278 + err = set_memory_rox((unsigned long)p, vm->nr_pages); 288 279 if (err) 289 280 goto err_free_mem; 290 281 291 282 err = execmem_cache_add(p, alloc_size); 292 283 if (err) 293 - goto err_free_mem; 284 + goto err_reset_direct_map; 294 285 295 286 return 0; 296 287 288 + err_reset_direct_map: 289 + execmem_set_direct_map_valid(vm, true); 297 290 err_free_mem: 298 291 vfree(p); 299 292 return err;