diff options
Diffstat (limited to 'kernel/bpf/core.c')
| -rw-r--r-- | kernel/bpf/core.c | 22 | 
1 files changed, 21 insertions, 1 deletions
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index b9f8686a84cf..51ec2dda7f08 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -767,6 +767,7 @@ noinline u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)  }  EXPORT_SYMBOL_GPL(__bpf_call_base); +#ifndef CONFIG_BPF_JIT_ALWAYS_ON  /**   *	__bpf_prog_run - run eBPF program on a given context   *	@ctx: is the data we are operating on @@ -1317,6 +1318,14 @@ EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384)  EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)  }; +#else +static unsigned int __bpf_prog_ret0(const void *ctx, +				    const struct bpf_insn *insn) +{ +	return 0; +} +#endif +  bool bpf_prog_array_compatible(struct bpf_array *array,  			       const struct bpf_prog *fp)  { @@ -1364,9 +1373,13 @@ static int bpf_check_tail_call(const struct bpf_prog *fp)   */  struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err)  { +#ifndef CONFIG_BPF_JIT_ALWAYS_ON  	u32 stack_depth = max_t(u32, fp->aux->stack_depth, 1);  	fp->bpf_func = interpreters[(round_up(stack_depth, 32) / 32) - 1]; +#else +	fp->bpf_func = __bpf_prog_ret0; +#endif  	/* eBPF JITs can rewrite the program in case constant  	 * blinding is active. However, in case of error during @@ -1376,6 +1389,12 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err)  	 */  	if (!bpf_prog_is_dev_bound(fp->aux)) {  		fp = bpf_int_jit_compile(fp); +#ifdef CONFIG_BPF_JIT_ALWAYS_ON +		if (!fp->jited) { +			*err = -ENOTSUPP; +			return fp; +		} +#endif  	} else {  		*err = bpf_prog_offload_compile(fp);  		if (*err) @@ -1447,7 +1466,8 @@ int bpf_prog_array_length(struct bpf_prog_array __rcu *progs)  	rcu_read_lock();  	prog = rcu_dereference(progs)->progs;  	for (; *prog; prog++) -		cnt++; +		if (*prog != &dummy_bpf_prog.prog) +			cnt++;  	rcu_read_unlock();  	return cnt;  }  |