Commit b9dd04a2 authored by Mike Rapoport's avatar Mike Rapoport Committed by Catalin Marinas
Browse files

arm64/mm: fold check for KFENCE into can_set_direct_map()



KFENCE requires linear map to be mapped at page granularity, so that it
is possible to protect/unprotect single pages, just like with
rodata_full and DEBUG_PAGEALLOC.

Instead of repating

	can_set_direct_map() || IS_ENABLED(CONFIG_KFENCE)

make can_set_direct_map() handle the KFENCE case.

This also prevents potential false positives in kernel_page_present()
that may return true for non-present page if CONFIG_KFENCE is enabled.

Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Reviewed-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20220921074841.382615-1-rppt@kernel.org


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 2305b809
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -535,7 +535,7 @@ static void __init map_mem(pgd_t *pgdp)
	 */
	BUILD_BUG_ON(pgd_index(direct_map_end - 1) == pgd_index(direct_map_end));

	if (can_set_direct_map() || IS_ENABLED(CONFIG_KFENCE))
	if (can_set_direct_map())
		flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;

	/*
@@ -1542,11 +1542,7 @@ int arch_add_memory(int nid, u64 start, u64 size,

	VM_BUG_ON(!mhp_range_allowed(start, size, true));

	/*
	 * KFENCE requires linear map to be mapped at page granularity, so that
	 * it is possible to protect/unprotect single pages in the KFENCE pool.
	 */
	if (can_set_direct_map() || IS_ENABLED(CONFIG_KFENCE))
	if (can_set_direct_map())
		flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;

	__create_pgd_mapping(swapper_pg_dir, start, __phys_to_virt(start),
+7 −1
Original line number Diff line number Diff line
@@ -21,7 +21,13 @@ bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED

bool can_set_direct_map(void)
{
	return rodata_full || debug_pagealloc_enabled();
	/*
	 * rodata_full, DEBUG_PAGEALLOC and KFENCE require linear map to be
	 * mapped at page granularity, so that it is possible to
	 * protect/unprotect single pages.
	 */
	return rodata_full || debug_pagealloc_enabled() ||
		IS_ENABLED(CONFIG_KFENCE);
}

static int change_page_range(pte_t *ptep, unsigned long addr, void *data)