In the previous patch, the maximum data size for bpf_global_percpu_ma is 512 bytes. This breaks selftest test_bpf_ma. The test is adjusted in two aspects: - Since the maximum allowed data size for bpf_global_percpu_ma is 512, remove all tests beyond that, names sizes 1024, 2048 and 4096. - Previously the percpu data size is bucket_size - 8 in order to avoid percpu allocation into the next bucket. This patch removed such data size adjustment thanks to Patch 1. Also, a better way to generate BTF type is used than adding a member to the value struct. Acked-by: Hou Tao <houtao1@huawei.com> Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20231222031807.1292853-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
74 lines
2 KiB
C
74 lines
2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (C) 2023. Huawei Technologies Co., Ltd */
|
|
#define _GNU_SOURCE
|
|
#include <sched.h>
|
|
#include <pthread.h>
|
|
#include <stdbool.h>
|
|
#include <bpf/btf.h>
|
|
#include <test_progs.h>
|
|
|
|
#include "test_bpf_ma.skel.h"
|
|
|
|
static void do_bpf_ma_test(const char *name)
|
|
{
|
|
struct test_bpf_ma *skel;
|
|
struct bpf_program *prog;
|
|
struct btf *btf;
|
|
int i, err, id;
|
|
char tname[32];
|
|
|
|
skel = test_bpf_ma__open();
|
|
if (!ASSERT_OK_PTR(skel, "open"))
|
|
return;
|
|
|
|
btf = bpf_object__btf(skel->obj);
|
|
if (!ASSERT_OK_PTR(btf, "btf"))
|
|
goto out;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(skel->rodata->data_sizes); i++) {
|
|
snprintf(tname, sizeof(tname), "bin_data_%u", skel->rodata->data_sizes[i]);
|
|
id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT);
|
|
if (!ASSERT_GT(id, 0, tname))
|
|
goto out;
|
|
skel->rodata->data_btf_ids[i] = id;
|
|
}
|
|
|
|
for (i = 0; i < ARRAY_SIZE(skel->rodata->percpu_data_sizes); i++) {
|
|
snprintf(tname, sizeof(tname), "percpu_bin_data_%u", skel->rodata->percpu_data_sizes[i]);
|
|
id = btf__find_by_name_kind(btf, tname, BTF_KIND_STRUCT);
|
|
if (!ASSERT_GT(id, 0, tname))
|
|
goto out;
|
|
skel->rodata->percpu_data_btf_ids[i] = id;
|
|
}
|
|
|
|
prog = bpf_object__find_program_by_name(skel->obj, name);
|
|
if (!ASSERT_OK_PTR(prog, "invalid prog name"))
|
|
goto out;
|
|
bpf_program__set_autoload(prog, true);
|
|
|
|
err = test_bpf_ma__load(skel);
|
|
if (!ASSERT_OK(err, "load"))
|
|
goto out;
|
|
|
|
err = test_bpf_ma__attach(skel);
|
|
if (!ASSERT_OK(err, "attach"))
|
|
goto out;
|
|
|
|
skel->bss->pid = getpid();
|
|
usleep(1);
|
|
ASSERT_OK(skel->bss->err, "test error");
|
|
out:
|
|
test_bpf_ma__destroy(skel);
|
|
}
|
|
|
|
void test_test_bpf_ma(void)
|
|
{
|
|
if (test__start_subtest("batch_alloc_free"))
|
|
do_bpf_ma_test("test_batch_alloc_free");
|
|
if (test__start_subtest("free_through_map_free"))
|
|
do_bpf_ma_test("test_free_through_map_free");
|
|
if (test__start_subtest("batch_percpu_alloc_free"))
|
|
do_bpf_ma_test("test_batch_percpu_alloc_free");
|
|
if (test__start_subtest("percpu_free_through_map_free"))
|
|
do_bpf_ma_test("test_percpu_free_through_map_free");
|
|
}
|