On 8/2/19 4:33 PM, Alexei Starovoitov wrote: > Add a test with multiple exit conditions. > It's not an infinite loop only when the verifier can properly track > all math on variable 'i' through all possible ways of executing this loop. Agreed with motivation of this test. > > barrier()s are needed to disable llvm optimization that combines multiple > branches into fewer branches. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > --- > .../bpf/prog_tests/bpf_verif_scale.c | 1 + > tools/testing/selftests/bpf/progs/loop5.c | 37 +++++++++++++++++++ > 2 files changed, 38 insertions(+) > create mode 100644 tools/testing/selftests/bpf/progs/loop5.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c b/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c > index 757e39540eda..29615a4a9362 100644 > --- a/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c > +++ b/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c > @@ -72,6 +72,7 @@ void test_bpf_verif_scale(void) > { "loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, > { "loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, > { "loop4.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, > + { "loop5.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, More like a BPF_PROG_TYPE_SCHED_CLS type although probably it does not matter as we did not attach it to anywhere? > > /* partial unroll. 19k insn in a loop. > * Total program size 20.8k insn. > diff --git a/tools/testing/selftests/bpf/progs/loop5.c b/tools/testing/selftests/bpf/progs/loop5.c > new file mode 100644 > index 000000000000..9d9817efe208 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/loop5.c > @@ -0,0 +1,37 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// Copyright (c) 2019 Facebook > +#include <linux/sched.h> > +#include <linux/ptrace.h> The above headers probably not needed. > +#include <stdint.h> > +#include <stddef.h> > +#include <stdbool.h> > +#include <linux/bpf.h> > +#include "bpf_helpers.h" > +#define barrier() __asm__ __volatile__("": : :"memory") > + > +char _license[] SEC("license") = "GPL"; > + > +SEC("socket") > +int while_true(volatile struct __sk_buff* skb) > +{ > + int i = 0; > + > + while (true) { > + if (skb->len) > + i += 3; > + else > + i += 7; > + if (i == 9) > + break; > + barrier(); > + if (i == 10) > + break; > + barrier(); > + if (i == 13) > + break; > + barrier(); > + if (i == 14) > + break; > + } > + return i; > +} >