On 26/05/2026 19:58, Ard Biesheuvel wrote: > From: Ard Biesheuvel <[email protected]> > > There are a few cases where we omit the contiguous hint for mappings > that start out as read-write and are remapped read-only later, on the > basis that manipulating live descriptors with the PTE_CONT attribute set > is unsafe. When support for the contiguous hint was added to the code, > the ARM ARM was ambiguous about this, and so we erred on the side of > caution. > > In the meantime, this has been clarified [0], and regions that will be > remapped in their entirety, retaining the contiguous bit on all entries, > can use the contiguous hint both in the initial mapping as well as the > one that replaces it. Note that this requires that the logic that may be > called to remap overlapping regions respects existing valid descriptors > that have the contiguous bit cleared. > > So omit the NO_CONT_MAPPINGS flag in places where it is unneeded. > > Thanks to Ryan for the reference. > > [0] RJQQTC > > For a TLB lookup in a contiguous region mapped by translation table entries > that > have consistent values for the Contiguous bit, but have the OA, attributes, or > permissions misprogrammed, that TLB lookup is permitted to produce an OA, > access > permissions, and memory attributes that are consistent with any one of the > programmed translation table values. > > Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Kevin Brodsky <[email protected]> > --- > arch/arm64/mm/mmu.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c > index 55bb40348a47..04cc579c7a15 100644 > --- a/arch/arm64/mm/mmu.c > +++ b/arch/arm64/mm/mmu.c > @@ -1016,8 +1016,7 @@ void __init create_mapping_noalloc(phys_addr_t phys, > unsigned long virt, > &phys, virt); > return; > } > - early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, > - NO_CONT_MAPPINGS); > + early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, 0); > } > > void __init create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys, > @@ -1044,8 +1043,7 @@ static void update_mapping_prot(phys_addr_t phys, > unsigned long virt, > return; > } > > - early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, > - NO_CONT_MAPPINGS); > + early_create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, 0); > > /* flush the TLBs after updating live kernel mappings */ > flush_tlb_kernel_range(virt, virt + size); > @@ -1191,10 +1189,8 @@ static void __init map_mem(void) > * alternative patching has completed). This makes the contents > * of the region accessible to subsystems such as hibernate, > * but protects it from inadvertent modification or execution. > - * Note that contiguous mappings cannot be remapped in this way, > - * so we should avoid them here. > */ > - __map_memblock(kernel_start, kernel_end, PAGE_KERNEL, NO_CONT_MAPPINGS); > + __map_memblock(kernel_start, kernel_end, PAGE_KERNEL, 0); > memblock_clear_nomap(kernel_start, kernel_end - kernel_start); > } >

