riscv: extend execmem_params for generated code allocations
authorMike Rapoport (IBM) <rppt@kernel.org>
Sun, 5 May 2024 16:06:21 +0000 (19:06 +0300)
committerLuis Chamberlain <mcgrof@kernel.org>
Tue, 14 May 2024 07:31:43 +0000 (00:31 -0700)
The memory allocations for kprobes and BPF on RISC-V are not placed in
the modules area and these custom allocations are implemented with
overrides of alloc_insn_page() and  bpf_jit_alloc_exec().

Define MODULES_VADDR and MODULES_END as VMALLOC_START and VMALLOC_END for
32 bit and slightly reorder execmem_params initialization to support both
32 and 64 bit variants, define EXECMEM_KPROBES and EXECMEM_BPF ranges in
riscv::execmem_params and drop overrides of alloc_insn_page() and
bpf_jit_alloc_exec().

Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
arch/riscv/include/asm/pgtable.h
arch/riscv/kernel/module.c
arch/riscv/kernel/probes/kprobes.c
arch/riscv/net/bpf_jit_core.c

index 6afd6bb4882eb28d1f1e96e451c7c92c20a6d2cc..381137ce70d4f69d964c7bb55674c5bc48761f9c 100644 (file)
@@ -55,6 +55,9 @@
 #define MODULES_LOWEST_VADDR   (KERNEL_LINK_ADDR - SZ_2G)
 #define MODULES_VADDR          (PFN_ALIGN((unsigned long)&_end) - SZ_2G)
 #define MODULES_END            (PFN_ALIGN((unsigned long)&_start))
+#else
+#define MODULES_VADDR          VMALLOC_START
+#define MODULES_END            VMALLOC_END
 #endif
 
 /*
index 182904127ba06e083740a7c0dc58253186a5cbe5..0e6415f00fca1c6be729c09e5c7b7cb19cf64649 100644 (file)
@@ -906,7 +906,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
        return 0;
 }
 
-#if defined(CONFIG_MMU) && defined(CONFIG_64BIT)
+#ifdef CONFIG_MMU
 static struct execmem_info execmem_info __ro_after_init;
 
 struct execmem_info __init *execmem_arch_setup(void)
@@ -919,6 +919,18 @@ struct execmem_info __init *execmem_arch_setup(void)
                                .pgprot = PAGE_KERNEL,
                                .alignment = 1,
                        },
+                       [EXECMEM_KPROBES] = {
+                               .start  = VMALLOC_START,
+                               .end    = VMALLOC_END,
+                               .pgprot = PAGE_KERNEL_READ_EXEC,
+                               .alignment = 1,
+                       },
+                       [EXECMEM_BPF] = {
+                               .start  = BPF_JIT_REGION_START,
+                               .end    = BPF_JIT_REGION_END,
+                               .pgprot = PAGE_KERNEL,
+                               .alignment = PAGE_SIZE,
+                       },
                },
        };
 
index 2f08c14a933d05299a15677451d1ed28f81e304d..e64f2f3064eb38237b4b66e9c3d071c1bceb2cf9 100644 (file)
@@ -104,16 +104,6 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
        return 0;
 }
 
-#ifdef CONFIG_MMU
-void *alloc_insn_page(void)
-{
-       return  __vmalloc_node_range(PAGE_SIZE, 1, VMALLOC_START, VMALLOC_END,
-                                    GFP_KERNEL, PAGE_KERNEL_READ_EXEC,
-                                    VM_FLUSH_RESET_PERMS, NUMA_NO_NODE,
-                                    __builtin_return_address(0));
-}
-#endif
-
 /* install breakpoint in text */
 void __kprobes arch_arm_kprobe(struct kprobe *p)
 {
index 6b3acac30c06199480a8397b2f59886184e3d1c3..e238fdbd5dbc51c4b8eae65286b666ff6286b6db 100644 (file)
@@ -219,19 +219,6 @@ u64 bpf_jit_alloc_exec_limit(void)
        return BPF_JIT_REGION_SIZE;
 }
 
-void *bpf_jit_alloc_exec(unsigned long size)
-{
-       return __vmalloc_node_range(size, PAGE_SIZE, BPF_JIT_REGION_START,
-                                   BPF_JIT_REGION_END, GFP_KERNEL,
-                                   PAGE_KERNEL, 0, NUMA_NO_NODE,
-                                   __builtin_return_address(0));
-}
-
-void bpf_jit_free_exec(void *addr)
-{
-       return vfree(addr);
-}
-
 void *bpf_arch_text_copy(void *dst, void *src, size_t len)
 {
        int ret;