Skip to content

Commit ddd1f6c

Browse files
d-e-s-oinsearchoflosttime
authored andcommitted
libbpf-rs: Add test for kernel tracepoint usage
Currently there exist no test for attaching of a BPF program to a kernel tracepoint. Add one. Signed-off-by: Daniel Müller <deso@posteo.net>
1 parent 723d9e4 commit ddd1f6c

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include "vmlinux.h"
4+
#include <bpf/bpf_helpers.h>
5+
#include <bpf/usdt.bpf.h>
6+
7+
struct {
8+
__uint(type, BPF_MAP_TYPE_RINGBUF);
9+
__uint(max_entries, 4096 /* one page */);
10+
} ringbuf SEC(".maps");
11+
12+
SEC("tracepoint/syscalls/sys_enter_getpid")
13+
int handle__tracepoint(void *ctx)
14+
{
15+
int *value;
16+
17+
value = bpf_ringbuf_reserve(&ringbuf, sizeof(int), 0);
18+
if (value) {
19+
*value = 1;
20+
bpf_ringbuf_submit(value, 0);
21+
}
22+
23+
return 0;
24+
}
25+
26+
char LICENSE[] SEC("license") = "GPL";

libbpf-rs/tests/bin/tracepoint.bpf.o

18.7 KB
Binary file not shown.

libbpf-rs/tests/test.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,3 +898,41 @@ fn test_object_program_insns() {
898898
let insns = prog.insns();
899899
assert!(!insns.is_empty());
900900
}
901+
902+
/// Check that we can attach a BPF program to a kernel tracepoint.
903+
#[test]
904+
fn test_object_tracepoint() {
905+
bump_rlimit_mlock();
906+
907+
let mut obj = get_test_object("tracepoint.bpf.o");
908+
let prog = obj
909+
.prog_mut("handle__tracepoint")
910+
.expect("Failed to find program");
911+
912+
let _link = prog
913+
.attach_tracepoint("syscalls", "sys_enter_getpid")
914+
.expect("Failed to attach prog");
915+
916+
let mut builder = libbpf_rs::RingBufferBuilder::new();
917+
let map = obj.map("ringbuf").expect("Failed to get ringbuf map");
918+
919+
static mut V: i32 = 0;
920+
fn callback(data: &[u8]) -> i32 {
921+
let mut value: i32 = 0;
922+
plain::copy_from_bytes(&mut value, data).expect("Wrong size");
923+
924+
unsafe {
925+
V = value;
926+
}
927+
928+
0
929+
}
930+
931+
builder.add(map, callback).expect("Failed to add ringbuf");
932+
let mgr = builder.build().expect("Failed to build");
933+
934+
let _pid = unsafe { libc::getpid() };
935+
mgr.consume().expect("Failed to consume ringbuf");
936+
937+
unsafe { assert_eq!(V, 1) };
938+
}

0 commit comments

Comments
 (0)