// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2021 Facebook */ #include #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); }