32-bit ARM has four registers to save function parameters, add test cases to cover additional scenarios.
Signed-off-by: Yang Jihong yangjihong1@huawei.com --- net/bpf/test_run.c | 18 +++++++ .../selftests/bpf/prog_tests/kfunc_call.c | 3 ++ .../selftests/bpf/progs/kfunc_call_test.c | 52 +++++++++++++++++++ 3 files changed, 73 insertions(+)
diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 13d578ce2a09..e7eb5bd4cf0e 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -551,6 +551,21 @@ struct sock * noinline bpf_kfunc_call_test3(struct sock *sk) return sk; }
+u64 noinline bpf_kfunc_call_test4(struct sock *sk, u64 a, u64 b, u32 c, u32 d) +{ + return a + b + c + d; +} + +u64 noinline bpf_kfunc_call_test5(u64 a, u64 b) +{ + return a + b; +} + +u64 noinline bpf_kfunc_call_test6(u32 a, u32 b, u32 c, u32 d, u32 e) +{ + return a + b + c + d + e; +} + struct prog_test_member1 { int a; }; @@ -739,6 +754,9 @@ BTF_SET8_START(test_sk_check_kfunc_ids) BTF_ID_FLAGS(func, bpf_kfunc_call_test1) BTF_ID_FLAGS(func, bpf_kfunc_call_test2) BTF_ID_FLAGS(func, bpf_kfunc_call_test3) +BTF_ID_FLAGS(func, bpf_kfunc_call_test4) +BTF_ID_FLAGS(func, bpf_kfunc_call_test5) +BTF_ID_FLAGS(func, bpf_kfunc_call_test6) BTF_ID_FLAGS(func, bpf_kfunc_call_test_acquire, KF_ACQUIRE | KF_RET_NULL) BTF_ID_FLAGS(func, bpf_kfunc_call_memb_acquire, KF_ACQUIRE | KF_RET_NULL) BTF_ID_FLAGS(func, bpf_kfunc_call_test_release, KF_RELEASE) diff --git a/tools/testing/selftests/bpf/prog_tests/kfunc_call.c b/tools/testing/selftests/bpf/prog_tests/kfunc_call.c index 5af1ee8f0e6e..6a6822e99071 100644 --- a/tools/testing/selftests/bpf/prog_tests/kfunc_call.c +++ b/tools/testing/selftests/bpf/prog_tests/kfunc_call.c @@ -72,6 +72,9 @@ static struct kfunc_test_params kfunc_tests[] = { /* success cases */ TC_TEST(kfunc_call_test1, 12), TC_TEST(kfunc_call_test2, 3), + TC_TEST(kfunc_call_test4, 16), + TC_TEST(kfunc_call_test5, 7), + TC_TEST(kfunc_call_test6, 15), TC_TEST(kfunc_call_test_ref_btf_id, 0), TC_TEST(kfunc_call_test_get_mem, 42), SYSCALL_TEST(kfunc_syscall_test, 0), diff --git a/tools/testing/selftests/bpf/progs/kfunc_call_test.c b/tools/testing/selftests/bpf/progs/kfunc_call_test.c index f636e50be259..0385ce2d4c6e 100644 --- a/tools/testing/selftests/bpf/progs/kfunc_call_test.c +++ b/tools/testing/selftests/bpf/progs/kfunc_call_test.c @@ -6,6 +6,11 @@ extern int bpf_kfunc_call_test2(struct sock *sk, __u32 a, __u32 b) __ksym; extern __u64 bpf_kfunc_call_test1(struct sock *sk, __u32 a, __u64 b, __u32 c, __u64 d) __ksym; +extern __u64 bpf_kfunc_call_test4(struct sock *sk, __u64 a, __u64 b, + __u32 c, __u32 d) __ksym; +extern __u64 bpf_kfunc_call_test5(__u64 a, __u64 b) __ksym; +extern __u64 bpf_kfunc_call_test6(__u32 a, __u32 b, __u32 c, __u32 d, + __u32 e) __ksym;
extern struct prog_test_ref_kfunc *bpf_kfunc_call_test_acquire(unsigned long *sp) __ksym; extern void bpf_kfunc_call_test_release(struct prog_test_ref_kfunc *p) __ksym; @@ -17,6 +22,53 @@ extern void bpf_kfunc_call_test_mem_len_fail2(__u64 *mem, int len) __ksym; extern int *bpf_kfunc_call_test_get_rdwr_mem(struct prog_test_ref_kfunc *p, const int rdwr_buf_size) __ksym; extern int *bpf_kfunc_call_test_get_rdonly_mem(struct prog_test_ref_kfunc *p, const int rdonly_buf_size) __ksym;
+SEC("tc") +int kfunc_call_test6(struct __sk_buff *skb) +{ + __u64 a = 1ULL << 32; + __u32 ret; + + a = bpf_kfunc_call_test6(1, 2, 3, 4, 5); + ret = a >> 32; /* ret should be 0 */ + ret += (__u32)a; /* ret should be 15 */ + + return ret; +} + +SEC("tc") +int kfunc_call_test5(struct __sk_buff *skb) +{ + __u64 a = 1ULL << 32; + __u32 ret; + + a = bpf_kfunc_call_test5(a | 2, a | 3); + ret = a >> 32; /* ret should be 2 */ + ret += (__u32)a; /* ret should be 7 */ + + return ret; +} + +SEC("tc") +int kfunc_call_test4(struct __sk_buff *skb) +{ + struct bpf_sock *sk = skb->sk; + __u64 a = 1ULL << 32; + __u32 ret; + + if (!sk) + return -1; + + sk = bpf_sk_fullsock(sk); + if (!sk) + return -1; + + a = bpf_kfunc_call_test4((struct sock *)sk, a | 2, a | 3, 4, 5); + ret = a >> 32; /* ret should be 2 */ + ret += (__u32)a; /* ret should be 16 */ + + return ret; +} + SEC("tc") int kfunc_call_test2(struct __sk_buff *skb) {