Skip to content

Commit d1e56cf

Browse files
laoarKernel Patches Daemon
authored and
Kernel Patches Daemon
committed
selftests/bpf: Add selftest for dynamic tracepoint
The result is as follows, $ tools/testing/selftests/bpf/test_progs --name=dynamic_tp #85 dynamic_tp:OK Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Yafang Shao <[email protected]>
1 parent 3ca0eb2 commit d1e56cf

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
#include <test_progs.h>
4+
#include <bpf/btf.h>
5+
#include <bpf/bpf.h>
6+
7+
#include "dynamic_tp.skel.h"
8+
9+
int dynamic_tp(const char *cmd)
10+
{
11+
const char *kprobe_file = "/sys/kernel/debug/tracing/kprobe_events";
12+
ssize_t bytes_written;
13+
int fd, err;
14+
15+
fd = open(kprobe_file, O_WRONLY | O_APPEND);
16+
if (!ASSERT_GE(fd, 0, "open kprobe_events"))
17+
return -1;
18+
19+
bytes_written = write(fd, cmd, strlen(cmd));
20+
if (!ASSERT_GT(bytes_written, 0, "write kprobe_events")) {
21+
close(fd);
22+
return -1;
23+
}
24+
25+
err = close(fd);
26+
if (!ASSERT_OK(err, "close kprobe_events"))
27+
return -1;
28+
return 0;
29+
}
30+
31+
void test_dynamic_tp(void)
32+
{
33+
struct dynamic_tp *skel;
34+
pid_t child_pid;
35+
int status, err;
36+
37+
/* create a dynamic tracepoint */
38+
err = dynamic_tp("p:my_dynamic_tp kernel_clone");
39+
if (!ASSERT_OK(err, "create dynamic tp"))
40+
return;
41+
42+
skel = dynamic_tp__open_and_load();
43+
if (!ASSERT_OK_PTR(skel, "load progs"))
44+
goto remove_tp;
45+
skel->bss->pid = getpid();
46+
err = dynamic_tp__attach(skel);
47+
if (!ASSERT_OK(err, "attach progs"))
48+
goto cleanup;
49+
50+
/* trigger the dynamic tracepoint */
51+
child_pid = fork();
52+
if (!ASSERT_GT(child_pid, -1, "child_pid"))
53+
goto cleanup;
54+
if (child_pid == 0)
55+
_exit(0);
56+
waitpid(child_pid, &status, 0);
57+
58+
ASSERT_EQ(skel->bss->result, 1, "result");
59+
60+
cleanup:
61+
dynamic_tp__destroy(skel);
62+
remove_tp:
63+
dynamic_tp("-:my_dynamic_tp kernel_clone");
64+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include <vmlinux.h>
4+
#include <bpf/bpf_helpers.h>
5+
6+
char _license[] SEC("license") = "GPL";
7+
8+
#define MAX_STACK_TRACE_DEPTH 32
9+
unsigned long entries[MAX_STACK_TRACE_DEPTH] = {};
10+
#define SIZE_OF_ULONG (sizeof(unsigned long))
11+
12+
int result, pid;
13+
14+
SEC("kprobe/kprobes/my_dynamic_tp")
15+
int dynamic_tp(struct pt_regs *ctx)
16+
{
17+
int ret;
18+
19+
ret = bpf_get_stack(ctx, entries, MAX_STACK_TRACE_DEPTH * SIZE_OF_ULONG, 0);
20+
if (ret < 0) {
21+
result = -1;
22+
return ret;
23+
}
24+
if (bpf_get_current_pid_tgid() >> 32 == pid)
25+
result = 1;
26+
return 0;
27+
}

0 commit comments

Comments
 (0)