From: Jiri Olsa <olsajiri@gmail.com>
To: Yonghong Song <yonghong.song@linux.dev>
Cc: bpf@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
kernel-team@fb.com, Martin KaFai Lau <martin.lau@kernel.org>
Subject: Re: [PATCH bpf-next v3 5/5] selftests/bpf: Add private stack tests
Date: Mon, 30 Sep 2024 15:40:09 +0200 [thread overview]
Message-ID: <ZvqqOTrK_0aLRolW@krava> (raw)
In-Reply-To: <20240926234531.1771024-1-yonghong.song@linux.dev>
On Thu, Sep 26, 2024 at 04:45:31PM -0700, Yonghong Song wrote:
> Some private stack tests are added including:
> - prog with stack size greater than BPF_PSTACK_MIN_SUBTREE_SIZE.
> - prog with stack size less than BPF_PSTACK_MIN_SUBTREE_SIZE.
> - prog with one subprog having MAX_BPF_STACK stack size and another
> subprog having non-zero stack size.
> - prog with callback function.
> - prog with exception in main prog or subprog.
>
> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
hi,
might be some fail on my side, but I had to include bpf_experimental.h to
compile this.. ci seems ok
CLNG-BPF [test_progs-cpuv4] verifier_private_stack.bpf.o
progs/verifier_private_stack.c:174:2: error: call to undeclared function 'bpf_throw'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
174 | bpf_throw(0);
jirka
> ---
> .../selftests/bpf/prog_tests/verifier.c | 2 +
> .../bpf/progs/verifier_private_stack.c | 215 ++++++++++++++++++
> 2 files changed, 217 insertions(+)
> create mode 100644 tools/testing/selftests/bpf/progs/verifier_private_stack.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/testing/selftests/bpf/prog_tests/verifier.c
> index e26b5150fc43..635ff3509403 100644
> --- a/tools/testing/selftests/bpf/prog_tests/verifier.c
> +++ b/tools/testing/selftests/bpf/prog_tests/verifier.c
> @@ -59,6 +59,7 @@
> #include "verifier_or_jmp32_k.skel.h"
> #include "verifier_precision.skel.h"
> #include "verifier_prevent_map_lookup.skel.h"
> +#include "verifier_private_stack.skel.h"
> #include "verifier_raw_stack.skel.h"
> #include "verifier_raw_tp_writable.skel.h"
> #include "verifier_reg_equal.skel.h"
> @@ -185,6 +186,7 @@ void test_verifier_bpf_fastcall(void) { RUN(verifier_bpf_fastcall); }
> void test_verifier_or_jmp32_k(void) { RUN(verifier_or_jmp32_k); }
> void test_verifier_precision(void) { RUN(verifier_precision); }
> void test_verifier_prevent_map_lookup(void) { RUN(verifier_prevent_map_lookup); }
> +void test_verifier_private_stack(void) { RUN(verifier_private_stack); }
> void test_verifier_raw_stack(void) { RUN(verifier_raw_stack); }
> void test_verifier_raw_tp_writable(void) { RUN(verifier_raw_tp_writable); }
> void test_verifier_reg_equal(void) { RUN(verifier_reg_equal); }
> diff --git a/tools/testing/selftests/bpf/progs/verifier_private_stack.c b/tools/testing/selftests/bpf/progs/verifier_private_stack.c
> new file mode 100644
> index 000000000000..badd1fd1e3dd
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/verifier_private_stack.c
> @@ -0,0 +1,215 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <vmlinux.h>
> +#include <bpf/bpf_helpers.h>
> +#include "bpf_misc.h"
> +
> +/* From include/linux/filter.h */
> +#define MAX_BPF_STACK 512
> +
> +#if defined(__TARGET_ARCH_x86)
> +
> +SEC("kprobe")
> +__description("Private stack, single prog")
> +__success
> +__arch_x86_64
> +__jited(" movabsq $0x{{.*}}, %r9")
> +__jited(" addq %gs:0x{{.*}}, %r9")
> +__jited(" movl $0x2a, %edi")
> +__jited(" movq %rdi, -0x100(%r9)")
> +__naked void private_stack_single_prog(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - 256) = r1;"
> + "r0 = 0;"
> + "exit;"
> + :
> + :
> + : __clobber_all);
> +}
> +
> +__used
> +__naked static void cumulative_stack_depth_subprog(void)
> +{
> + asm volatile (
> + "r1 = 41;"
> + "*(u64 *)(r10 - 32) = r1;"
> + "call %[bpf_get_smp_processor_id];"
> + "exit;"
> + :: __imm(bpf_get_smp_processor_id)
> + : __clobber_all);
> +}
> +
> +SEC("kprobe")
> +__description("Private stack, subtree > MAX_BPF_STACK")
> +__success
> +__arch_x86_64
> +/* private stack fp for the main prog */
> +__jited(" movabsq $0x{{.*}}, %r9")
> +__jited(" addq %gs:0x{{.*}}, %r9")
> +__jited(" movl $0x2a, %edi")
> +__jited(" movq %rdi, -0x200(%r9)")
> +__jited(" pushq %r9")
> +__jited(" callq 0x{{.*}}")
> +__jited(" popq %r9")
> +__jited(" xorl %eax, %eax")
> +__naked void private_stack_nested_1(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - %[max_bpf_stack]) = r1;"
> + "call cumulative_stack_depth_subprog;"
> + "r0 = 0;"
> + "exit;"
> + :
> + : __imm_const(max_bpf_stack, MAX_BPF_STACK)
> + : __clobber_all);
> +}
> +
> +SEC("kprobe")
> +__description("Private stack, subtree > MAX_BPF_STACK")
> +__success
> +__arch_x86_64
> +/* private stack fp for the subprog */
> +__jited(" addq $0x20, %r9")
> +__naked void private_stack_nested_2(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - %[max_bpf_stack]) = r1;"
> + "call cumulative_stack_depth_subprog;"
> + "r0 = 0;"
> + "exit;"
> + :
> + : __imm_const(max_bpf_stack, MAX_BPF_STACK)
> + : __clobber_all);
> +}
> +
> +SEC("raw_tp")
> +__description("No private stack, nested")
> +__success
> +__arch_x86_64
> +__jited(" subq $0x8, %rsp")
> +__naked void no_private_stack_nested(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - 8) = r1;"
> + "call cumulative_stack_depth_subprog;"
> + "r0 = 0;"
> + "exit;"
> + :
> + :
> + : __clobber_all);
> +}
> +
> +__naked __noinline __used
> +static unsigned long loop_callback()
> +{
> + asm volatile (
> + "call %[bpf_get_prandom_u32];"
> + "r1 = 42;"
> + "*(u64 *)(r10 - 512) = r1;"
> + "call cumulative_stack_depth_subprog;"
> + "r0 = 0;"
> + "exit;"
> + :
> + : __imm(bpf_get_prandom_u32)
> + : __clobber_common);
> +}
> +
> +SEC("raw_tp")
> +__description("Private stack, callback")
> +__success
> +__arch_x86_64
> +/* for func loop_callback */
> +__jited("func #1")
> +__jited(" endbr64")
> +__jited(" nopl (%rax,%rax)")
> +__jited(" nopl (%rax)")
> +__jited(" pushq %rbp")
> +__jited(" movq %rsp, %rbp")
> +__jited(" endbr64")
> +__jited(" movabsq $0x{{.*}}, %r9")
> +__jited(" addq %gs:0x{{.*}}, %r9")
> +__jited(" pushq %r9")
> +__jited(" callq")
> +__jited(" popq %r9")
> +__jited(" movl $0x2a, %edi")
> +__jited(" movq %rdi, -0x200(%r9)")
> +__jited(" pushq %r9")
> +__jited(" callq")
> +__jited(" popq %r9")
> +__naked void private_stack_callback(void)
> +{
> + asm volatile (
> + "r1 = 1;"
> + "r2 = %[loop_callback];"
> + "r3 = 0;"
> + "r4 = 0;"
> + "call %[bpf_loop];"
> + "r0 = 0;"
> + "exit;"
> + :
> + : __imm_ptr(loop_callback),
> + __imm(bpf_loop)
> + : __clobber_common);
> +}
> +
> +SEC("fentry/bpf_fentry_test9")
> +__description("Private stack, exception in main prog")
> +__success __retval(0)
> +__arch_x86_64
> +__jited(" pushq %r9")
> +__jited(" callq")
> +__jited(" popq %r9")
> +int private_stack_exception_main_prog(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - 512) = r1;"
> + ::: __clobber_common);
> +
> + bpf_throw(0);
> + return 0;
> +}
> +
> +__used static int subprog_exception(void)
> +{
> + bpf_throw(0);
> + return 0;
> +}
> +
> +SEC("fentry/bpf_fentry_test9")
> +__description("Private stack, exception in subprog")
> +__success __retval(0)
> +__arch_x86_64
> +__jited(" movq %rdi, -0x200(%r9)")
> +__jited(" pushq %r9")
> +__jited(" callq")
> +__jited(" popq %r9")
> +int private_stack_exception_sub_prog(void)
> +{
> + asm volatile (
> + "r1 = 42;"
> + "*(u64 *)(r10 - 512) = r1;"
> + "call subprog_exception;"
> + ::: __clobber_common);
> +
> + return 0;
> +}
> +
> +#else
> +
> +SEC("kprobe")
> +__description("private stack is not supported, use a dummy test")
> +__success
> +int dummy_test(void)
> +{
> + return 0;
> +}
> +
> +#endif
> +
> +char _license[] SEC("license") = "GPL";
> --
> 2.43.5
>
>
next prev parent reply other threads:[~2024-09-30 13:40 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-26 23:45 [PATCH bpf-next v3 0/5] bpf: Support private stack for bpf progs Yonghong Song
2024-09-26 23:45 ` [PATCH bpf-next v3 1/5] bpf: Allow each subprog having stack size of 512 bytes Yonghong Song
2024-09-26 23:45 ` [PATCH bpf-next v3 2/5] bpf: Collect stack depth information Yonghong Song
2024-09-30 14:42 ` Alexei Starovoitov
2024-09-30 16:23 ` Yonghong Song
2024-09-26 23:45 ` [PATCH bpf-next v3 3/5] bpf: Mark each subprog with proper pstack states Yonghong Song
2024-09-30 14:49 ` Alexei Starovoitov
2024-09-30 16:26 ` Yonghong Song
2024-09-26 23:45 ` [PATCH bpf-next v3 4/5] bpf, x86: Add jit support for private stack Yonghong Song
2024-09-27 4:58 ` Leon Hwang
2024-09-27 15:24 ` Yonghong Song
2024-09-29 8:31 ` kernel test robot
2024-09-30 16:29 ` Yonghong Song
2024-09-29 13:02 ` kernel test robot
2024-09-30 16:31 ` Yonghong Song
2024-09-29 13:34 ` kernel test robot
2024-09-30 15:03 ` Alexei Starovoitov
2024-09-30 16:33 ` Yonghong Song
2024-10-01 4:31 ` Kumar Kartikeya Dwivedi
2024-10-01 4:37 ` Kumar Kartikeya Dwivedi
2024-10-01 18:49 ` Alexei Starovoitov
2024-10-01 19:53 ` yet another approach Was: " Alexei Starovoitov
2024-10-01 20:50 ` Kumar Kartikeya Dwivedi
2024-10-01 21:28 ` Alexei Starovoitov
2024-10-02 0:22 ` Kumar Kartikeya Dwivedi
2024-10-02 1:26 ` Alexei Starovoitov
2024-10-02 2:16 ` Kumar Kartikeya Dwivedi
2024-10-02 6:28 ` Yonghong Song
2024-10-02 6:48 ` Yonghong Song
2024-10-03 6:17 ` Yonghong Song
2024-10-03 13:39 ` Kumar Kartikeya Dwivedi
2024-10-03 17:35 ` Alexei Starovoitov
2024-10-03 18:53 ` Yonghong Song
2024-10-03 20:44 ` Yonghong Song
2024-10-03 20:47 ` Kumar Kartikeya Dwivedi
2024-10-03 20:54 ` Yonghong Song
2024-10-03 22:32 ` Alexei Starovoitov
2024-10-04 5:22 ` Yonghong Song
2024-10-04 19:27 ` Yonghong Song
2024-10-04 19:52 ` Alexei Starovoitov
2024-10-05 2:03 ` Yonghong Song
2024-10-08 22:10 ` Alexei Starovoitov
2024-10-09 2:06 ` Alexei Starovoitov
2024-10-09 6:31 ` Yonghong Song
2024-10-09 14:56 ` Alexei Starovoitov
2024-10-09 15:56 ` Yonghong Song
2024-10-09 16:36 ` Kumar Kartikeya Dwivedi
2024-10-09 16:38 ` Kumar Kartikeya Dwivedi
2024-10-09 17:37 ` Kumar Kartikeya Dwivedi
2024-10-09 6:12 ` Yonghong Song
2024-09-26 23:45 ` [PATCH bpf-next v3 5/5] selftests/bpf: Add private stack tests Yonghong Song
2024-09-30 13:40 ` Jiri Olsa [this message]
2024-09-30 15:05 ` Alexei Starovoitov
2024-09-30 16:35 ` Yonghong Song
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=ZvqqOTrK_0aLRolW@krava \
--to=olsajiri@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kernel-team@fb.com \
--cc=martin.lau@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox