diff mbox series

[bpf-next] selftests/bpf: Move spintest from samples/bpf to selftests

Message ID 20220330075051.34326-1-puranjay12@gmail.com (mailing list archive)
State Changes Requested
Delegated to: BPF
Headers show
Series [bpf-next] selftests/bpf: Move spintest from samples/bpf to selftests | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for bpf-next, async
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers warning 8 maintainers not CCed: linux-kselftest@vger.kernel.org john.fastabend@gmail.com songliubraving@fb.com yhs@fb.com kpsingh@kernel.org netdev@vger.kernel.org kafai@fb.com shuah@kernel.org
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
bpf/vmtest-bpf-next-PR success PR summary

Commit Message

Puranjay Mohan March 30, 2022, 7:50 a.m. UTC
According to the discussions in [1] everything from the samples/bpf
directory should be moved out or deleted.

Move the spintest program from BPF samples to BPF selftests.
There are no functional changes. BPF skeleton has been used for loading,
etc.

[1] https://lore.kernel.org/all/CAEf4BzYv3ONhy-JnQUtknzgBSK0gpm9GBJYtbAiJQe50_eX7Uw@mail.gmail.com/

Signed-off-by: Puranjay Mohan <puranjay12@gmail.com>
---
 samples/bpf/Makefile                          |  3 --
 .../selftests/bpf/prog_tests/spintest.c       | 43 +++++++------------
 .../testing/selftests/bpf/progs/test_spin.c   | 15 +++----
 3 files changed, 23 insertions(+), 38 deletions(-)
 rename samples/bpf/spintest_user.c => tools/testing/selftests/bpf/prog_tests/spintest.c (63%)
 rename samples/bpf/spintest_kern.c => tools/testing/selftests/bpf/progs/test_spin.c (86%)

Comments

Andrii Nakryiko April 3, 2022, 11:30 p.m. UTC | #1
On Wed, Mar 30, 2022 at 12:51 AM Puranjay Mohan <puranjay12@gmail.com> wrote:
>
> According to the discussions in [1] everything from the samples/bpf
> directory should be moved out or deleted.
>
> Move the spintest program from BPF samples to BPF selftests.
> There are no functional changes. BPF skeleton has been used for loading,
> etc.
>

Great that you are helping with selftests consolidation, thanks! I
have few comments which will require a new revision, but overall this
is moving in the right direction.

> [1] https://lore.kernel.org/all/CAEf4BzYv3ONhy-JnQUtknzgBSK0gpm9GBJYtbAiJQe50_eX7Uw@mail.gmail.com/
>
> Signed-off-by: Puranjay Mohan <puranjay12@gmail.com>
> ---
>  samples/bpf/Makefile                          |  3 --
>  .../selftests/bpf/prog_tests/spintest.c       | 43 +++++++------------
>  .../testing/selftests/bpf/progs/test_spin.c   | 15 +++----
>  3 files changed, 23 insertions(+), 38 deletions(-)
>  rename samples/bpf/spintest_user.c => tools/testing/selftests/bpf/prog_tests/spintest.c (63%)
>  rename samples/bpf/spintest_kern.c => tools/testing/selftests/bpf/progs/test_spin.c (86%)
>

[...]

>
> -       if (load_kallsyms()) {
> -               printf("failed to process /proc/kallsyms\n");
> -               return 2;
> -       }
> +       err = load_kallsyms();

do we need to use kallsyms? selftests generally follows the latest
kernel, so whatever attach target doesn't exist in the kernel we
should just remove

> +       if (!ASSERT_OK(err, "load_kallsyms"))
> +               return;
> +       skel = test_spin__open_and_load();
>
> -       snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
> -       obj = bpf_object__open_file(filename, NULL);
> -       if (libbpf_get_error(obj)) {
> -               fprintf(stderr, "ERROR: opening BPF object file failed\n");
> -               obj = NULL;
> -               goto cleanup;
> -       }
> +       if (!ASSERT_OK_PTR(skel, "test_spin__open_and_load"))
> +               return;
>
> -       /* load BPF program */
> -       if (bpf_object__load(obj)) {
> -               fprintf(stderr, "ERROR: loading BPF object file failed\n");
> -               goto cleanup;
> -       }
> -
> -       map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
> -       if (map_fd < 0) {
> -               fprintf(stderr, "ERROR: finding a map in obj file failed\n");
> -               goto cleanup;
> -       }
> +       map_fd = bpf_map__fd(skel->maps.my_map);
>
> -       bpf_object__for_each_program(prog, obj) {
> +       bpf_object__for_each_program(prog, skel->obj) {
>                 section = bpf_program__section_name(prog);
>                 if (sscanf(section, "kprobe/%s", symbol) != 1)
>                         continue;
> @@ -52,7 +41,8 @@ int main(int ac, char **argv)
>                 /* Attach prog only when symbol exists */
>                 if (ksym_get_addr(symbol)) {
>                         links[j] = bpf_program__attach(prog);
> -                       if (libbpf_get_error(links[j])) {
> +                       err = libbpf_get_error(links[j]);
> +                       if (!ASSERT_OK(err, "bpf_program__attach")) {
>                                 fprintf(stderr, "bpf_program__attach failed\n");
>                                 links[j] = NULL;
>                                 goto cleanup;

there are a bunch of leftover prints, let's get rid of them and/or
turn them into ASSERT_xxx()

there is sleep(1) in each of 5 iterations, this slows down the
selftests a lot. Let's get rid of it.


there is also assert(), there shouldn't be any calls to assert()
crashing the process in selftests

> @@ -89,5 +79,4 @@ int main(int ac, char **argv)
>                 bpf_link__destroy(links[j]);

let's use skeleton's links "storage" and simplify the cleanup significantly.

>
>         bpf_object__close(obj);

this should be test_spin__destroy() instead

> -       return 0;
>  }
> diff --git a/samples/bpf/spintest_kern.c b/tools/testing/selftests/bpf/progs/test_spin.c
> similarity index 86%
> rename from samples/bpf/spintest_kern.c
> rename to tools/testing/selftests/bpf/progs/test_spin.c
> index 455da77319d9..531783fe6cb9 100644
> --- a/samples/bpf/spintest_kern.c
> +++ b/tools/testing/selftests/bpf/progs/test_spin.c
> @@ -4,14 +4,14 @@
>   * modify it under the terms of version 2 of the GNU General Public
>   * License as published by the Free Software Foundation.
>   */
> -#include <linux/skbuff.h>
> -#include <linux/netdevice.h>
> -#include <linux/version.h>
> -#include <uapi/linux/bpf.h>
> -#include <uapi/linux/perf_event.h>
> +#include <vmlinux.h>
>  #include <bpf/bpf_helpers.h>
>  #include <bpf/bpf_tracing.h>
>
> +#ifndef PERF_MAX_STACK_DEPTH
> +#define PERF_MAX_STACK_DEPTH         127
> +#endif
> +
>  struct {
>         __uint(type, BPF_MAP_TYPE_HASH);
>         __type(key, long);
> @@ -27,8 +27,8 @@ struct {
>
>  struct {
>         __uint(type, BPF_MAP_TYPE_STACK_TRACE);
> -       __uint(key_size, sizeof(u32));
> -       __uint(value_size, PERF_MAX_STACK_DEPTH * sizeof(u64));
> +       __uint(key_size, sizeof(__u32));
> +       __uint(value_size, PERF_MAX_STACK_DEPTH * sizeof(__u64));
>         __uint(max_entries, 10000);
>  } stackmap SEC(".maps");
>
> @@ -66,4 +66,3 @@ SEC("kprobe/__htab_percpu_map_update_elem")PROG(p16)
>  SEC("kprobe/htab_map_alloc")PROG(p17)

I don't see why we need this PROG(pXX) magic instead of just doing a
function call. Let's have a common function called from each of the
defined kprobe program.

>
>  char _license[] SEC("license") = "GPL";
> -u32 _version SEC("version") = LINUX_VERSION_CODE;
> --
> 2.35.1
>
diff mbox series

Patch

diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile
index 38638845db9d..570f1b0d9f00 100644
--- a/samples/bpf/Makefile
+++ b/samples/bpf/Makefile
@@ -23,7 +23,6 @@  tprogs-y += test_probe_write_user
 tprogs-y += trace_output
 tprogs-y += lathist
 tprogs-y += offwaketime
-tprogs-y += spintest
 tprogs-y += map_perf_test
 tprogs-y += test_overhead
 tprogs-y += test_cgrp2_array_pin
@@ -86,7 +85,6 @@  test_probe_write_user-objs := test_probe_write_user_user.o
 trace_output-objs := trace_output_user.o
 lathist-objs := lathist_user.o
 offwaketime-objs := offwaketime_user.o $(TRACE_HELPERS)
-spintest-objs := spintest_user.o $(TRACE_HELPERS)
 map_perf_test-objs := map_perf_test_user.o
 test_overhead-objs := test_overhead_user.o
 test_cgrp2_array_pin-objs := test_cgrp2_array_pin.o
@@ -144,7 +142,6 @@  always-y += tcbpf1_kern.o
 always-y += tc_l2_redirect_kern.o
 always-y += lathist_kern.o
 always-y += offwaketime_kern.o
-always-y += spintest_kern.o
 always-y += map_perf_test_kern.o
 always-y += test_overhead_tp_kern.o
 always-y += test_overhead_raw_tp_kern.o
diff --git a/samples/bpf/spintest_user.c b/tools/testing/selftests/bpf/prog_tests/spintest.c
similarity index 63%
rename from samples/bpf/spintest_user.c
rename to tools/testing/selftests/bpf/prog_tests/spintest.c
index 0d7e1e5a8658..15b436fb3f9a 100644
--- a/samples/bpf/spintest_user.c
+++ b/tools/testing/selftests/bpf/prog_tests/spintest.c
@@ -6,45 +6,34 @@ 
 #include <sys/resource.h>
 #include <bpf/libbpf.h>
 #include <bpf/bpf.h>
+#include <test_progs.h>
 #include "trace_helpers.h"
+#include "test_spin.skel.h"
 
-int main(int ac, char **argv)
+void test_spin(void)
 {
-	char filename[256], symbol[256];
 	struct bpf_object *obj = NULL;
 	struct bpf_link *links[20];
 	long key, next_key, value;
 	struct bpf_program *prog;
+	struct test_spin *skel;
 	int map_fd, i, j = 0;
 	const char *section;
 	struct ksym *sym;
+	char symbol[256];
+	int err;
 
-	if (load_kallsyms()) {
-		printf("failed to process /proc/kallsyms\n");
-		return 2;
-	}
+	err = load_kallsyms();
+	if (!ASSERT_OK(err, "load_kallsyms"))
+		return;
+	skel = test_spin__open_and_load();
 
-	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
-	obj = bpf_object__open_file(filename, NULL);
-	if (libbpf_get_error(obj)) {
-		fprintf(stderr, "ERROR: opening BPF object file failed\n");
-		obj = NULL;
-		goto cleanup;
-	}
+	if (!ASSERT_OK_PTR(skel, "test_spin__open_and_load"))
+		return;
 
-	/* load BPF program */
-	if (bpf_object__load(obj)) {
-		fprintf(stderr, "ERROR: loading BPF object file failed\n");
-		goto cleanup;
-	}
-
-	map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");
-	if (map_fd < 0) {
-		fprintf(stderr, "ERROR: finding a map in obj file failed\n");
-		goto cleanup;
-	}
+	map_fd = bpf_map__fd(skel->maps.my_map);
 
-	bpf_object__for_each_program(prog, obj) {
+	bpf_object__for_each_program(prog, skel->obj) {
 		section = bpf_program__section_name(prog);
 		if (sscanf(section, "kprobe/%s", symbol) != 1)
 			continue;
@@ -52,7 +41,8 @@  int main(int ac, char **argv)
 		/* Attach prog only when symbol exists */
 		if (ksym_get_addr(symbol)) {
 			links[j] = bpf_program__attach(prog);
-			if (libbpf_get_error(links[j])) {
+			err = libbpf_get_error(links[j]);
+			if (!ASSERT_OK(err, "bpf_program__attach")) {
 				fprintf(stderr, "bpf_program__attach failed\n");
 				links[j] = NULL;
 				goto cleanup;
@@ -89,5 +79,4 @@  int main(int ac, char **argv)
 		bpf_link__destroy(links[j]);
 
 	bpf_object__close(obj);
-	return 0;
 }
diff --git a/samples/bpf/spintest_kern.c b/tools/testing/selftests/bpf/progs/test_spin.c
similarity index 86%
rename from samples/bpf/spintest_kern.c
rename to tools/testing/selftests/bpf/progs/test_spin.c
index 455da77319d9..531783fe6cb9 100644
--- a/samples/bpf/spintest_kern.c
+++ b/tools/testing/selftests/bpf/progs/test_spin.c
@@ -4,14 +4,14 @@ 
  * modify it under the terms of version 2 of the GNU General Public
  * License as published by the Free Software Foundation.
  */
-#include <linux/skbuff.h>
-#include <linux/netdevice.h>
-#include <linux/version.h>
-#include <uapi/linux/bpf.h>
-#include <uapi/linux/perf_event.h>
+#include <vmlinux.h>
 #include <bpf/bpf_helpers.h>
 #include <bpf/bpf_tracing.h>
 
+#ifndef PERF_MAX_STACK_DEPTH
+#define PERF_MAX_STACK_DEPTH         127
+#endif
+
 struct {
 	__uint(type, BPF_MAP_TYPE_HASH);
 	__type(key, long);
@@ -27,8 +27,8 @@  struct {
 
 struct {
 	__uint(type, BPF_MAP_TYPE_STACK_TRACE);
-	__uint(key_size, sizeof(u32));
-	__uint(value_size, PERF_MAX_STACK_DEPTH * sizeof(u64));
+	__uint(key_size, sizeof(__u32));
+	__uint(value_size, PERF_MAX_STACK_DEPTH * sizeof(__u64));
 	__uint(max_entries, 10000);
 } stackmap SEC(".maps");
 
@@ -66,4 +66,3 @@  SEC("kprobe/__htab_percpu_map_update_elem")PROG(p16)
 SEC("kprobe/htab_map_alloc")PROG(p17)
 
 char _license[] SEC("license") = "GPL";
-u32 _version SEC("version") = LINUX_VERSION_CODE;