Commit 6f606ffd authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov

bpf: Move insn_buf[16] to bpf_verifier_env

This patch moves the 'struct bpf_insn insn_buf[16]' stack usage
to the bpf_verifier_env. A '#define INSN_BUF_SIZE 16' is also added
to replace the ARRAY_SIZE(insn_buf) usages.

Both convert_ctx_accesses() and do_misc_fixup() are changed
to use the env->insn_buf.

It is a refactoring work for adding the epilogue_buf[16] in a later patch.

With this patch, the stack size usage decreased.

Before:
./kernel/bpf/verifier.c:22133:5: warning: stack frame size (2584)

After:
./kernel/bpf/verifier.c:22184:5: warning: stack frame size (2264)
Reviewed-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20240829210833.388152-2-martin.lau@linux.devSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent c6d9dafb
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
* (in the "-8,-16,...,-512" form) * (in the "-8,-16,...,-512" form)
*/ */
#define TMP_STR_BUF_LEN 320 #define TMP_STR_BUF_LEN 320
/* Patch buffer size */
#define INSN_BUF_SIZE 16
/* Liveness marks, used for registers and spilled-regs (in stack slots). /* Liveness marks, used for registers and spilled-regs (in stack slots).
* Read marks propagate upwards until they find a write mark; they record that * Read marks propagate upwards until they find a write mark; they record that
...@@ -780,6 +782,7 @@ struct bpf_verifier_env { ...@@ -780,6 +782,7 @@ struct bpf_verifier_env {
* e.g., in reg_type_str() to generate reg_type string * e.g., in reg_type_str() to generate reg_type string
*/ */
char tmp_str_buf[TMP_STR_BUF_LEN]; char tmp_str_buf[TMP_STR_BUF_LEN];
struct bpf_insn insn_buf[INSN_BUF_SIZE];
}; };
static inline struct bpf_func_info_aux *subprog_aux(struct bpf_verifier_env *env, int subprog) static inline struct bpf_func_info_aux *subprog_aux(struct bpf_verifier_env *env, int subprog)
......
...@@ -19677,7 +19677,8 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) ...@@ -19677,7 +19677,8 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
const struct bpf_verifier_ops *ops = env->ops; const struct bpf_verifier_ops *ops = env->ops;
int i, cnt, size, ctx_field_size, delta = 0; int i, cnt, size, ctx_field_size, delta = 0;
const int insn_cnt = env->prog->len; const int insn_cnt = env->prog->len;
struct bpf_insn insn_buf[16], *insn; struct bpf_insn *insn_buf = env->insn_buf;
struct bpf_insn *insn;
u32 target_size, size_default, off; u32 target_size, size_default, off;
struct bpf_prog *new_prog; struct bpf_prog *new_prog;
enum bpf_access_type type; enum bpf_access_type type;
...@@ -19690,7 +19691,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) ...@@ -19690,7 +19691,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
} }
cnt = ops->gen_prologue(insn_buf, env->seen_direct_write, cnt = ops->gen_prologue(insn_buf, env->seen_direct_write,
env->prog); env->prog);
if (cnt >= ARRAY_SIZE(insn_buf)) { if (cnt >= INSN_BUF_SIZE) {
verbose(env, "bpf verifier is misconfigured\n"); verbose(env, "bpf verifier is misconfigured\n");
return -EINVAL; return -EINVAL;
} else if (cnt) { } else if (cnt) {
...@@ -19837,7 +19838,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) ...@@ -19837,7 +19838,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
target_size = 0; target_size = 0;
cnt = convert_ctx_access(type, insn, insn_buf, env->prog, cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
&target_size); &target_size);
if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf) || if (cnt == 0 || cnt >= INSN_BUF_SIZE ||
(ctx_field_size && !target_size)) { (ctx_field_size && !target_size)) {
verbose(env, "bpf verifier is misconfigured\n"); verbose(env, "bpf verifier is misconfigured\n");
return -EINVAL; return -EINVAL;
...@@ -19846,7 +19847,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env) ...@@ -19846,7 +19847,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
if (is_narrower_load && size < target_size) { if (is_narrower_load && size < target_size) {
u8 shift = bpf_ctx_narrow_access_offset( u8 shift = bpf_ctx_narrow_access_offset(
off, size, size_default) * 8; off, size, size_default) * 8;
if (shift && cnt + 1 >= ARRAY_SIZE(insn_buf)) { if (shift && cnt + 1 >= INSN_BUF_SIZE) {
verbose(env, "bpf verifier narrow ctx load misconfigured\n"); verbose(env, "bpf verifier narrow ctx load misconfigured\n");
return -EINVAL; return -EINVAL;
} }
...@@ -20391,7 +20392,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env) ...@@ -20391,7 +20392,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
const int insn_cnt = prog->len; const int insn_cnt = prog->len;
const struct bpf_map_ops *ops; const struct bpf_map_ops *ops;
struct bpf_insn_aux_data *aux; struct bpf_insn_aux_data *aux;
struct bpf_insn insn_buf[16]; struct bpf_insn *insn_buf = env->insn_buf;
struct bpf_prog *new_prog; struct bpf_prog *new_prog;
struct bpf_map *map_ptr; struct bpf_map *map_ptr;
int i, ret, cnt, delta = 0, cur_subprog = 0; int i, ret, cnt, delta = 0, cur_subprog = 0;
...@@ -20510,7 +20511,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env) ...@@ -20510,7 +20511,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
(BPF_MODE(insn->code) == BPF_ABS || (BPF_MODE(insn->code) == BPF_ABS ||
BPF_MODE(insn->code) == BPF_IND)) { BPF_MODE(insn->code) == BPF_IND)) {
cnt = env->ops->gen_ld_abs(insn, insn_buf); cnt = env->ops->gen_ld_abs(insn, insn_buf);
if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf)) { if (cnt == 0 || cnt >= INSN_BUF_SIZE) {
verbose(env, "bpf verifier is misconfigured\n"); verbose(env, "bpf verifier is misconfigured\n");
return -EINVAL; return -EINVAL;
} }
...@@ -20803,7 +20804,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env) ...@@ -20803,7 +20804,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
cnt = ops->map_gen_lookup(map_ptr, insn_buf); cnt = ops->map_gen_lookup(map_ptr, insn_buf);
if (cnt == -EOPNOTSUPP) if (cnt == -EOPNOTSUPP)
goto patch_map_ops_generic; goto patch_map_ops_generic;
if (cnt <= 0 || cnt >= ARRAY_SIZE(insn_buf)) { if (cnt <= 0 || cnt >= INSN_BUF_SIZE) {
verbose(env, "bpf verifier is misconfigured\n"); verbose(env, "bpf verifier is misconfigured\n");
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment