brintos

brintos / linux-shallow public Read only

0
0
Text · 4.5 KiB · 70d90c4 Raw
139 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <test_progs.h>3#include "missed_kprobe.skel.h"4#include "missed_kprobe_recursion.skel.h"5#include "missed_tp_recursion.skel.h"6 7/*8 * Putting kprobe on bpf_fentry_test1 that calls bpf_kfunc_common_test9 * kfunc, which has also kprobe on. The latter won't get triggered due10 * to kprobe recursion check and kprobe missed counter is incremented.11 */12static void test_missed_perf_kprobe(void)13{14	LIBBPF_OPTS(bpf_test_run_opts, topts);15	struct bpf_link_info info = {};16	struct missed_kprobe *skel;17	__u32 len = sizeof(info);18	int err, prog_fd;19 20	skel = missed_kprobe__open_and_load();21	if (!ASSERT_OK_PTR(skel, "missed_kprobe__open_and_load"))22		goto cleanup;23 24	err = missed_kprobe__attach(skel);25	if (!ASSERT_OK(err, "missed_kprobe__attach"))26		goto cleanup;27 28	prog_fd = bpf_program__fd(skel->progs.trigger);29	err = bpf_prog_test_run_opts(prog_fd, &topts);30	ASSERT_OK(err, "test_run");31	ASSERT_EQ(topts.retval, 0, "test_run");32 33	err = bpf_link_get_info_by_fd(bpf_link__fd(skel->links.test2), &info, &len);34	if (!ASSERT_OK(err, "bpf_link_get_info_by_fd"))35		goto cleanup;36 37	ASSERT_EQ(info.type, BPF_LINK_TYPE_PERF_EVENT, "info.type");38	ASSERT_EQ(info.perf_event.type, BPF_PERF_EVENT_KPROBE, "info.perf_event.type");39	ASSERT_EQ(info.perf_event.kprobe.missed, 1, "info.perf_event.kprobe.missed");40 41cleanup:42	missed_kprobe__destroy(skel);43}44 45static __u64 get_missed_count(int fd)46{47	struct bpf_prog_info info = {};48	__u32 len = sizeof(info);49	int err;50 51	err = bpf_prog_get_info_by_fd(fd, &info, &len);52	if (!ASSERT_OK(err, "bpf_prog_get_info_by_fd"))53		return (__u64) -1;54	return info.recursion_misses;55}56 57/*58 * Putting kprobe.multi on bpf_fentry_test1 that calls bpf_kfunc_common_test59 * kfunc which has 3 perf event kprobes and 1 kprobe.multi attached.60 *61 * Because fprobe (kprobe.multi attach layear) does not have strict recursion62 * check the kprobe's bpf_prog_active check is hit for test2-5.63 */64static void test_missed_kprobe_recursion(void)65{66	LIBBPF_OPTS(bpf_test_run_opts, topts);67	struct missed_kprobe_recursion *skel;68	int err, prog_fd;69 70	skel = missed_kprobe_recursion__open_and_load();71	if (!ASSERT_OK_PTR(skel, "missed_kprobe_recursion__open_and_load"))72		goto cleanup;73 74	err = missed_kprobe_recursion__attach(skel);75	if (!ASSERT_OK(err, "missed_kprobe_recursion__attach"))76		goto cleanup;77 78	prog_fd = bpf_program__fd(skel->progs.trigger);79	err = bpf_prog_test_run_opts(prog_fd, &topts);80	ASSERT_OK(err, "test_run");81	ASSERT_EQ(topts.retval, 0, "test_run");82 83	ASSERT_EQ(get_missed_count(bpf_program__fd(skel->progs.test1)), 0, "test1_recursion_misses");84	ASSERT_GE(get_missed_count(bpf_program__fd(skel->progs.test2)), 1, "test2_recursion_misses");85	ASSERT_GE(get_missed_count(bpf_program__fd(skel->progs.test3)), 1, "test3_recursion_misses");86	ASSERT_GE(get_missed_count(bpf_program__fd(skel->progs.test4)), 1, "test4_recursion_misses");87	ASSERT_GE(get_missed_count(bpf_program__fd(skel->progs.test5)), 1, "test5_recursion_misses");88 89cleanup:90	missed_kprobe_recursion__destroy(skel);91}92 93/*94 * Putting kprobe on bpf_fentry_test1 that calls bpf_printk and invokes95 * bpf_trace_printk tracepoint. The bpf_trace_printk tracepoint has test[234]96 * programs attached to it.97 *98 * Because kprobe execution goes through bpf_prog_active check, programs99 * attached to the tracepoint will fail the recursion check and increment100 * the recursion_misses stats.101 */102static void test_missed_tp_recursion(void)103{104	LIBBPF_OPTS(bpf_test_run_opts, topts);105	struct missed_tp_recursion *skel;106	int err, prog_fd;107 108	skel = missed_tp_recursion__open_and_load();109	if (!ASSERT_OK_PTR(skel, "missed_tp_recursion__open_and_load"))110		goto cleanup;111 112	err = missed_tp_recursion__attach(skel);113	if (!ASSERT_OK(err, "missed_tp_recursion__attach"))114		goto cleanup;115 116	prog_fd = bpf_program__fd(skel->progs.trigger);117	err = bpf_prog_test_run_opts(prog_fd, &topts);118	ASSERT_OK(err, "test_run");119	ASSERT_EQ(topts.retval, 0, "test_run");120 121	ASSERT_EQ(get_missed_count(bpf_program__fd(skel->progs.test1)), 0, "test1_recursion_misses");122	ASSERT_EQ(get_missed_count(bpf_program__fd(skel->progs.test2)), 1, "test2_recursion_misses");123	ASSERT_EQ(get_missed_count(bpf_program__fd(skel->progs.test3)), 1, "test3_recursion_misses");124	ASSERT_EQ(get_missed_count(bpf_program__fd(skel->progs.test4)), 1, "test4_recursion_misses");125 126cleanup:127	missed_tp_recursion__destroy(skel);128}129 130void test_missed(void)131{132	if (test__start_subtest("perf_kprobe"))133		test_missed_perf_kprobe();134	if (test__start_subtest("kprobe_recursion"))135		test_missed_kprobe_recursion();136	if (test__start_subtest("tp_recursion"))137		test_missed_tp_recursion();138}139