Skip to content

Commit 6f606ff

Browse files
Martin KaFai LauAlexei Starovoitov
authored andcommitted
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: Eduard Zingerman <[email protected]> Signed-off-by: Martin KaFai Lau <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent c6d9daf commit 6f606ff

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

include/linux/bpf_verifier.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
* (in the "-8,-16,...,-512" form)
2424
*/
2525
#define TMP_STR_BUF_LEN 320
26+
/* Patch buffer size */
27+
#define INSN_BUF_SIZE 16
2628

2729
/* Liveness marks, used for registers and spilled-regs (in stack slots).
2830
* Read marks propagate upwards until they find a write mark; they record that
@@ -780,6 +782,7 @@ struct bpf_verifier_env {
780782
* e.g., in reg_type_str() to generate reg_type string
781783
*/
782784
char tmp_str_buf[TMP_STR_BUF_LEN];
785+
struct bpf_insn insn_buf[INSN_BUF_SIZE];
783786
};
784787

785788
static inline struct bpf_func_info_aux *subprog_aux(struct bpf_verifier_env *env, int subprog)

kernel/bpf/verifier.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19677,7 +19677,8 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
1967719677
const struct bpf_verifier_ops *ops = env->ops;
1967819678
int i, cnt, size, ctx_field_size, delta = 0;
1967919679
const int insn_cnt = env->prog->len;
19680-
struct bpf_insn insn_buf[16], *insn;
19680+
struct bpf_insn *insn_buf = env->insn_buf;
19681+
struct bpf_insn *insn;
1968119682
u32 target_size, size_default, off;
1968219683
struct bpf_prog *new_prog;
1968319684
enum bpf_access_type type;
@@ -19690,7 +19691,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
1969019691
}
1969119692
cnt = ops->gen_prologue(insn_buf, env->seen_direct_write,
1969219693
env->prog);
19693-
if (cnt >= ARRAY_SIZE(insn_buf)) {
19694+
if (cnt >= INSN_BUF_SIZE) {
1969419695
verbose(env, "bpf verifier is misconfigured\n");
1969519696
return -EINVAL;
1969619697
} else if (cnt) {
@@ -19837,7 +19838,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
1983719838
target_size = 0;
1983819839
cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
1983919840
&target_size);
19840-
if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf) ||
19841+
if (cnt == 0 || cnt >= INSN_BUF_SIZE ||
1984119842
(ctx_field_size && !target_size)) {
1984219843
verbose(env, "bpf verifier is misconfigured\n");
1984319844
return -EINVAL;
@@ -19846,7 +19847,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
1984619847
if (is_narrower_load && size < target_size) {
1984719848
u8 shift = bpf_ctx_narrow_access_offset(
1984819849
off, size, size_default) * 8;
19849-
if (shift && cnt + 1 >= ARRAY_SIZE(insn_buf)) {
19850+
if (shift && cnt + 1 >= INSN_BUF_SIZE) {
1985019851
verbose(env, "bpf verifier narrow ctx load misconfigured\n");
1985119852
return -EINVAL;
1985219853
}
@@ -20391,7 +20392,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
2039120392
const int insn_cnt = prog->len;
2039220393
const struct bpf_map_ops *ops;
2039320394
struct bpf_insn_aux_data *aux;
20394-
struct bpf_insn insn_buf[16];
20395+
struct bpf_insn *insn_buf = env->insn_buf;
2039520396
struct bpf_prog *new_prog;
2039620397
struct bpf_map *map_ptr;
2039720398
int i, ret, cnt, delta = 0, cur_subprog = 0;
@@ -20510,7 +20511,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
2051020511
(BPF_MODE(insn->code) == BPF_ABS ||
2051120512
BPF_MODE(insn->code) == BPF_IND)) {
2051220513
cnt = env->ops->gen_ld_abs(insn, insn_buf);
20513-
if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf)) {
20514+
if (cnt == 0 || cnt >= INSN_BUF_SIZE) {
2051420515
verbose(env, "bpf verifier is misconfigured\n");
2051520516
return -EINVAL;
2051620517
}
@@ -20803,7 +20804,7 @@ static int do_misc_fixups(struct bpf_verifier_env *env)
2080320804
cnt = ops->map_gen_lookup(map_ptr, insn_buf);
2080420805
if (cnt == -EOPNOTSUPP)
2080520806
goto patch_map_ops_generic;
20806-
if (cnt <= 0 || cnt >= ARRAY_SIZE(insn_buf)) {
20807+
if (cnt <= 0 || cnt >= INSN_BUF_SIZE) {
2080720808
verbose(env, "bpf verifier is misconfigured\n");
2080820809
return -EINVAL;
2080920810
}

0 commit comments

Comments
 (0)