@@ -174,10 +174,13 @@ def attach_probes(self):
174174 # Capture the user-provided filename before the kernel resolves it.
175175 # Must be registered BEFORE vfs_open so the path is staged in time.
176176 # Uses the same fallback chain as the kretprobe.
177+ # NOTE: __x64_sys_* wrappers take a single pt_regs* holding the
178+ # user registers, so they need the *_x64 probe variants that
179+ # unwrap it; reading PARM1-4 directly there yields garbage.
177180 if BPF .get_kprobe_functions (b'do_sys_openat2' ):
178181 self .add_kprobe ("do_sys_openat2" , "trace_do_sys_openat2_entry" )
179182 elif BPF .get_kprobe_functions (b'__x64_sys_openat' ):
180- self .add_kprobe ("__x64_sys_openat" , "trace_do_sys_openat2_entry " )
183+ self .add_kprobe ("__x64_sys_openat" , "trace_openat_entry_x64 " )
181184 else :
182185 self .add_kprobe ("sys_openat" , "trace_do_sys_openat2_entry" )
183186 self .add_kprobe ("vfs_open" , "trace_vfs_open" )
@@ -191,6 +194,9 @@ def attach_probes(self):
191194 else :
192195 self .add_kretprobe ("sys_openat" , "trace_sys_openat_ret" )
193196 self .add_kprobe ("vfs_fsync" , "trace_vfs_fsync" )
197+ # Return probe clears the marker that suppresses the duplicate
198+ # event from the nested vfs_fsync -> vfs_fsync_range call.
199+ self .add_kretprobe ("vfs_fsync" , "trace_vfs_fsync_ret" )
194200 self .add_kprobe ("ksys_sync" , "trace_ksys_sync" )
195201 self .add_kprobe ("vfs_fsync_range" , "trace_vfs_fsync_range" )
196202 self .add_kprobe ("__fput" , "trace_fput" )
@@ -200,9 +206,10 @@ def attach_probes(self):
200206 self .add_kretprobe ("do_mmap" , "trace_mmap_ret" )
201207 self .add_kprobe ("__vm_munmap" , "trace_munmap" )
202208
203- # mremap probes — kernel may export the arch wrapper or the generic symbol
209+ # mremap probes — kernel may export the arch wrapper or the generic
210+ # symbol. The wrapper needs the pt_regs-unwrapping variant.
204211 if BPF .get_kprobe_functions (b'__x64_sys_mremap' ):
205- self .add_kprobe ("__x64_sys_mremap" , "trace_mremap_entry " )
212+ self .add_kprobe ("__x64_sys_mremap" , "trace_mremap_entry_x64 " )
206213 self .add_kretprobe ("__x64_sys_mremap" , "trace_mremap_ret" )
207214 elif BPF .get_kprobe_functions (b'sys_mremap' ):
208215 self .add_kprobe ("sys_mremap" , "trace_mremap_entry" )
@@ -251,12 +258,16 @@ def attach_probes(self):
251258 # else:
252259 # logger("warning", "filemap_fault not available - mmap I/O tracking disabled")
253260
254- # Direct I/O probe for bypass detection (return probe only - no latency tracking)
261+ # Direct I/O probes. The entry probe stages the I/O direction from
262+ # the iov_iter (the return value alone cannot distinguish a read
263+ # from a write); the return probe emits the completion event.
255264 if BPF .get_kprobe_functions (b'iomap_dio_rw' ):
265+ self .add_kprobe ("iomap_dio_rw" , "trace_dio_entry_iomap" )
256266 self .add_kretprobe ("iomap_dio_rw" , "trace_dio_return" )
257267 if self .developer_mode :
258268 logger ("info" , "Direct I/O tracing enabled via iomap_dio_rw" )
259269 elif BPF .get_kprobe_functions (b'__blockdev_direct_IO' ):
270+ self .add_kprobe ("__blockdev_direct_IO" , "trace_dio_entry_blockdev" )
260271 self .add_kretprobe ("__blockdev_direct_IO" , "trace_dio_return" )
261272 if self .developer_mode :
262273 logger ("info" , "Direct I/O tracing enabled via __blockdev_direct_IO" )
@@ -376,7 +387,8 @@ def attach_probes(self):
376387 if self .developer_mode :
377388 logger ("info" , "io_uring tracing enabled via __io_uring_enter" )
378389 elif BPF .get_kprobe_functions (b'__x64_sys_io_uring_enter' ):
379- self .add_kprobe ("__x64_sys_io_uring_enter" , "trace_io_uring_enter" )
390+ # Syscall wrapper: needs the pt_regs-unwrapping variant.
391+ self .add_kprobe ("__x64_sys_io_uring_enter" , "trace_io_uring_enter_x64" )
380392 if self .developer_mode :
381393 logger ("info" , "io_uring tracing enabled via __x64_sys_io_uring_enter" )
382394 elif BPF .get_kprobe_functions (b'__sys_io_uring_enter' ):
0 commit comments