Song Liu wrote: > This test uses bpf_get_branch_snapshot from a fexit program. The test uses > a target function (bpf_testmod_loop_test) and compares the record against > kallsyms. If there isn't enough record matching kallsyms, the test fails. > > Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > Signed-off-by: Song Liu <songliubraving@xxxxxx> > --- > .../selftests/bpf/bpf_testmod/bpf_testmod.c | 19 +++- > .../selftests/bpf/prog_tests/core_reloc.c | 14 +-- > .../bpf/prog_tests/get_branch_snapshot.c | 100 ++++++++++++++++++ > .../selftests/bpf/prog_tests/module_attach.c | 39 ------- > .../selftests/bpf/progs/get_branch_snapshot.c | 40 +++++++ > tools/testing/selftests/bpf/test_progs.c | 39 +++++++ > tools/testing/selftests/bpf/test_progs.h | 2 + > tools/testing/selftests/bpf/trace_helpers.c | 37 +++++++ > tools/testing/selftests/bpf/trace_helpers.h | 5 + > 9 files changed, 243 insertions(+), 52 deletions(-) > create mode 100644 tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c > create mode 100644 tools/testing/selftests/bpf/progs/get_branch_snapshot.c > [...] > diff --git a/tools/testing/selftests/bpf/progs/get_branch_snapshot.c b/tools/testing/selftests/bpf/progs/get_branch_snapshot.c > new file mode 100644 > index 0000000000000..a1b139888048c > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/get_branch_snapshot.c > @@ -0,0 +1,40 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2021 Facebook */ > +#include "vmlinux.h" > +#include <bpf/bpf_helpers.h> > +#include <bpf/bpf_tracing.h> > + > +char _license[] SEC("license") = "GPL"; > + > +__u64 test1_hits = 0; > +__u64 address_low = 0; > +__u64 address_high = 0; > +int wasted_entries = 0; > +long total_entries = 0; > + > +#define ENTRY_CNT 32 > +struct perf_branch_entry entries[ENTRY_CNT] = {}; It looks like perf_branch_entry has never changed, but it could grow? Then size check in helper would fail. I'm not sure its worth it, but this could be done with CO-RE so the size is correct even if the struct grows. > + > +static inline bool in_range(__u64 val) > +{ > + return (val >= address_low) && (val < address_high); > +} > + > +SEC("fexit/bpf_testmod_loop_test") > +int BPF_PROG(test1, int n, int ret) > +{ > + long i; > + > + total_entries = bpf_get_branch_snapshot(entries, sizeof(entries), 0); > + total_entries /= sizeof(struct perf_branch_entry); > + > + for (i = 0; i < ENTRY_CNT; i++) { > + if (i >= total_entries) > + break; > + if (in_range(entries[i].from) && in_range(entries[i].to)) > + test1_hits++; > + else if (!test1_hits) > + wasted_entries++; > + } > + return 0; > +} Other than small comment LGTM. Acked-by: John Fastabend <john.fastabend@xxxxxxxxx>