mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
UPSTREAM: 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: Mike Rapoport <rppt@linux.ibm.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20220921074841.382615-1-rppt@kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit b9dd04a20f)
Bug: 284812202
Change-Id: Ie87b2184b5aac2c34a05dd9b832b937786e367ff
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
committed by
Suren Baghdasaryan
parent
b39c28c44c
commit
e6ffb329ee
@@ -528,7 +528,7 @@ static void __init map_mem(pgd_t *pgdp)
|
|||||||
*/
|
*/
|
||||||
BUILD_BUG_ON(pgd_index(direct_map_end - 1) == pgd_index(direct_map_end));
|
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;
|
flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1552,11 +1552,7 @@ int arch_add_memory(int nid, u64 start, u64 size,
|
|||||||
|
|
||||||
VM_BUG_ON(!mhp_range_allowed(start, size, true));
|
VM_BUG_ON(!mhp_range_allowed(start, size, true));
|
||||||
|
|
||||||
/*
|
if (can_set_direct_map())
|
||||||
* 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))
|
|
||||||
flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
|
flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
|
||||||
|
|
||||||
__create_pgd_mapping(swapper_pg_dir, start, __phys_to_virt(start),
|
__create_pgd_mapping(swapper_pg_dir, start, __phys_to_virt(start),
|
||||||
|
|||||||
@@ -21,7 +21,13 @@ bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED
|
|||||||
|
|
||||||
bool can_set_direct_map(void)
|
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)
|
static int change_page_range(pte_t *ptep, unsigned long addr, void *data)
|
||||||
|
|||||||
Reference in New Issue
Block a user