|
|
@@ -366,13 +366,11 @@ void bpf_prog_kallsyms_del_all(struct bpf_prog *fp)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_BPF_JIT
|
|
|
-# define BPF_JIT_LIMIT_DEFAULT (PAGE_SIZE * 40000)
|
|
|
-
|
|
|
/* All BPF JIT sysctl knobs here. */
|
|
|
int bpf_jit_enable __read_mostly = IS_BUILTIN(CONFIG_BPF_JIT_ALWAYS_ON);
|
|
|
int bpf_jit_harden __read_mostly;
|
|
|
int bpf_jit_kallsyms __read_mostly;
|
|
|
-int bpf_jit_limit __read_mostly = BPF_JIT_LIMIT_DEFAULT;
|
|
|
+long bpf_jit_limit __read_mostly;
|
|
|
|
|
|
static __always_inline void
|
|
|
bpf_get_prog_addr_region(const struct bpf_prog *prog,
|
|
|
@@ -583,16 +581,27 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
|
|
|
|
|
|
static atomic_long_t bpf_jit_current;
|
|
|
|
|
|
+/* Can be overridden by an arch's JIT compiler if it has a custom,
|
|
|
+ * dedicated BPF backend memory area, or if neither of the two
|
|
|
+ * below apply.
|
|
|
+ */
|
|
|
+u64 __weak bpf_jit_alloc_exec_limit(void)
|
|
|
+{
|
|
|
#if defined(MODULES_VADDR)
|
|
|
+ return MODULES_END - MODULES_VADDR;
|
|
|
+#else
|
|
|
+ return VMALLOC_END - VMALLOC_START;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static int __init bpf_jit_charge_init(void)
|
|
|
{
|
|
|
/* Only used as heuristic here to derive limit. */
|
|
|
- bpf_jit_limit = min_t(u64, round_up((MODULES_END - MODULES_VADDR) >> 2,
|
|
|
- PAGE_SIZE), INT_MAX);
|
|
|
+ bpf_jit_limit = min_t(u64, round_up(bpf_jit_alloc_exec_limit() >> 2,
|
|
|
+ PAGE_SIZE), LONG_MAX);
|
|
|
return 0;
|
|
|
}
|
|
|
pure_initcall(bpf_jit_charge_init);
|
|
|
-#endif
|
|
|
|
|
|
static int bpf_jit_charge_modmem(u32 pages)
|
|
|
{
|