add simple kfuncs to create/destroy a context type to bpf_testmod, register them and add a kfunc_call test to use them. This provides test coverage for registration of dtor kfuncs from modules. By transferring the context pointer to a map value as a __kptr we also trigger the map-based dtor cleanup logic, improving test coverage. Suggested-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Alan Maguire <alan.maguire@oracle.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20240620091733.1967885-7-alan.maguire@oracle.com
147 lines
3.9 KiB
C
147 lines
3.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef _BPF_TESTMOD_KFUNC_H
|
|
#define _BPF_TESTMOD_KFUNC_H
|
|
|
|
#ifndef __KERNEL__
|
|
#include <vmlinux.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#else
|
|
#define __ksym
|
|
struct prog_test_member1 {
|
|
int a;
|
|
};
|
|
|
|
struct prog_test_member {
|
|
struct prog_test_member1 m;
|
|
int c;
|
|
};
|
|
|
|
struct prog_test_ref_kfunc {
|
|
int a;
|
|
int b;
|
|
struct prog_test_member memb;
|
|
struct prog_test_ref_kfunc *next;
|
|
refcount_t cnt;
|
|
};
|
|
#endif
|
|
|
|
struct prog_test_pass1 {
|
|
int x0;
|
|
struct {
|
|
int x1;
|
|
struct {
|
|
int x2;
|
|
struct {
|
|
int x3;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
struct prog_test_pass2 {
|
|
int len;
|
|
short arr1[4];
|
|
struct {
|
|
char arr2[4];
|
|
unsigned long arr3[8];
|
|
} x;
|
|
};
|
|
|
|
struct prog_test_fail1 {
|
|
void *p;
|
|
int x;
|
|
};
|
|
|
|
struct prog_test_fail2 {
|
|
int x8;
|
|
struct prog_test_pass1 x;
|
|
};
|
|
|
|
struct prog_test_fail3 {
|
|
int len;
|
|
char arr1[2];
|
|
char arr2[];
|
|
};
|
|
|
|
struct init_sock_args {
|
|
int af;
|
|
int type;
|
|
};
|
|
|
|
struct addr_args {
|
|
char addr[sizeof(struct __kernel_sockaddr_storage)];
|
|
int addrlen;
|
|
};
|
|
|
|
struct sendmsg_args {
|
|
struct addr_args addr;
|
|
char msg[10];
|
|
int msglen;
|
|
};
|
|
|
|
struct bpf_testmod_ctx {
|
|
struct callback_head rcu;
|
|
refcount_t usage;
|
|
};
|
|
|
|
struct prog_test_ref_kfunc *
|
|
bpf_kfunc_call_test_acquire(unsigned long *scalar_ptr) __ksym;
|
|
void bpf_kfunc_call_test_release(struct prog_test_ref_kfunc *p) __ksym;
|
|
void bpf_kfunc_call_test_ref(struct prog_test_ref_kfunc *p) __ksym;
|
|
|
|
void bpf_kfunc_call_test_mem_len_pass1(void *mem, int len) __ksym;
|
|
int *bpf_kfunc_call_test_get_rdwr_mem(struct prog_test_ref_kfunc *p, const int rdwr_buf_size) __ksym;
|
|
int *bpf_kfunc_call_test_get_rdonly_mem(struct prog_test_ref_kfunc *p, const int rdonly_buf_size) __ksym;
|
|
int *bpf_kfunc_call_test_acq_rdonly_mem(struct prog_test_ref_kfunc *p, const int rdonly_buf_size) __ksym;
|
|
void bpf_kfunc_call_int_mem_release(int *p) __ksym;
|
|
|
|
/* The bpf_kfunc_call_test_static_unused_arg is defined as static,
|
|
* but bpf program compilation needs to see it as global symbol.
|
|
*/
|
|
#ifndef __KERNEL__
|
|
u32 bpf_kfunc_call_test_static_unused_arg(u32 arg, u32 unused) __ksym;
|
|
#endif
|
|
|
|
void bpf_testmod_test_mod_kfunc(int i) __ksym;
|
|
|
|
__u64 bpf_kfunc_call_test1(struct sock *sk, __u32 a, __u64 b,
|
|
__u32 c, __u64 d) __ksym;
|
|
int bpf_kfunc_call_test2(struct sock *sk, __u32 a, __u32 b) __ksym;
|
|
struct sock *bpf_kfunc_call_test3(struct sock *sk) __ksym;
|
|
long bpf_kfunc_call_test4(signed char a, short b, int c, long d) __ksym;
|
|
|
|
void bpf_kfunc_call_test_pass_ctx(struct __sk_buff *skb) __ksym;
|
|
void bpf_kfunc_call_test_pass1(struct prog_test_pass1 *p) __ksym;
|
|
void bpf_kfunc_call_test_pass2(struct prog_test_pass2 *p) __ksym;
|
|
void bpf_kfunc_call_test_mem_len_fail2(__u64 *mem, int len) __ksym;
|
|
|
|
void bpf_kfunc_call_test_destructive(void) __ksym;
|
|
void bpf_kfunc_call_test_sleepable(void) __ksym;
|
|
|
|
void bpf_kfunc_call_test_offset(struct prog_test_ref_kfunc *p);
|
|
struct prog_test_member *bpf_kfunc_call_memb_acquire(void);
|
|
void bpf_kfunc_call_memb1_release(struct prog_test_member1 *p);
|
|
void bpf_kfunc_call_test_fail1(struct prog_test_fail1 *p);
|
|
void bpf_kfunc_call_test_fail2(struct prog_test_fail2 *p);
|
|
void bpf_kfunc_call_test_fail3(struct prog_test_fail3 *p);
|
|
void bpf_kfunc_call_test_mem_len_fail1(void *mem, int len);
|
|
|
|
void bpf_kfunc_common_test(void) __ksym;
|
|
|
|
int bpf_kfunc_init_sock(struct init_sock_args *args) __ksym;
|
|
void bpf_kfunc_close_sock(void) __ksym;
|
|
int bpf_kfunc_call_kernel_connect(struct addr_args *args) __ksym;
|
|
int bpf_kfunc_call_kernel_bind(struct addr_args *args) __ksym;
|
|
int bpf_kfunc_call_kernel_listen(void) __ksym;
|
|
int bpf_kfunc_call_kernel_sendmsg(struct sendmsg_args *args) __ksym;
|
|
int bpf_kfunc_call_sock_sendmsg(struct sendmsg_args *args) __ksym;
|
|
int bpf_kfunc_call_kernel_getsockname(struct addr_args *args) __ksym;
|
|
int bpf_kfunc_call_kernel_getpeername(struct addr_args *args) __ksym;
|
|
|
|
void bpf_kfunc_dynptr_test(struct bpf_dynptr *ptr, struct bpf_dynptr *ptr__nullable) __ksym;
|
|
|
|
struct bpf_testmod_ctx *bpf_testmod_ctx_create(int *err) __ksym;
|
|
void bpf_testmod_ctx_release(struct bpf_testmod_ctx *ctx) __ksym;
|
|
|
|
#endif /* _BPF_TESTMOD_KFUNC_H */
|