]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
arm64/bpf: Remove 128MB limit for BPF JIT programs
authorRussell King <russell.king@oracle.com>
Fri, 5 Nov 2021 16:50:45 +0000 (16:50 +0000)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 8 Nov 2021 21:16:26 +0000 (22:16 +0100)
Commit 91fc957c9b1d ("arm64/bpf: don't allocate BPF JIT programs in module
memory") restricts BPF JIT program allocation to a 128MB region to ensure
BPF programs are still in branching range of each other. However this
restriction should not apply to the aarch64 JIT, since BPF_JMP | BPF_CALL
are implemented as a 64-bit move into a register and then a BLR instruction -
which has the effect of being able to call anything without proximity
limitation.

The practical reason to relax this restriction on JIT memory is that 128MB of
JIT memory can be quickly exhausted, especially where PAGE_SIZE is 64KB - one
page is needed per program. In cases where seccomp filters are applied to
multiple VMs on VM launch - such filters are classic BPF but converted to
BPF - this can severely limit the number of VMs that can be launched. In a
world where we support BPF JIT always on, turning off the JIT isn't always an
option either.

Fixes: 91fc957c9b1d ("arm64/bpf: don't allocate BPF JIT programs in module memory")
Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Russell King <russell.king@oracle.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: Alan Maguire <alan.maguire@oracle.com>
Link: https://lore.kernel.org/bpf/1636131046-5982-2-git-send-email-alan.maguire@oracle.com
arch/arm64/include/asm/extable.h
arch/arm64/include/asm/memory.h
arch/arm64/kernel/traps.c
arch/arm64/mm/ptdump.c
arch/arm64/net/bpf_jit_comp.c

index 8b300dd28defd84820b76ae70f7d1b5490051ffc..72b0e71cc3de88bbc3673d19feeb56e924ae2069 100644 (file)
@@ -33,15 +33,6 @@ do {                                                 \
        (b)->data = (tmp).data;                         \
 } while (0)
 
-static inline bool in_bpf_jit(struct pt_regs *regs)
-{
-       if (!IS_ENABLED(CONFIG_BPF_JIT))
-               return false;
-
-       return regs->pc >= BPF_JIT_REGION_START &&
-              regs->pc < BPF_JIT_REGION_END;
-}
-
 #ifdef CONFIG_BPF_JIT
 bool ex_handler_bpf(const struct exception_table_entry *ex,
                    struct pt_regs *regs);
index 1b9a1e2426127329778ae42570676fb13b588c9e..0af70d9abede3d9d65163101da185b4f9d749fa8 100644 (file)
 #define _PAGE_OFFSET(va)       (-(UL(1) << (va)))
 #define PAGE_OFFSET            (_PAGE_OFFSET(VA_BITS))
 #define KIMAGE_VADDR           (MODULES_END)
-#define BPF_JIT_REGION_START   (_PAGE_END(VA_BITS_MIN))
-#define BPF_JIT_REGION_SIZE    (SZ_128M)
-#define BPF_JIT_REGION_END     (BPF_JIT_REGION_START + BPF_JIT_REGION_SIZE)
 #define MODULES_END            (MODULES_VADDR + MODULES_VSIZE)
-#define MODULES_VADDR          (BPF_JIT_REGION_END)
+#define MODULES_VADDR          (_PAGE_END(VA_BITS_MIN))
 #define MODULES_VSIZE          (SZ_128M)
 #define VMEMMAP_START          (-(UL(1) << (VA_BITS - VMEMMAP_SHIFT)))
 #define VMEMMAP_END            (VMEMMAP_START + VMEMMAP_SIZE)
index 7b21213a570fc3b0a05299ac657c8978d725d7a6..e8986e6067a9158141acb44ff488eff08929e705 100644 (file)
@@ -994,7 +994,7 @@ static struct break_hook bug_break_hook = {
 static int reserved_fault_handler(struct pt_regs *regs, unsigned int esr)
 {
        pr_err("%s generated an invalid instruction at %pS!\n",
-               in_bpf_jit(regs) ? "BPF JIT" : "Kernel text patching",
+               "Kernel text patching",
                (void *)instruction_pointer(regs));
 
        /* We cannot handle this */
index 1c403536c9bb0390d5b762bc9ebcea6c7f0f5a97..9bc4066c5bf33a72401905790277fc5aa78900bc 100644 (file)
@@ -41,8 +41,6 @@ static struct addr_marker address_markers[] = {
        { 0 /* KASAN_SHADOW_START */,   "Kasan shadow start" },
        { KASAN_SHADOW_END,             "Kasan shadow end" },
 #endif
-       { BPF_JIT_REGION_START,         "BPF start" },
-       { BPF_JIT_REGION_END,           "BPF end" },
        { MODULES_VADDR,                "Modules start" },
        { MODULES_END,                  "Modules end" },
        { VMALLOC_START,                "vmalloc() area" },
index 3a8a7140a9bfbdb5ec11dfcd96fc30772c206ed9..86c9dc0681cce2fda9abdb80f17e1f8b8f187712 100644 (file)
@@ -1141,15 +1141,12 @@ out:
 
 u64 bpf_jit_alloc_exec_limit(void)
 {
-       return BPF_JIT_REGION_SIZE;
+       return VMALLOC_END - VMALLOC_START;
 }
 
 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));
+       return vmalloc(size);
 }
 
 void bpf_jit_free_exec(void *addr)