On Thu, Apr 22, 2021 at 5:26 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > bpf_prog_type_syscall is a program that creates a bpf map, > updates it, and loads another bpf program using bpf_sys_bpf() helper. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > --- > tools/testing/selftests/bpf/Makefile | 1 + > .../selftests/bpf/prog_tests/syscall.c | 53 ++++++++++++++ > tools/testing/selftests/bpf/progs/syscall.c | 73 +++++++++++++++++++ > 3 files changed, 127 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/syscall.c > create mode 100644 tools/testing/selftests/bpf/progs/syscall.c > > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile > index c5bcdb3d4b12..9fdfdbc61857 100644 > --- a/tools/testing/selftests/bpf/Makefile > +++ b/tools/testing/selftests/bpf/Makefile > @@ -278,6 +278,7 @@ MENDIAN=$(if $(IS_LITTLE_ENDIAN),-mlittle-endian,-mbig-endian) > CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG)) > BPF_CFLAGS = -g -D__TARGET_ARCH_$(SRCARCH) $(MENDIAN) \ > -I$(INCLUDE_DIR) -I$(CURDIR) -I$(APIDIR) \ > + -I$(TOOLSINCDIR) \ is this for filter.h? also, please align \ with the previous line > -I$(abspath $(OUTPUT)/../usr/include) > > CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ > diff --git a/tools/testing/selftests/bpf/prog_tests/syscall.c b/tools/testing/selftests/bpf/prog_tests/syscall.c > new file mode 100644 > index 000000000000..e550e36bb5da > --- /dev/null > +++ b/tools/testing/selftests/bpf/prog_tests/syscall.c > @@ -0,0 +1,53 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2021 Facebook */ > +#include <test_progs.h> > +#include "syscall.skel.h" > + > +struct args { > + __u64 log_buf; > + __u32 log_size; > + int max_entries; > + int map_fd; > + int prog_fd; > +}; > + > +void test_syscall(void) > +{ > + static char verifier_log[8192]; > + struct args ctx = { > + .max_entries = 1024, > + .log_buf = (uintptr_t) verifier_log, > + .log_size = sizeof(verifier_log), > + }; > + struct bpf_prog_test_run_attr tattr = { > + .ctx_in = &ctx, > + .ctx_size_in = sizeof(ctx), > + }; > + struct syscall *skel = NULL; > + __u64 key = 12, value = 0; > + __u32 duration = 0; > + int err; > + > + skel = syscall__open_and_load(); > + if (CHECK(!skel, "skel_load", "syscall skeleton failed\n")) > + goto cleanup; > + > + tattr.prog_fd = bpf_program__fd(skel->progs.bpf_prog); > + err = bpf_prog_test_run_xattr(&tattr); > + if (CHECK(err || tattr.retval != 1, "test_run sys_bpf", > + "err %d errno %d retval %d duration %d\n", > + err, errno, tattr.retval, tattr.duration)) > + goto cleanup; > + > + CHECK(ctx.map_fd <= 0, "map_fd", "fd = %d\n", ctx.map_fd); > + CHECK(ctx.prog_fd <= 0, "prog_fd", "fd = %d\n", ctx.prog_fd); please use ASSERT_xxx() macros everywhere. I've just added ASSERT_GT(), so once that patch set lands you should have all the variants you need. > + CHECK(memcmp(verifier_log, "processed", sizeof("processed") - 1) != 0, > + "verifier_log", "%s\n", verifier_log); > + > + err = bpf_map_lookup_elem(ctx.map_fd, &key, &value); > + CHECK(err, "map_lookup", "map_lookup failed\n"); > + CHECK(value != 34, "invalid_value", > + "got value %llu expected %u\n", value, 34); > +cleanup: > + syscall__destroy(skel); > +} > diff --git a/tools/testing/selftests/bpf/progs/syscall.c b/tools/testing/selftests/bpf/progs/syscall.c > new file mode 100644 > index 000000000000..01476f88e45f > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/syscall.c > @@ -0,0 +1,73 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2021 Facebook */ > +#include <linux/stddef.h> > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > +#include <bpf/bpf_tracing.h> > +#include <../../tools/include/linux/filter.h> with TOOLSINCDIR shouldn't this be just <linux/fiter.h>? > + > +volatile const int workaround = 1; not needed anymore? > + > +char _license[] SEC("license") = "GPL"; > + > +struct args { > + __u64 log_buf; > + __u32 log_size; > + int max_entries; > + int map_fd; > + int prog_fd; > +}; > + [...]