e4f7ac90c2
Add selftest that combines two BPF programs within single BPF object file such that one of the programs is using global variables, but can be skipped at runtime on old kernels that don't support global data. Another BPF program is written with the goal to be runnable on very old kernels and only relies on explicitly accessed BPF maps. Such test, run against old kernels (e.g., libbpf CI will run it against 4.9 kernel that doesn't support global data), allows to test the approach and ensure that libbpf doesn't make unnecessary assumption about necessary kernel features. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Song Liu <songliubraving@fb.com> Link: https://lore.kernel.org/bpf/20211123200105.387855-2-andrii@kernel.org
66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2021 Facebook */
|
|
#include <test_progs.h>
|
|
#include "test_legacy_printk.skel.h"
|
|
|
|
static int execute_one_variant(bool legacy)
|
|
{
|
|
struct test_legacy_printk *skel;
|
|
int err, zero = 0, my_pid = getpid(), res, map_fd;
|
|
|
|
skel = test_legacy_printk__open();
|
|
if (!ASSERT_OK_PTR(skel, "skel_open"))
|
|
return -errno;
|
|
|
|
bpf_program__set_autoload(skel->progs.handle_legacy, legacy);
|
|
bpf_program__set_autoload(skel->progs.handle_modern, !legacy);
|
|
|
|
err = test_legacy_printk__load(skel);
|
|
/* no ASSERT_OK, we expect one of two variants can fail here */
|
|
if (err)
|
|
goto err_out;
|
|
|
|
if (legacy) {
|
|
map_fd = bpf_map__fd(skel->maps.my_pid_map);
|
|
err = bpf_map_update_elem(map_fd, &zero, &my_pid, BPF_ANY);
|
|
if (!ASSERT_OK(err, "my_pid_map_update"))
|
|
goto err_out;
|
|
err = bpf_map_lookup_elem(map_fd, &zero, &res);
|
|
} else {
|
|
skel->bss->my_pid_var = my_pid;
|
|
}
|
|
|
|
err = test_legacy_printk__attach(skel);
|
|
if (!ASSERT_OK(err, "skel_attach"))
|
|
goto err_out;
|
|
|
|
usleep(1); /* trigger */
|
|
|
|
if (legacy) {
|
|
map_fd = bpf_map__fd(skel->maps.res_map);
|
|
err = bpf_map_lookup_elem(map_fd, &zero, &res);
|
|
if (!ASSERT_OK(err, "res_map_lookup"))
|
|
goto err_out;
|
|
} else {
|
|
res = skel->bss->res_var;
|
|
}
|
|
|
|
if (!ASSERT_GT(res, 0, "res")) {
|
|
err = -EINVAL;
|
|
goto err_out;
|
|
}
|
|
|
|
err_out:
|
|
test_legacy_printk__destroy(skel);
|
|
return err;
|
|
}
|
|
|
|
void test_legacy_printk(void)
|
|
{
|
|
/* legacy variant should work everywhere */
|
|
ASSERT_OK(execute_one_variant(true /* legacy */), "legacy_case");
|
|
|
|
/* execute modern variant, can fail the load on old kernels */
|
|
execute_one_variant(false);
|
|
}
|