File tree Expand file tree Collapse file tree 3 files changed +64
-0
lines changed Expand file tree Collapse file tree 3 files changed +64
-0
lines changed Original file line number Diff line number Diff line change
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" ;
Original file line number Diff line number Diff line change @@ -898,3 +898,41 @@ fn test_object_program_insns() {
898
898
let insns = prog. insns ( ) ;
899
899
assert ! ( !insns. is_empty( ) ) ;
900
900
}
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
+ }
You can’t perform that action at this time.
0 commit comments