mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-19 00:04:18 +00:00
Add three tests for struct_ops using private stack. ./test_progs -t struct_ops_private_stack #336/1 struct_ops_private_stack/private_stack:OK #336/2 struct_ops_private_stack/private_stack_fail:OK #336/3 struct_ops_private_stack/private_stack_recur:OK #336 struct_ops_private_stack:OK The following is a snippet of a struct_ops check_member() implementation: u32 moff = __btf_member_bit_offset(t, member) / 8; switch (moff) { case offsetof(struct bpf_testmod_ops3, test_1): prog->aux->priv_stack_requested = true; prog->aux->recursion_detected = test_1_recursion_detected; fallthrough; default: break; } return 0; The first test is with nested two different callback functions where the first prog has more than 512 byte stack size (including subprogs) with private stack enabled. The second test is a negative test where the second prog has more than 512 byte stack size without private stack enabled. The third test is the same callback function recursing itself. At run time, the jit trampoline recursion check kicks in to prevent the recursion. The recursion_detected() callback function is implemented by the bpf_testmod, the following message in dmesg bpf_testmod: oh no, recursing into test_1, recursion_misses 1 demonstrates the callback function is indeed triggered when recursion miss happens. Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20241112163938.2225528-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
114 lines
2.4 KiB
C
114 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (c) 2020 Facebook */
|
|
#ifndef _BPF_TESTMOD_H
|
|
#define _BPF_TESTMOD_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct task_struct;
|
|
|
|
struct bpf_testmod_test_read_ctx {
|
|
char *buf;
|
|
loff_t off;
|
|
size_t len;
|
|
};
|
|
|
|
struct bpf_testmod_test_write_ctx {
|
|
char *buf;
|
|
loff_t off;
|
|
size_t len;
|
|
};
|
|
|
|
struct bpf_testmod_test_writable_ctx {
|
|
bool early_ret;
|
|
int val;
|
|
};
|
|
|
|
/* BPF iter that returns *value* *n* times in a row */
|
|
struct bpf_iter_testmod_seq {
|
|
s64 value;
|
|
int cnt;
|
|
};
|
|
|
|
struct bpf_testmod_ops {
|
|
int (*test_1)(void);
|
|
void (*test_2)(int a, int b);
|
|
/* Used to test nullable arguments. */
|
|
int (*test_maybe_null)(int dummy, struct task_struct *task);
|
|
int (*unsupported_ops)(void);
|
|
|
|
/* The following fields are used to test shadow copies. */
|
|
char onebyte;
|
|
struct {
|
|
int a;
|
|
int b;
|
|
} unsupported;
|
|
int data;
|
|
|
|
/* The following pointers are used to test the maps having multiple
|
|
* pages of trampolines.
|
|
*/
|
|
int (*tramp_1)(int value);
|
|
int (*tramp_2)(int value);
|
|
int (*tramp_3)(int value);
|
|
int (*tramp_4)(int value);
|
|
int (*tramp_5)(int value);
|
|
int (*tramp_6)(int value);
|
|
int (*tramp_7)(int value);
|
|
int (*tramp_8)(int value);
|
|
int (*tramp_9)(int value);
|
|
int (*tramp_10)(int value);
|
|
int (*tramp_11)(int value);
|
|
int (*tramp_12)(int value);
|
|
int (*tramp_13)(int value);
|
|
int (*tramp_14)(int value);
|
|
int (*tramp_15)(int value);
|
|
int (*tramp_16)(int value);
|
|
int (*tramp_17)(int value);
|
|
int (*tramp_18)(int value);
|
|
int (*tramp_19)(int value);
|
|
int (*tramp_20)(int value);
|
|
int (*tramp_21)(int value);
|
|
int (*tramp_22)(int value);
|
|
int (*tramp_23)(int value);
|
|
int (*tramp_24)(int value);
|
|
int (*tramp_25)(int value);
|
|
int (*tramp_26)(int value);
|
|
int (*tramp_27)(int value);
|
|
int (*tramp_28)(int value);
|
|
int (*tramp_29)(int value);
|
|
int (*tramp_30)(int value);
|
|
int (*tramp_31)(int value);
|
|
int (*tramp_32)(int value);
|
|
int (*tramp_33)(int value);
|
|
int (*tramp_34)(int value);
|
|
int (*tramp_35)(int value);
|
|
int (*tramp_36)(int value);
|
|
int (*tramp_37)(int value);
|
|
int (*tramp_38)(int value);
|
|
int (*tramp_39)(int value);
|
|
int (*tramp_40)(int value);
|
|
};
|
|
|
|
struct bpf_testmod_ops2 {
|
|
int (*test_1)(void);
|
|
};
|
|
|
|
struct bpf_testmod_ops3 {
|
|
int (*test_1)(void);
|
|
int (*test_2)(void);
|
|
};
|
|
|
|
struct st_ops_args {
|
|
u64 a;
|
|
};
|
|
|
|
struct bpf_testmod_st_ops {
|
|
int (*test_prologue)(struct st_ops_args *args);
|
|
int (*test_epilogue)(struct st_ops_args *args);
|
|
int (*test_pro_epilogue)(struct st_ops_args *args);
|
|
struct module *owner;
|
|
};
|
|
|
|
#endif /* _BPF_TESTMOD_H */
|