diff options
Diffstat (limited to 'kernel/bpf/core.c')
-rw-r--r-- | kernel/bpf/core.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 86b50aa26ee8..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) | |||
767 | } | 767 | } |
768 | EXPORT_SYMBOL_GPL(__bpf_call_base); | 768 | EXPORT_SYMBOL_GPL(__bpf_call_base); |
769 | 769 | ||
770 | #ifndef CONFIG_BPF_JIT_ALWAYS_ON | ||
770 | /** | 771 | /** |
771 | * __bpf_prog_run - run eBPF program on a given context | 772 | * __bpf_prog_run - run eBPF program on a given context |
772 | * @ctx: is the data we are operating on | 773 | * @ctx: is the data we are operating on |
@@ -1317,6 +1318,14 @@ EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384) | |||
1317 | EVAL4(PROG_NAME_LIST, 416, 448, 480, 512) | 1318 | EVAL4(PROG_NAME_LIST, 416, 448, 480, 512) |
1318 | }; | 1319 | }; |
1319 | 1320 | ||
1321 | #else | ||
1322 | static unsigned int __bpf_prog_ret0(const void *ctx, | ||
1323 | const struct bpf_insn *insn) | ||
1324 | { | ||
1325 | return 0; | ||
1326 | } | ||
1327 | #endif | ||
1328 | |||
1320 | bool bpf_prog_array_compatible(struct bpf_array *array, | 1329 | bool bpf_prog_array_compatible(struct bpf_array *array, |
1321 | const struct bpf_prog *fp) | 1330 | const struct bpf_prog *fp) |
1322 | { | 1331 | { |
@@ -1364,9 +1373,13 @@ static int bpf_check_tail_call(const struct bpf_prog *fp) | |||
1364 | */ | 1373 | */ |
1365 | struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err) | 1374 | struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err) |
1366 | { | 1375 | { |
1376 | #ifndef CONFIG_BPF_JIT_ALWAYS_ON | ||
1367 | u32 stack_depth = max_t(u32, fp->aux->stack_depth, 1); | 1377 | u32 stack_depth = max_t(u32, fp->aux->stack_depth, 1); |
1368 | 1378 | ||
1369 | fp->bpf_func = interpreters[(round_up(stack_depth, 32) / 32) - 1]; | 1379 | fp->bpf_func = interpreters[(round_up(stack_depth, 32) / 32) - 1]; |
1380 | #else | ||
1381 | fp->bpf_func = __bpf_prog_ret0; | ||
1382 | #endif | ||
1370 | 1383 | ||
1371 | /* eBPF JITs can rewrite the program in case constant | 1384 | /* eBPF JITs can rewrite the program in case constant |
1372 | * blinding is active. However, in case of error during | 1385 | * 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) | |||
1376 | */ | 1389 | */ |
1377 | if (!bpf_prog_is_dev_bound(fp->aux)) { | 1390 | if (!bpf_prog_is_dev_bound(fp->aux)) { |
1378 | fp = bpf_int_jit_compile(fp); | 1391 | fp = bpf_int_jit_compile(fp); |
1392 | #ifdef CONFIG_BPF_JIT_ALWAYS_ON | ||
1393 | if (!fp->jited) { | ||
1394 | *err = -ENOTSUPP; | ||
1395 | return fp; | ||
1396 | } | ||
1397 | #endif | ||
1379 | } else { | 1398 | } else { |
1380 | *err = bpf_prog_offload_compile(fp); | 1399 | *err = bpf_prog_offload_compile(fp); |
1381 | if (*err) | 1400 | if (*err) |