diff options
Diffstat (limited to 'kernel/bpf/core.c')
| -rw-r--r-- | kernel/bpf/core.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index b1a3545d0ec8..b2890c268cb3 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -365,13 +365,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, @@ -580,16 +578,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)  {  | 
