|  | // 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); | 
|  | } |