lkml.org 
[lkml]   [2022]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf v2 5/5] bpf:selftests: Add kfunc_call test for mixing 32-bit and 64-bit parameters
    Date
    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)
    {
    --
    2.30.GIT
    \
     
     \ /
      Last update: 2022-11-07 10:24    [W:4.988 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site