On Fri, Mar 13, 2020 at 10:02 AM Martin KaFai Lau <kafai@xxxxxx> wrote: > > On Fri, Mar 13, 2020 at 12:54:41AM -0700, Andrii Nakryiko wrote: > > Add vmlinux.h generation to selftest/bpf's Makefile. Use it from newly added > > test_vmlinux to trace nanosleep syscall using 5 different types of programs: > > - tracepoint; > > - raw tracepoint; > > - raw tracepoint w/ direct memory reads (tp_btf); > > - kprobe; > > - fentry. > > > > These programs are realistic variants of real-life tracing programs, > > excercising vmlinux.h's usage with tracing applications. > > > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > > --- > [ ... ] > > > diff --git a/tools/testing/selftests/bpf/prog_tests/vmlinux.c b/tools/testing/selftests/bpf/prog_tests/vmlinux.c > > new file mode 100644 > > index 000000000000..04939eda1325 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/prog_tests/vmlinux.c > > @@ -0,0 +1,43 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* Copyright (c) 2020 Facebook */ > > + > > +#include <test_progs.h> > > +#include <time.h> > > +#include "test_vmlinux.skel.h" > > + > > +#define MY_TV_NSEC 1337 > > + > > +static void nsleep() > > +{ > > + struct timespec ts = { .tv_nsec = MY_TV_NSEC }; > > + > > + (void)nanosleep(&ts, NULL); > > +} > > + > > +void test_vmlinux(void) > > +{ > > + int duration = 0, err; > > + struct test_vmlinux* skel; > > + struct test_vmlinux__bss *bss; > > + > > + skel = test_vmlinux__open_and_load(); > > + if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) > > + return; > > + bss = skel->bss; > > + > > + err = test_vmlinux__attach(skel); > > + if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err)) > > + goto cleanup; > > + > > + /* trigger everything */ > > + nsleep(); > > + > > + CHECK(!bss->tp_called, "tp", "not called\n"); > > + CHECK(!bss->raw_tp_called, "raw_tp", "not called\n"); > > + CHECK(!bss->tp_btf_called, "tp_btf", "not called\n"); > > + CHECK(!bss->kprobe_called, "kprobe", "not called\n"); > > + CHECK(!bss->fentry_called, "fentry", "not called\n"); > > + > > +cleanup: > > + test_vmlinux__destroy(skel); > > +} > > diff --git a/tools/testing/selftests/bpf/progs/test_vmlinux.c b/tools/testing/selftests/bpf/progs/test_vmlinux.c > > new file mode 100644 > > index 000000000000..5cc2bf8011b0 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/progs/test_vmlinux.c > > @@ -0,0 +1,98 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* Copyright (c) 2020 Facebook */ > > + > > +#include "vmlinux.h" > > +#include <asm/unistd.h> > > +#include <bpf/bpf_helpers.h> > > +#include <bpf/bpf_tracing.h> > > +#include <bpf/bpf_core_read.h> > > + > > +#define MY_TV_NSEC 1337 > > + > > +bool tp_called = false; > > +bool raw_tp_called = false; > > +bool tp_btf_called = false; > > +bool kprobe_called = false; > > +bool fentry_called = false; > > + > > +SEC("tp/syscalls/sys_enter_nanosleep") > > +int handle__tp(struct trace_event_raw_sys_enter *args) > > +{ > > + struct __kernel_timespec *ts; > > + > > + if (args->id != __NR_nanosleep) > > + return 0; > > + > > + ts = (void *)args->args[0]; > > + if (BPF_CORE_READ(ts, tv_nsec) != MY_TV_NSEC) > > + return 0; > > + > > + tp_called = true; > > + return 0; > > +} > > + > > +static bool __always_inline handle_probed(struct pt_regs *regs, long id) > It is not used, may be removing it? > Oh, did I really leave it around?... Sigh, will post v2 without it. > > +{ > > + struct __kernel_timespec *ts; > > + > > + if (id != __NR_nanosleep) > > + return false; > > + > > + ts = (void *)PT_REGS_PARM1_CORE(regs); > > + if (BPF_CORE_READ(ts, tv_nsec) != MY_TV_NSEC) > > + return false; > > + > > + return true; > > +}