]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: mm: Permit contiguous attribute for preliminary mappings
authorArd Biesheuvel <ardb@kernel.org>
Fri, 29 May 2026 15:01:59 +0000 (17:01 +0200)
committerWill Deacon <will@kernel.org>
Tue, 2 Jun 2026 15:29:15 +0000 (16:29 +0100)
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.

[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.

Reviewed-by: Kevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/mm/mmu.c

index 661ff3c1fe10caa6654fb89203a4532ec165ba76..ff9e74045308e969360290812f4fb1a1c6059877 100644 (file)
@@ -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);
 }