|
@@ -300,6 +300,11 @@ struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_BPF_JIT
|
|
|
+/* 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;
|
|
|
+
|
|
|
static __always_inline void
|
|
|
bpf_get_prog_addr_region(const struct bpf_prog *prog,
|
|
|
unsigned long *symbol_start,
|
|
@@ -381,8 +386,6 @@ static DEFINE_SPINLOCK(bpf_lock);
|
|
|
static LIST_HEAD(bpf_kallsyms);
|
|
|
static struct latch_tree_root bpf_tree __cacheline_aligned;
|
|
|
|
|
|
-int bpf_jit_kallsyms __read_mostly;
|
|
|
-
|
|
|
static void bpf_prog_ksym_node_add(struct bpf_prog_aux *aux)
|
|
|
{
|
|
|
WARN_ON_ONCE(!list_empty(&aux->ksym_lnode));
|
|
@@ -563,8 +566,6 @@ void __weak bpf_jit_free(struct bpf_prog *fp)
|
|
|
bpf_prog_unlock_free(fp);
|
|
|
}
|
|
|
|
|
|
-int bpf_jit_harden __read_mostly;
|
|
|
-
|
|
|
static int bpf_jit_blind_insn(const struct bpf_insn *from,
|
|
|
const struct bpf_insn *aux,
|
|
|
struct bpf_insn *to_buff)
|
|
@@ -1379,9 +1380,13 @@ void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
-static unsigned int __bpf_prog_ret0(const void *ctx,
|
|
|
- const struct bpf_insn *insn)
|
|
|
+static unsigned int __bpf_prog_ret0_warn(const void *ctx,
|
|
|
+ const struct bpf_insn *insn)
|
|
|
{
|
|
|
+ /* If this handler ever gets executed, then BPF_JIT_ALWAYS_ON
|
|
|
+ * is not working properly, so warn about it!
|
|
|
+ */
|
|
|
+ WARN_ON_ONCE(1);
|
|
|
return 0;
|
|
|
}
|
|
|
#endif
|
|
@@ -1441,7 +1446,7 @@ struct bpf_prog *bpf_prog_select_runtime(struct bpf_prog *fp, int *err)
|
|
|
|
|
|
fp->bpf_func = interpreters[(round_up(stack_depth, 32) / 32) - 1];
|
|
|
#else
|
|
|
- fp->bpf_func = __bpf_prog_ret0;
|
|
|
+ fp->bpf_func = __bpf_prog_ret0_warn;
|
|
|
#endif
|
|
|
|
|
|
/* eBPF JITs can rewrite the program in case constant
|