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