root/tools/testing/selftests/bpf/prog_tests/test_bpf_ma.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");
}