On Thu, 3 Dec 2020 08:29:43 +0200 Mike Rapoport <rppt@xxxxxxxxxx> wrote: > From: Mike Rapoport <rppt@xxxxxxxxxxxxx> > > On arm64, set_direct_map_*() functions may return 0 without actually > changing the linear map. This behaviour can be controlled using kernel > parameters, so we need a way to determine at runtime whether calls to > set_direct_map_invalid_noflush() and set_direct_map_default_noflush() have > any effect. > > Extend set_memory API with can_set_direct_map() function that allows > checking if calling set_direct_map_*() will actually change the page table, > replace several occurrences of open coded checks in arm64 with the new > function and provide a generic stub for architectures that always modify > page tables upon calls to set_direct_map APIs. > > ... > > --- a/arch/arm64/mm/mmu.c > +++ b/arch/arm64/mm/mmu.c > @@ -22,6 +22,7 @@ > #include <linux/io.h> > #include <linux/mm.h> > #include <linux/vmalloc.h> > +#include <linux/set_memory.h> > > #include <asm/barrier.h> > #include <asm/cputype.h> > @@ -477,7 +478,7 @@ static void __init map_mem(pgd_t *pgdp) > int flags = 0; > u64 i; > > - if (rodata_full || debug_pagealloc_enabled()) > + if (can_set_direct_map()) > flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS; Changes in -next turned this into if (can_set_direct_map() || crash_mem_map)