Skip to content

Commit c67ddf5

Browse files
covanampalmer-dabbelt
authored andcommitted
riscv: force PAGE_SIZE linear mapping if debug_pagealloc is enabled
debug_pagealloc is a debug feature which clears the valid bit in page table entry for freed pages to detect illegal accesses to freed memory. For this feature to work, virtual mapping must have PAGE_SIZE resolution. (No, we cannot map with huge pages and split them only when needed; because pages can be allocated/freed in atomic context and page splitting cannot be done in atomic context) Force linear mapping to use small pages if debug_pagealloc is enabled. Note that it is not necessary to force the entire linear mapping, but only those that are given to memory allocator. Some parts of memory can keep using huge page mapping (for example, kernel's executable code). But these parts are minority, so keep it simple. This is just a debug feature, some extra overhead should be acceptable. Fixes: 5fde3db ("riscv: add ARCH_SUPPORTS_DEBUG_PAGEALLOC support") Signed-off-by: Nam Cao <[email protected]> Cc: [email protected] Reviewed-by: Alexandre Ghiti <[email protected]> Link: https://lore.kernel.org/r/2e391fa6c6f9b3fcf1b41cefbace02ee4ab4bf59.1715750938.git.namcao@linutronix.de Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 4cece76 commit c67ddf5

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

arch/riscv/mm/init.c

+3
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,9 @@ void __init create_pgd_mapping(pgd_t *pgdp,
668668
static uintptr_t __init best_map_size(phys_addr_t pa, uintptr_t va,
669669
phys_addr_t size)
670670
{
671+
if (debug_pagealloc_enabled())
672+
return PAGE_SIZE;
673+
671674
if (pgtable_l5_enabled &&
672675
!(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= P4D_SIZE)
673676
return P4D_SIZE;

0 commit comments

Comments
 (0)