]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/8xx: Preallocate execmem page tables
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 20 Aug 2024 17:23:51 +0000 (19:23 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 30 Aug 2024 11:29:53 +0000 (21:29 +1000)
Preallocate execmem page tables before creating new PGDs so that
all PGD entries related to execmem can be copied in pgd_alloc().

On 8xx there are 32 Mbytes for execmem by default so this will use
32 kbytes.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/a7180cc1ba59dec4502af39b4e9f3ff91c57280d.1724173828.git.christophe.leroy@csgroup.eu
arch/powerpc/mm/mem.c

index d325217ab201214b2af406afe4fcb4701cb5f51a..7a5af64f165d66c4de05da48cf7d08296551f396 100644 (file)
@@ -412,6 +412,18 @@ EXPORT_SYMBOL_GPL(walk_system_ram_range);
 #ifdef CONFIG_EXECMEM
 static struct execmem_info execmem_info __ro_after_init;
 
+#ifdef CONFIG_PPC_8xx
+static void prealloc_execmem_pgtable(void)
+{
+       unsigned long va;
+
+       for (va = ALIGN_DOWN(MODULES_VADDR, PGDIR_SIZE); va < MODULES_END; va += PGDIR_SIZE)
+               pte_alloc_kernel(pmd_off_k(va), va);
+}
+#else
+static void prealloc_execmem_pgtable(void) { }
+#endif
+
 struct execmem_info __init *execmem_arch_setup(void)
 {
        pgprot_t kprobes_prot = strict_module_rwx_enabled() ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC;
@@ -443,6 +455,8 @@ struct execmem_info __init *execmem_arch_setup(void)
        end = VMALLOC_END;
 #endif
 
+       prealloc_execmem_pgtable();
+
        execmem_info = (struct execmem_info){
                .ranges = {
                        [EXECMEM_DEFAULT] = {