1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) 2020 Anton Protopopov 3 // 4 // Based on vfsstat(8) from BCC by Brendan Gregg 5 #include <vmlinux.h> 6 #include <bpf/bpf_helpers.h> 7 #include <bpf/bpf_tracing.h> 8 #include "vfsstat.h" 9 10 __u64 stats[S_MAXSTAT] = {}; 11 inc_stats(int key)12static __always_inline int inc_stats(int key) 13 { 14 __atomic_add_fetch(&stats[key], 1, __ATOMIC_RELAXED); 15 return 0; 16 } 17 18 SEC("kprobe/vfs_read") BPF_KPROBE(kprobe_vfs_read)19int BPF_KPROBE(kprobe_vfs_read) 20 { 21 return inc_stats(S_READ); 22 } 23 24 SEC("kprobe/vfs_write") BPF_KPROBE(kprobe_vfs_write)25int BPF_KPROBE(kprobe_vfs_write) 26 { 27 return inc_stats(S_WRITE); 28 } 29 30 SEC("kprobe/vfs_fsync") BPF_KPROBE(kprobe_vfs_fsync)31int BPF_KPROBE(kprobe_vfs_fsync) 32 { 33 return inc_stats(S_FSYNC); 34 } 35 36 SEC("kprobe/vfs_open") BPF_KPROBE(kprobe_vfs_open)37int BPF_KPROBE(kprobe_vfs_open) 38 { 39 return inc_stats(S_OPEN); 40 } 41 42 SEC("kprobe/vfs_create") BPF_KPROBE(kprobe_vfs_create)43int BPF_KPROBE(kprobe_vfs_create) 44 { 45 return inc_stats(S_CREATE); 46 } 47 48 SEC("fentry/vfs_read") BPF_PROG(fentry_vfs_read)49int BPF_PROG(fentry_vfs_read) 50 { 51 return inc_stats(S_READ); 52 } 53 54 SEC("fentry/vfs_write") BPF_PROG(fentry_vfs_write)55int BPF_PROG(fentry_vfs_write) 56 { 57 return inc_stats(S_WRITE); 58 } 59 60 SEC("fentry/vfs_fsync") BPF_PROG(fentry_vfs_fsync)61int BPF_PROG(fentry_vfs_fsync) 62 { 63 return inc_stats(S_FSYNC); 64 } 65 66 SEC("fentry/vfs_open") BPF_PROG(fentry_vfs_open)67int BPF_PROG(fentry_vfs_open) 68 { 69 return inc_stats(S_OPEN); 70 } 71 72 SEC("fentry/vfs_create") BPF_PROG(fentry_vfs_create)73int BPF_PROG(fentry_vfs_create) 74 { 75 return inc_stats(S_CREATE); 76 } 77 78 char LICENSE[] SEC("license") = "GPL"; 79