From: Eduard Zingerman <eddyz87@gmail.com>
To: Mykyta Yatsenko <mykyta.yatsenko5@gmail.com>,
bpf@vger.kernel.org, ast@kernel.org, andrii@kernel.org,
daniel@iogearbox.net, kafai@meta.com, kernel-team@meta.com,
memxor@gmail.com
Cc: Mykyta Yatsenko <yatsenko@meta.com>
Subject: Re: [PATCH bpf-next v3 7/7] selftests/bpf: BPF task work scheduling tests
Date: Mon, 08 Sep 2025 00:43:07 -0700 [thread overview]
Message-ID: <6bc24eca4d2abdec108f2013c2e414e24d48642f.camel@gmail.com> (raw)
In-Reply-To: <20250905164508.1489482-8-mykyta.yatsenko5@gmail.com>
On Fri, 2025-09-05 at 17:45 +0100, Mykyta Yatsenko wrote:
> From: Mykyta Yatsenko <yatsenko@meta.com>
>
> Introducing selftests that check BPF task work scheduling mechanism.
> Validate that verifier does not accepts incorrect calls to
> bpf_task_work_schedule kfunc.
>
> Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
> ---
The test cases in this patch check functional correctness, but there
is no attempt to do some stress testing of the state machine.
E.g. how hard/feasible would it be to construct a test that attempts
to exercise both branches of the (state == BPF_TW_SCHEDULED) in the
bpf_task_work_cancel_and_free()?
> .../selftests/bpf/prog_tests/test_task_work.c | 149 ++++++++++++++++++
> tools/testing/selftests/bpf/progs/task_work.c | 108 +++++++++++++
> .../selftests/bpf/progs/task_work_fail.c | 98 ++++++++++++
> 3 files changed, 355 insertions(+)
> create mode 100644 tools/testing/selftests/bpf/prog_tests/test_task_work.c
> create mode 100644 tools/testing/selftests/bpf/progs/task_work.c
> create mode 100644 tools/testing/selftests/bpf/progs/task_work_fail.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/test_task_work.c b/tools/testing/selftests/bpf/prog_tests/test_task_work.c
> new file mode 100644
> index 000000000000..9c3c7a46a827
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/test_task_work.c
> @@ -0,0 +1,149 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
> +#include <test_progs.h>
> +#include <string.h>
> +#include <stdio.h>
> +#include "task_work.skel.h"
> +#include "task_work_fail.skel.h"
> +#include <linux/bpf.h>
> +#include <linux/perf_event.h>
> +#include <sys/syscall.h>
> +#include <time.h>
> +
> +static int perf_event_open(__u32 type, __u64 config, int pid)
> +{
> + struct perf_event_attr attr = {
> + .type = type,
> + .config = config,
> + .size = sizeof(struct perf_event_attr),
> + .sample_period = 100000,
> + };
> +
> + return syscall(__NR_perf_event_open, &attr, pid, -1, -1, 0);
> +}
> +
> +struct elem {
> + char data[128];
> + struct bpf_task_work tw;
> +};
> +
> +static int verify_map(struct bpf_map *map, const char *expected_data)
> +{
> + int err;
> + struct elem value;
> + int processed_values = 0;
> + int k, sz;
> +
> + sz = bpf_map__max_entries(map);
> + for (k = 0; k < sz; ++k) {
> + err = bpf_map__lookup_elem(map, &k, sizeof(int), &value, sizeof(struct elem), 0);
> + if (err)
> + continue;
> + if (!ASSERT_EQ(strcmp(expected_data, value.data), 0, "map data")) {
> + fprintf(stderr, "expected '%s', found '%s' in %s map", expected_data,
> + value.data, bpf_map__name(map));
> + return 2;
> + }
> + processed_values++;
> + }
> +
> + return processed_values == 0;
Nit: check for exact number of expected values here?
> +}
> +
> +static void task_work_run(const char *prog_name, const char *map_name)
> +{
> + struct task_work *skel;
> + struct bpf_program *prog;
> + struct bpf_map *map;
> + struct bpf_link *link;
> + int err, pe_fd = 0, pid, status, pipefd[2];
> + char user_string[] = "hello world";
> +
> + if (!ASSERT_NEQ(pipe(pipefd), -1, "pipe"))
> + return;
> +
> + pid = fork();
Nit: check for negative return value?
> + if (pid == 0) {
> + __u64 num = 1;
> + int i;
> + char buf;
> +
> + close(pipefd[1]);
> + read(pipefd[0], &buf, sizeof(buf));
> + close(pipefd[0]);
> +
> + for (i = 0; i < 10000; ++i)
> + num *= time(0) % 7;
> + (void)num;
> + exit(0);
> + }
> + skel = task_work__open();
> + if (!ASSERT_OK_PTR(skel, "task_work__open"))
> + return;
> +
> + bpf_object__for_each_program(prog, skel->obj) {
> + bpf_program__set_autoload(prog, false);
> + }
> +
> + prog = bpf_object__find_program_by_name(skel->obj, prog_name);
> + if (!ASSERT_OK_PTR(prog, "prog_name"))
> + goto cleanup;
> + bpf_program__set_autoload(prog, true);
> + bpf_program__set_type(prog, BPF_PROG_TYPE_PERF_EVENT);
Nit: this is not really necessary, the programs are already defined as
SEC("perf_event").
> + skel->bss->user_ptr = (char *)user_string;
> +
> + err = task_work__load(skel);
> + if (!ASSERT_OK(err, "skel_load"))
> + goto cleanup;
[...]
next prev parent reply other threads:[~2025-09-08 7:43 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-05 16:44 [PATCH bpf-next v3 0/7] bpf: Introduce deferred task context execution Mykyta Yatsenko
2025-09-05 16:44 ` [PATCH bpf-next v3 1/7] bpf: refactor special field-type detection Mykyta Yatsenko
2025-09-05 19:36 ` Eduard Zingerman
2025-09-05 21:29 ` Andrii Nakryiko
2025-09-05 16:45 ` [PATCH bpf-next v3 2/7] bpf: extract generic helper from process_timer_func() Mykyta Yatsenko
2025-09-05 21:15 ` Eduard Zingerman
2025-09-05 21:28 ` Eduard Zingerman
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-05 21:32 ` Eduard Zingerman
2025-09-05 21:29 ` Andrii Nakryiko
2025-09-05 16:45 ` [PATCH bpf-next v3 3/7] bpf: htab: extract helper for freeing special structs Mykyta Yatsenko
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-05 21:31 ` Eduard Zingerman
2025-09-05 16:45 ` [PATCH bpf-next v3 4/7] bpf: bpf task work plumbing Mykyta Yatsenko
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-05 23:09 ` Eduard Zingerman
2025-09-15 15:59 ` Mykyta Yatsenko
2025-09-15 20:12 ` Andrii Nakryiko
2025-09-15 20:20 ` Mykyta Yatsenko
2025-09-15 20:28 ` Andrii Nakryiko
2025-09-05 16:45 ` [PATCH bpf-next v3 5/7] bpf: extract map key pointer calculation Mykyta Yatsenko
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-05 23:19 ` Eduard Zingerman
2025-09-08 13:39 ` Mykyta Yatsenko
2025-09-08 17:18 ` Eduard Zingerman
2025-09-05 16:45 ` [PATCH bpf-next v3 6/7] bpf: task work scheduling kfuncs Mykyta Yatsenko
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-06 20:22 ` Eduard Zingerman
2025-09-08 13:13 ` Mykyta Yatsenko
2025-09-08 17:38 ` Eduard Zingerman
2025-09-09 3:42 ` Andrii Nakryiko
2025-09-09 4:15 ` Eduard Zingerman
2025-09-09 3:33 ` Andrii Nakryiko
2025-09-09 4:05 ` Eduard Zingerman
2025-09-10 14:14 ` Andrii Nakryiko
2025-09-09 17:49 ` Chris Mason
2025-09-09 18:59 ` Mykyta Yatsenko
2025-09-05 16:45 ` [PATCH bpf-next v3 7/7] selftests/bpf: BPF task work scheduling tests Mykyta Yatsenko
2025-09-05 21:31 ` Andrii Nakryiko
2025-09-08 7:43 ` Eduard Zingerman [this message]
2025-09-08 13:21 ` Mykyta Yatsenko
2025-09-08 18:23 ` Eduard Zingerman
2025-09-09 3:44 ` Andrii Nakryiko
2025-09-08 18:23 ` Eduard Zingerman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6bc24eca4d2abdec108f2013c2e414e24d48642f.camel@gmail.com \
--to=eddyz87@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kafai@meta.com \
--cc=kernel-team@meta.com \
--cc=memxor@gmail.com \
--cc=mykyta.yatsenko5@gmail.com \
--cc=yatsenko@meta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.