69 lines
1.8 KiB
C
69 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
|
|
#include <test_progs.h>
|
|
#include <sys/mman.h>
|
|
#include <network_helpers.h>
|
|
|
|
#define PAGE_SIZE 4096
|
|
|
|
#include "bpf_arena_list.h"
|
|
#include "arena_list.skel.h"
|
|
|
|
struct elem {
|
|
struct arena_list_node node;
|
|
__u64 value;
|
|
};
|
|
|
|
static int list_sum(struct arena_list_head *head)
|
|
{
|
|
struct elem __arena *n;
|
|
int sum = 0;
|
|
|
|
list_for_each_entry(n, head, node)
|
|
sum += n->value;
|
|
return sum;
|
|
}
|
|
|
|
static void test_arena_list_add_del(int cnt)
|
|
{
|
|
LIBBPF_OPTS(bpf_test_run_opts, opts);
|
|
struct arena_list *skel;
|
|
int expected_sum = (u64)cnt * (cnt - 1) / 2;
|
|
int ret, sum;
|
|
|
|
skel = arena_list__open_and_load();
|
|
if (!ASSERT_OK_PTR(skel, "arena_list__open_and_load"))
|
|
return;
|
|
|
|
skel->bss->cnt = cnt;
|
|
ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_add), &opts);
|
|
ASSERT_OK(ret, "ret_add");
|
|
ASSERT_OK(opts.retval, "retval");
|
|
if (skel->bss->skip) {
|
|
printf("%s:SKIP:compiler doesn't support arena_cast\n", __func__);
|
|
test__skip();
|
|
goto out;
|
|
}
|
|
sum = list_sum(skel->bss->list_head);
|
|
ASSERT_EQ(sum, expected_sum, "sum of elems");
|
|
ASSERT_EQ(skel->arena->arena_sum, expected_sum, "__arena sum of elems");
|
|
ASSERT_EQ(skel->arena->test_val, cnt + 1, "num of elems");
|
|
|
|
ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arena_list_del), &opts);
|
|
ASSERT_OK(ret, "ret_del");
|
|
sum = list_sum(skel->bss->list_head);
|
|
ASSERT_EQ(sum, 0, "sum of list elems after del");
|
|
ASSERT_EQ(skel->bss->list_sum, expected_sum, "sum of list elems computed by prog");
|
|
ASSERT_EQ(skel->arena->arena_sum, expected_sum, "__arena sum of elems");
|
|
out:
|
|
arena_list__destroy(skel);
|
|
}
|
|
|
|
void test_arena_list(void)
|
|
{
|
|
if (test__start_subtest("arena_list_1"))
|
|
test_arena_list_add_del(1);
|
|
if (test__start_subtest("arena_list_1000"))
|
|
test_arena_list_add_del(1000);
|
|
}
|