From: Martin KaFai Lau <martin.lau@linux.dev>
To: bpf@vger.kernel.org
Cc: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Eduard Zingerman <eddyz87@gmail.com>,
Yonghong Song <yonghong.song@linux.dev>,
Amery Hung <ameryhung@gmail.com>,
kernel-team@meta.com
Subject: Re: [PATCH v4 bpf-next 9/9] selftests/bpf: Test epilogue patching when the main prog has multiple BPF_EXIT
Date: Tue, 27 Aug 2024 17:58:00 -0700 [thread overview]
Message-ID: <08bc097d-6e95-4fc9-8899-1c0c69712005@linux.dev> (raw)
In-Reply-To: <20240827194834.1423815-10-martin.lau@linux.dev>
On 8/27/24 12:48 PM, Martin KaFai Lau wrote:
> From: Martin KaFai Lau <martin.lau@kernel.org>
>
> This patch tests the epilogue patching when the main prog has
> multiple BPF_EXIT. The verifier should have patched the 2nd (and
> later) BPF_EXIT with a BPF_JA that goes back to the earlier
> patched epilogue instructions.
>
> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
> ---
> .../selftests/bpf/prog_tests/pro_epilogue.c | 2 +
> .../selftests/bpf/progs/epilogue_exit.c | 78 +++++++++++++++++++
> 2 files changed, 80 insertions(+)
> create mode 100644 tools/testing/selftests/bpf/progs/epilogue_exit.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/pro_epilogue.c b/tools/testing/selftests/bpf/prog_tests/pro_epilogue.c
> index b2e467cf15fe..58c18529a802 100644
> --- a/tools/testing/selftests/bpf/prog_tests/pro_epilogue.c
> +++ b/tools/testing/selftests/bpf/prog_tests/pro_epilogue.c
> @@ -6,6 +6,7 @@
> #include "pro_epilogue_kfunc.skel.h"
> #include "epilogue_tailcall.skel.h"
> #include "pro_epilogue_goto_start.skel.h"
> +#include "epilogue_exit.skel.h"
>
> struct st_ops_args {
> int a;
> @@ -47,6 +48,7 @@ void test_pro_epilogue(void)
> RUN_TESTS(pro_epilogue_subprog);
> RUN_TESTS(pro_epilogue_kfunc);
> RUN_TESTS(pro_epilogue_goto_start);
> + RUN_TESTS(epilogue_exit);
> if (test__start_subtest("tailcall"))
> test_tailcall();
> }
> diff --git a/tools/testing/selftests/bpf/progs/epilogue_exit.c b/tools/testing/selftests/bpf/progs/epilogue_exit.c
> new file mode 100644
> index 000000000000..8c03256c7491
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/epilogue_exit.c
> @@ -0,0 +1,78 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
> +
> +#include <vmlinux.h>
> +#include <bpf/bpf_tracing.h>
> +#include "bpf_misc.h"
> +#include "../bpf_testmod/bpf_testmod.h"
> +#include "../bpf_testmod/bpf_testmod_kfunc.h"
> +
> +char _license[] SEC("license") = "GPL";
> +
> +__success
> +/* save __u64 *ctx to stack */
> +__xlated("0: *(u64 *)(r10 -8) = r1")
> +/* main prog */
> +__xlated("1: r1 = *(u64 *)(r1 +0)")
> +__xlated("2: r2 = *(u32 *)(r1 +0)")
> +__xlated("3: if r2 == 0x0 goto pc+10")
> +__xlated("4: r0 = 0")
> +__xlated("5: *(u32 *)(r1 +0) = 0")
> +/* epilogue */
> +__xlated("6: r1 = *(u64 *)(r10 -8)")
> +__xlated("7: r1 = *(u64 *)(r1 +0)")
> +__xlated("8: r6 = *(u32 *)(r1 +0)")
> +__xlated("9: w6 += 10000")
> +__xlated("10: *(u32 *)(r1 +0) = r6")
> +__xlated("11: w0 = w6")
> +__xlated("12: w0 *= 2")
> +__xlated("13: exit")
> +/* 2nd part of the main prog after the first exit */
> +__xlated("14: *(u32 *)(r1 +0) = 1")
> +__xlated("15: r0 = 1")
> +/* Clear the r1 to ensure it does not have
> + * off-by-1 error and ensure it jumps back to the
> + * beginning of epilogue which initializes
> + * the r1 with the ctx ptr.
> + */
> +__xlated("16: r1 = 0")
> +__xlated("17: gotol pc-12")
> +SEC("struct_ops/test_epilogue_exit")
> +__naked int test_epilogue_exit(void)
> +{
> + asm volatile (
> + "r1 = *(u64 *)(r1 +0);"
> + "r2 = *(u32 *)(r1 +0);"
> + "if r2 == 0 goto +3;"
> + "r0 = 0;"
> + "*(u32 *)(r1 + 0) = 0;"
llvm17 cannot take "*(u32 *)(r1 +0) = 0".
Instead:
r3 = 0;
*(u32 *)(r1 + 0) = r3;
The above solved the llvm17 error:
https://github.com/kernel-patches/bpf/actions/runs/10586206183/job/29334690461
However, there is still a zext with s390 that added extra insn and failed the
__xlated check. will try an adjustment in the tests to avoid the zext.
pw-bot: cr
> + "exit;"
> + "*(u32 *)(r1 + 0) = 1;"
> + "r0 = 1;"
> + "r1 = 0;"
> + "exit;"
> + ::: __clobber_all);
> +}
> +
> +SEC(".struct_ops.link")
> +struct bpf_testmod_st_ops epilogue_exit = {
> + .test_epilogue = (void *)test_epilogue_exit,
> +};
> +
> +SEC("syscall")
> +__retval(20000)
> +int syscall_epilogue_exit0(void *ctx)
> +{
> + struct st_ops_args args = { .a = 1 };
> +
> + return bpf_kfunc_st_ops_test_epilogue(&args);
> +}
> +
> +SEC("syscall")
> +__retval(20002)
> +int syscall_epilogue_exit1(void *ctx)
> +{
> + struct st_ops_args args = {};
> +
> + return bpf_kfunc_st_ops_test_epilogue(&args);
> +}
next prev parent reply other threads:[~2024-08-28 0:58 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 19:48 [PATCH v4 bpf-next 0/9] bpf: Add gen_epilogue to bpf_verifier_ops Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 1/9] bpf: Move insn_buf[16] to bpf_verifier_env Martin KaFai Lau
2024-08-29 0:41 ` Eduard Zingerman
2024-08-29 1:46 ` Alexei Starovoitov
2024-08-29 15:20 ` Martin KaFai Lau
2024-08-29 15:26 ` Alexei Starovoitov
2024-08-29 15:33 ` Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 3/9] bpf: Add gen_epilogue to bpf_verifier_ops Martin KaFai Lau
2024-08-29 2:26 ` Eduard Zingerman
2024-08-29 15:47 ` Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 4/9] bpf: Export bpf_base_func_proto Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 5/9] selftests/bpf: attach struct_ops maps before test prog runs Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 6/9] selftests/bpf: Test gen_prologue and gen_epilogue Martin KaFai Lau
2024-08-29 7:27 ` Eduard Zingerman
2024-08-29 17:35 ` Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 7/9] selftests/bpf: Add tailcall epilogue test Martin KaFai Lau
2024-08-29 6:16 ` Eduard Zingerman
2024-08-29 18:15 ` Martin KaFai Lau
2024-08-27 19:48 ` [PATCH v4 bpf-next 8/9] selftests/bpf: A pro/epilogue test when the main prog jumps back to the 1st insn Martin KaFai Lau
2024-08-29 6:21 ` Eduard Zingerman
2024-08-27 19:48 ` [PATCH v4 bpf-next 9/9] selftests/bpf: Test epilogue patching when the main prog has multiple BPF_EXIT Martin KaFai Lau
2024-08-28 0:58 ` Martin KaFai Lau [this message]
2024-08-29 6:28 ` Eduard Zingerman
2024-08-29 20:09 ` Martin KaFai Lau
2024-08-29 6:25 ` Eduard Zingerman
2024-08-27 19:52 ` [PATCH v4 bpf-next 2/9] bpf: Adjust BPF_JMP that jumps to the 1st insn of the prologue Martin KaFai Lau
2024-08-28 16:48 ` Alexei Starovoitov
2024-08-28 17:44 ` Martin KaFai Lau
2024-08-28 18:43 ` Alexei Starovoitov
2024-08-28 18:59 ` Martin KaFai Lau
[not found] ` <20240827194834.1423815-3-martin.lau@linux.dev>
2024-08-29 2:01 ` 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=08bc097d-6e95-4fc9-8899-1c0c69712005@linux.dev \
--to=martin.lau@linux.dev \
--cc=ameryhung@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kernel-team@meta.com \
--cc=yonghong.song@linux.dev \
/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.