From: Yonghong Song <yonghong.song@linux.dev>
To: Lin Ma <malin89@huawei.com>, Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
bpf@vger.kernel.org
Cc: Andrii Nakryiko <andrii@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Martin KaFai Lau <martin.lau@linux.dev>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Song Liu <song@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
YiFei Zhu <zhuyifei@google.com>, Shuah Khan <shuah@kernel.org>,
linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
Amery Hung <ameryhung@gmail.com>,
Rongzhen Cui <cuirongzhen@huawei.com>,
Jingguo Tan <tanjingguo@huawei.com>,
cenxianlong@huawei.com, chenzhe@huawei.com
Subject: Re: [PATCH v2 2/2] selftests/bpf: Cover tail-call cgroup storage prog-array checks
Date: Tue, 2 Jun 2026 09:41:51 -0700 [thread overview]
Message-ID: <7978c4f6-2833-45b5-80e0-c1eeb99cb646@linux.dev> (raw)
In-Reply-To: <20260602073539.1567846-2-malin89@huawei.com>
On 6/2/26 12:35 AM, Lin Ma wrote:
> Add tail-call selftests for prog-array ownership when cgroup storage is
> in use. Verify that loading succeeds when callers and callees reuse the
> owner's cgroup storage map, and that loading fails for a different
> storage map or for a storage-less bridge program.
>
> Signed-off-by: Lin Ma <malin89@huawei.com>
> Signed-off-by: Rongzhen Cui <cuirongzhen@huawei.com>
> Signed-off-by: Jingguo Tan <tanjingguo@huawei.com>
> ---
> .../selftests/bpf/prog_tests/tailcalls.c | 103 ++++++++++++++++++
> .../bpf/progs/tailcall_cgrp_storage.c | 44 ++++++++
> .../progs/tailcall_cgrp_storage_no_storage.c | 20 ++++
> .../bpf/progs/tailcall_cgrp_storage_owner.c | 32 ++++++
> 4 files changed, 199 insertions(+)
> create mode 100644 tools/testing/selftests/bpf/progs/tailcall_cgrp_storage.c
> create mode 100644 tools/testing/selftests/bpf/progs/tailcall_cgrp_storage_no_storage.c
> create mode 100644 tools/testing/selftests/bpf/progs/tailcall_cgrp_storage_owner.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/tailcalls.c b/tools/testing/selftests/bpf/prog_tests/tailcalls.c
> index 7d534fde0af9..c1403ab20eae 100644
> --- a/tools/testing/selftests/bpf/prog_tests/tailcalls.c
> +++ b/tools/testing/selftests/bpf/prog_tests/tailcalls.c
> @@ -8,6 +8,9 @@
> #include "tailcall_freplace.skel.h"
> #include "tc_bpf2bpf.skel.h"
> #include "tailcall_fail.skel.h"
> +#include "tailcall_cgrp_storage_owner.skel.h"
> +#include "tailcall_cgrp_storage_no_storage.skel.h"
> +#include "tailcall_cgrp_storage.skel.h"
> #include "tailcall_sleepable.skel.h"
>
> /* test_tailcall_1 checks basic functionality by patching multiple locations
> @@ -1654,6 +1657,100 @@ static void test_tailcall_failure()
> RUN_TESTS(tailcall_fail);
> }
>
> +static void test_tailcall_cgrp_storage(void)
> +{
> + struct tailcall_cgrp_storage_owner *owner_skel = NULL;
> + struct tailcall_cgrp_storage *skel = NULL;
> + int err, key = 0, prog_array_fd, prog_fd, storage_map_fd;
> +
> + owner_skel = tailcall_cgrp_storage_owner__open_and_load();
> + if (!ASSERT_OK_PTR(owner_skel, "owner_open_and_load"))
> + return;
> +
> + prog_array_fd = bpf_map__fd(owner_skel->maps.prog_array);
> + storage_map_fd = bpf_map__fd(owner_skel->maps.storage_map);
> +
> + skel = tailcall_cgrp_storage__open();
> + if (!ASSERT_OK_PTR(skel, "tailcall_cgrp_storage__open"))
> + goto out;
> +
> + err = bpf_map__reuse_fd(skel->maps.prog_array, prog_array_fd);
> + if (!ASSERT_OK(err, "reuse_prog_array"))
> + goto out;
> +
> + err = bpf_map__reuse_fd(skel->maps.storage_map, storage_map_fd);
> + if (!ASSERT_OK(err, "reuse_storage_map"))
> + goto out;
> +
> + err = bpf_object__load(skel->obj);
> + if (!ASSERT_OK(err, "tailcall_cgrp_storage__load"))
> + goto out;
> +
> + prog_fd = bpf_program__fd(skel->progs.callee_prog);
> + err = bpf_map_update_elem(prog_array_fd, &key, &prog_fd, BPF_ANY);
> + ASSERT_OK(err, "update_prog_array");
> +
> +out:
> + tailcall_cgrp_storage__destroy(skel);
> + tailcall_cgrp_storage_owner__destroy(owner_skel);
> +}
> +
> +static void test_tailcall_cgrp_storage_diff_storage(void)
> +{
> + struct tailcall_cgrp_storage_owner *owner_skel = NULL;
> + struct tailcall_cgrp_storage *skel = NULL;
> + int err, prog_array_fd;
> +
> + owner_skel = tailcall_cgrp_storage_owner__open_and_load();
> + if (!ASSERT_OK_PTR(owner_skel, "owner_open_and_load"))
> + return;
> +
> + prog_array_fd = bpf_map__fd(owner_skel->maps.prog_array);
> +
> + skel = tailcall_cgrp_storage__open();
> + if (!ASSERT_OK_PTR(skel, "tailcall_cgrp_storage__open"))
> + goto out;
> +
> + err = bpf_map__reuse_fd(skel->maps.prog_array, prog_array_fd);
> + if (!ASSERT_OK(err, "reuse_prog_array"))
> + goto out;
> +
> + err = bpf_object__load(skel->obj);
> + ASSERT_ERR(err, "tailcall_cgrp_storage__load");
> +
> +out:
> + tailcall_cgrp_storage__destroy(skel);
> + tailcall_cgrp_storage_owner__destroy(owner_skel);
> +}
> +
> +static void test_tailcall_cgrp_storage_no_storage(void)
> +{
> + struct tailcall_cgrp_storage_owner *owner_skel = NULL;
> + struct tailcall_cgrp_storage_no_storage *skel = NULL;
> + int err, prog_array_fd;
> +
> + owner_skel = tailcall_cgrp_storage_owner__open_and_load();
> + if (!ASSERT_OK_PTR(owner_skel, "owner_open_and_load"))
> + return;
> +
> + prog_array_fd = bpf_map__fd(owner_skel->maps.prog_array);
> +
> + skel = tailcall_cgrp_storage_no_storage__open();
> + if (!ASSERT_OK_PTR(skel, "tailcall_cgrp_storage_no_storage__open"))
> + goto out;
> +
> + err = bpf_map__reuse_fd(skel->maps.prog_array, prog_array_fd);
> + if (!ASSERT_OK(err, "reuse_prog_array"))
> + goto out;
> +
> + err = bpf_object__load(skel->obj);
> + ASSERT_ERR(err, "tailcall_cgrp_storage_no_storage__load");
> +
> +out:
> + tailcall_cgrp_storage_no_storage__destroy(skel);
> + tailcall_cgrp_storage_owner__destroy(owner_skel);
> +}
> +
> noinline void uprobe_sleepable_trigger(void)
> {
> asm volatile ("");
> @@ -1777,6 +1874,12 @@ void test_tailcalls(void)
> test_tailcall_freplace();
> if (test__start_subtest("tailcall_bpf2bpf_freplace"))
> test_tailcall_bpf2bpf_freplace();
> + if (test__start_subtest("tailcall_cgrp_storage"))
> + test_tailcall_cgrp_storage();
> + if (test__start_subtest("tailcall_cgrp_storage_diff_storage"))
> + test_tailcall_cgrp_storage_diff_storage();
> + if (test__start_subtest("tailcall_cgrp_storage_no_storage"))
> + test_tailcall_cgrp_storage_no_storage();
Since the failure is due to 'A -> B(no storage) -> C(storage)' in your commit message,
you should create a selftest for that. Current selftests are good but not addressing
the issue in patch 1.
> if (test__start_subtest("tailcall_failure"))
> test_tailcall_failure();
> if (test__start_subtest("tailcall_sleepable"))
>
[...]
next prev parent reply other threads:[~2026-06-02 16:42 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-02 7:35 [PATCH v2 1/2] bpf: Tighten cgroup storage cookie checks for prog arrays Lin Ma
2026-06-02 7:35 ` [PATCH v2 2/2] selftests/bpf: Cover tail-call cgroup storage prog-array checks Lin Ma
2026-06-02 8:15 ` bot+bpf-ci
2026-06-02 16:41 ` Yonghong Song [this message]
2026-06-03 15:01 ` Leon Hwang
2026-06-02 8:15 ` [PATCH v2 1/2] bpf: Tighten cgroup storage cookie checks for prog arrays bot+bpf-ci
2026-06-02 15:14 ` Yonghong Song
-- strict thread matches above, loose matches on Subject: below --
2026-06-04 1:52 [PATCH v2 2/2] selftests/bpf: Cover tail-call cgroup storage prog-array checks malin (R)
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=7978c4f6-2833-45b5-80e0-c1eeb99cb646@linux.dev \
--to=yonghong.song@linux.dev \
--cc=ameryhung@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=cenxianlong@huawei.com \
--cc=chenzhe@huawei.com \
--cc=cuirongzhen@huawei.com \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=malin89@huawei.com \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=shuah@kernel.org \
--cc=song@kernel.org \
--cc=tanjingguo@huawei.com \
--cc=zhuyifei@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox