On Fri, Aug 23, 2019 at 2:59 AM Alexei Starovoitov <ast@xxxxxxxxxx> wrote: > > Introduce BPF_F_TEST_STATE_FREQ flag to stress test parentage chain > and state pruning. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> Acked-by: Song Liu <songliubraving@xxxxxx> > --- > include/linux/bpf_verifier.h | 1 + > include/uapi/linux/bpf.h | 3 +++ > kernel/bpf/syscall.c | 1 + > kernel/bpf/verifier.c | 5 ++++- > 4 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h > index 5fe99f322b1c..26a6d58ca78c 100644 > --- a/include/linux/bpf_verifier.h > +++ b/include/linux/bpf_verifier.h > @@ -355,6 +355,7 @@ struct bpf_verifier_env { > struct bpf_verifier_stack_elem *head; /* stack of verifier states to be processed */ > int stack_size; /* number of states to be processed */ > bool strict_alignment; /* perform strict pointer alignment checks */ > + bool test_state_freq; /* test verifier with different pruning frequency */ > struct bpf_verifier_state *cur_state; /* current verifier state */ > struct bpf_verifier_state_list **explored_states; /* search pruning optimization */ > struct bpf_verifier_state_list *free_list; > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index b5889257cc33..5d2fb183ee2d 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -285,6 +285,9 @@ enum bpf_attach_type { > */ > #define BPF_F_TEST_RND_HI32 (1U << 2) > > +/* The verifier internal test flag. Behavior is undefined */ > +#define BPF_F_TEST_STATE_FREQ (1U << 3) > + > /* When BPF ldimm64's insn[0].src_reg != 0 then this can have > * two extensions: > * > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index c0f62fd67c6b..ca60eafa6922 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -1629,6 +1629,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) > > if (attr->prog_flags & ~(BPF_F_STRICT_ALIGNMENT | > BPF_F_ANY_ALIGNMENT | > + BPF_F_TEST_STATE_FREQ | > BPF_F_TEST_RND_HI32)) > return -EINVAL; > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > index 16d66bd7af09..3fb50757e812 100644 > --- a/kernel/bpf/verifier.c > +++ b/kernel/bpf/verifier.c > @@ -7223,7 +7223,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx) > struct bpf_verifier_state_list *sl, **pprev; > struct bpf_verifier_state *cur = env->cur_state, *new; > int i, j, err, states_cnt = 0; > - bool add_new_state = false; > + bool add_new_state = env->test_state_freq ? true : false; > > cur->last_insn_idx = env->prev_insn_idx; > if (!env->insn_aux_data[insn_idx].prune_point) > @@ -9263,6 +9263,9 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, > > env->allow_ptr_leaks = is_priv; > > + if (is_priv) > + env->test_state_freq = attr->prog_flags & BPF_F_TEST_STATE_FREQ; > + > ret = replace_map_fd_with_map_ptr(env); > if (ret < 0) > goto skip_full_check; > -- > 2.20.0 >