All of lore.kernel.org
 help / color / mirror / Atom feed
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
> 
> 

  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 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.