1- use alloc:: { boxed:: Box , sync:: Arc } ;
2- use core:: any:: Any ;
1+ use alloc:: { boxed:: Box , sync:: Arc , vec :: Vec } ;
2+ use core:: { any:: Any , sync :: atomic :: AtomicU32 } ;
33
44use bpf_basic:: perf:: PerfProbeArgs ;
55use kprobe:: { CallBackFunc , KprobeBuilder , ProbeArgs } ;
@@ -17,10 +17,24 @@ use crate::{
1717pub struct KprobePerfEvent {
1818 _args : PerfProbeArgs ,
1919 kprobe : Arc < KernelKprobe > ,
20+ callback_list : Vec < u32 > ,
21+ }
22+
23+ impl KprobePerfEvent {
24+ pub fn new ( args : PerfProbeArgs , kprobe : Arc < KernelKprobe > ) -> Self {
25+ KprobePerfEvent {
26+ _args : args,
27+ kprobe,
28+ callback_list : Vec :: new ( ) ,
29+ }
30+ }
2031}
2132
2233impl Drop for KprobePerfEvent {
2334 fn drop ( & mut self ) {
35+ for callback_id in & self . callback_list {
36+ self . kprobe . unregister_event_callback ( * callback_id) ;
37+ }
2438 unregister_kprobe ( self . kprobe . clone ( ) ) ;
2539 }
2640}
@@ -92,10 +106,16 @@ impl KprobePerfEvent {
92106 for ( key, value) in BPF_HELPER_FUN_SET . iter ( ) {
93107 vm. register_helper ( * key, * value) . unwrap ( ) ;
94108 }
109+
110+ static CALLBACK_ID : AtomicU32 = AtomicU32 :: new ( 0 ) ;
111+
112+ let id = CALLBACK_ID . fetch_add ( 1 , core:: sync:: atomic:: Ordering :: Relaxed ) ;
113+
95114 // create a callback to execute the ebpf prog
96115 let callback = Box :: new ( KprobePerfCallBack :: new ( bpf_prog, vm) ) ;
97116 // update callback for kprobe
98- self . kprobe . update_event_callback ( callback) ;
117+ self . kprobe . register_event_callback ( id, callback) ;
118+ self . callback_list . push ( id) ;
99119 Ok ( ( ) )
100120 }
101121}
@@ -115,8 +135,5 @@ pub fn perf_event_open_kprobe(args: PerfProbeArgs) -> KprobePerfEvent {
115135 let builder = perf_probe_arg_to_kprobe_builder ( & args) ;
116136 let kprobe = register_kprobe ( builder) ;
117137 println_color ! ( 32 , "create kprobe ok" ) ;
118- KprobePerfEvent {
119- _args : args,
120- kprobe,
121- }
138+ KprobePerfEvent :: new ( args, kprobe)
122139}
0 commit comments