1*387f9dfdSAndroid Build Coastguard Worker /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2021 Hengqi Chen */
3*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
6*387f9dfdSAndroid Build Coastguard Worker #include "bits.bpf.h"
7*387f9dfdSAndroid Build Coastguard Worker #include "fsdist.h"
8*387f9dfdSAndroid Build Coastguard Worker
9*387f9dfdSAndroid Build Coastguard Worker #define MAX_ENTRIES 10240
10*387f9dfdSAndroid Build Coastguard Worker
11*387f9dfdSAndroid Build Coastguard Worker const volatile pid_t target_pid = 0;
12*387f9dfdSAndroid Build Coastguard Worker const volatile bool in_ms = false;
13*387f9dfdSAndroid Build Coastguard Worker
14*387f9dfdSAndroid Build Coastguard Worker struct {
15*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_HASH);
16*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, MAX_ENTRIES);
17*387f9dfdSAndroid Build Coastguard Worker __type(key, __u32);
18*387f9dfdSAndroid Build Coastguard Worker __type(value, __u64);
19*387f9dfdSAndroid Build Coastguard Worker } starts SEC(".maps");
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Worker struct hist hists[F_MAX_OP] = {};
22*387f9dfdSAndroid Build Coastguard Worker
probe_entry()23*387f9dfdSAndroid Build Coastguard Worker static int probe_entry()
24*387f9dfdSAndroid Build Coastguard Worker {
25*387f9dfdSAndroid Build Coastguard Worker __u64 pid_tgid = bpf_get_current_pid_tgid();
26*387f9dfdSAndroid Build Coastguard Worker __u32 pid = pid_tgid >> 32;
27*387f9dfdSAndroid Build Coastguard Worker __u32 tid = (__u32)pid_tgid;
28*387f9dfdSAndroid Build Coastguard Worker __u64 ts;
29*387f9dfdSAndroid Build Coastguard Worker
30*387f9dfdSAndroid Build Coastguard Worker if (target_pid && target_pid != pid)
31*387f9dfdSAndroid Build Coastguard Worker return 0;
32*387f9dfdSAndroid Build Coastguard Worker
33*387f9dfdSAndroid Build Coastguard Worker ts = bpf_ktime_get_ns();
34*387f9dfdSAndroid Build Coastguard Worker bpf_map_update_elem(&starts, &tid, &ts, BPF_ANY);
35*387f9dfdSAndroid Build Coastguard Worker return 0;
36*387f9dfdSAndroid Build Coastguard Worker }
37*387f9dfdSAndroid Build Coastguard Worker
probe_return(enum fs_file_op op)38*387f9dfdSAndroid Build Coastguard Worker static int probe_return(enum fs_file_op op)
39*387f9dfdSAndroid Build Coastguard Worker {
40*387f9dfdSAndroid Build Coastguard Worker __u32 tid = (__u32)bpf_get_current_pid_tgid();
41*387f9dfdSAndroid Build Coastguard Worker __u64 ts = bpf_ktime_get_ns();
42*387f9dfdSAndroid Build Coastguard Worker __u64 *tsp, slot;
43*387f9dfdSAndroid Build Coastguard Worker __s64 delta;
44*387f9dfdSAndroid Build Coastguard Worker __u64 udelta;
45*387f9dfdSAndroid Build Coastguard Worker
46*387f9dfdSAndroid Build Coastguard Worker tsp = bpf_map_lookup_elem(&starts, &tid);
47*387f9dfdSAndroid Build Coastguard Worker if (!tsp)
48*387f9dfdSAndroid Build Coastguard Worker return 0;
49*387f9dfdSAndroid Build Coastguard Worker
50*387f9dfdSAndroid Build Coastguard Worker if (op >= F_MAX_OP)
51*387f9dfdSAndroid Build Coastguard Worker goto cleanup;
52*387f9dfdSAndroid Build Coastguard Worker
53*387f9dfdSAndroid Build Coastguard Worker delta = (__s64)(ts - *tsp);
54*387f9dfdSAndroid Build Coastguard Worker if (delta < 0)
55*387f9dfdSAndroid Build Coastguard Worker goto cleanup;
56*387f9dfdSAndroid Build Coastguard Worker
57*387f9dfdSAndroid Build Coastguard Worker udelta = (__u64)delta;
58*387f9dfdSAndroid Build Coastguard Worker if (in_ms)
59*387f9dfdSAndroid Build Coastguard Worker udelta /= 1000000;
60*387f9dfdSAndroid Build Coastguard Worker else
61*387f9dfdSAndroid Build Coastguard Worker udelta /= 1000;
62*387f9dfdSAndroid Build Coastguard Worker
63*387f9dfdSAndroid Build Coastguard Worker slot = log2l(udelta);
64*387f9dfdSAndroid Build Coastguard Worker if (slot >= MAX_SLOTS)
65*387f9dfdSAndroid Build Coastguard Worker slot = MAX_SLOTS - 1;
66*387f9dfdSAndroid Build Coastguard Worker __sync_fetch_and_add(&hists[op].slots[slot], 1);
67*387f9dfdSAndroid Build Coastguard Worker
68*387f9dfdSAndroid Build Coastguard Worker cleanup:
69*387f9dfdSAndroid Build Coastguard Worker bpf_map_delete_elem(&starts, &tid);
70*387f9dfdSAndroid Build Coastguard Worker return 0;
71*387f9dfdSAndroid Build Coastguard Worker }
72*387f9dfdSAndroid Build Coastguard Worker
73*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_file_read")
BPF_KPROBE(file_read_entry)74*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(file_read_entry)
75*387f9dfdSAndroid Build Coastguard Worker {
76*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
77*387f9dfdSAndroid Build Coastguard Worker }
78*387f9dfdSAndroid Build Coastguard Worker
79*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_file_read")
BPF_KRETPROBE(file_read_exit)80*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(file_read_exit)
81*387f9dfdSAndroid Build Coastguard Worker {
82*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_READ);
83*387f9dfdSAndroid Build Coastguard Worker }
84*387f9dfdSAndroid Build Coastguard Worker
85*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_file_write")
BPF_KPROBE(file_write_entry)86*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(file_write_entry)
87*387f9dfdSAndroid Build Coastguard Worker {
88*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
89*387f9dfdSAndroid Build Coastguard Worker }
90*387f9dfdSAndroid Build Coastguard Worker
91*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_file_write")
BPF_KRETPROBE(file_write_exit)92*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(file_write_exit)
93*387f9dfdSAndroid Build Coastguard Worker {
94*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_WRITE);
95*387f9dfdSAndroid Build Coastguard Worker }
96*387f9dfdSAndroid Build Coastguard Worker
97*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_file_open")
BPF_KPROBE(file_open_entry)98*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(file_open_entry)
99*387f9dfdSAndroid Build Coastguard Worker {
100*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
101*387f9dfdSAndroid Build Coastguard Worker }
102*387f9dfdSAndroid Build Coastguard Worker
103*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_file_open")
BPF_KRETPROBE(file_open_exit)104*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(file_open_exit)
105*387f9dfdSAndroid Build Coastguard Worker {
106*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_OPEN);
107*387f9dfdSAndroid Build Coastguard Worker }
108*387f9dfdSAndroid Build Coastguard Worker
109*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_file_sync")
BPF_KPROBE(file_sync_entry)110*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(file_sync_entry)
111*387f9dfdSAndroid Build Coastguard Worker {
112*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
113*387f9dfdSAndroid Build Coastguard Worker }
114*387f9dfdSAndroid Build Coastguard Worker
115*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_file_sync")
BPF_KRETPROBE(file_sync_exit)116*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(file_sync_exit)
117*387f9dfdSAndroid Build Coastguard Worker {
118*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_FSYNC);
119*387f9dfdSAndroid Build Coastguard Worker }
120*387f9dfdSAndroid Build Coastguard Worker
121*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_getattr")
BPF_KPROBE(getattr_entry)122*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(getattr_entry)
123*387f9dfdSAndroid Build Coastguard Worker {
124*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
125*387f9dfdSAndroid Build Coastguard Worker }
126*387f9dfdSAndroid Build Coastguard Worker
127*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_getattr")
BPF_KRETPROBE(getattr_exit)128*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(getattr_exit)
129*387f9dfdSAndroid Build Coastguard Worker {
130*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_GETATTR);
131*387f9dfdSAndroid Build Coastguard Worker }
132*387f9dfdSAndroid Build Coastguard Worker
133*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_file_read")
BPF_PROG(file_read_fentry)134*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_read_fentry)
135*387f9dfdSAndroid Build Coastguard Worker {
136*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
137*387f9dfdSAndroid Build Coastguard Worker }
138*387f9dfdSAndroid Build Coastguard Worker
139*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_file_read")
BPF_PROG(file_read_fexit)140*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_read_fexit)
141*387f9dfdSAndroid Build Coastguard Worker {
142*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_READ);
143*387f9dfdSAndroid Build Coastguard Worker }
144*387f9dfdSAndroid Build Coastguard Worker
145*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_file_write")
BPF_PROG(file_write_fentry)146*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_write_fentry)
147*387f9dfdSAndroid Build Coastguard Worker {
148*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
149*387f9dfdSAndroid Build Coastguard Worker }
150*387f9dfdSAndroid Build Coastguard Worker
151*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_file_write")
BPF_PROG(file_write_fexit)152*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_write_fexit)
153*387f9dfdSAndroid Build Coastguard Worker {
154*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_WRITE);
155*387f9dfdSAndroid Build Coastguard Worker }
156*387f9dfdSAndroid Build Coastguard Worker
157*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_file_open")
BPF_PROG(file_open_fentry)158*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_open_fentry)
159*387f9dfdSAndroid Build Coastguard Worker {
160*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
161*387f9dfdSAndroid Build Coastguard Worker }
162*387f9dfdSAndroid Build Coastguard Worker
163*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_file_open")
BPF_PROG(file_open_fexit)164*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_open_fexit)
165*387f9dfdSAndroid Build Coastguard Worker {
166*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_OPEN);
167*387f9dfdSAndroid Build Coastguard Worker }
168*387f9dfdSAndroid Build Coastguard Worker
169*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_file_sync")
BPF_PROG(file_sync_fentry)170*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_sync_fentry)
171*387f9dfdSAndroid Build Coastguard Worker {
172*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
173*387f9dfdSAndroid Build Coastguard Worker }
174*387f9dfdSAndroid Build Coastguard Worker
175*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_file_sync")
BPF_PROG(file_sync_fexit)176*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(file_sync_fexit)
177*387f9dfdSAndroid Build Coastguard Worker {
178*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_FSYNC);
179*387f9dfdSAndroid Build Coastguard Worker }
180*387f9dfdSAndroid Build Coastguard Worker
181*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_getattr")
BPF_PROG(getattr_fentry)182*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(getattr_fentry)
183*387f9dfdSAndroid Build Coastguard Worker {
184*387f9dfdSAndroid Build Coastguard Worker return probe_entry();
185*387f9dfdSAndroid Build Coastguard Worker }
186*387f9dfdSAndroid Build Coastguard Worker
187*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_getattr")
BPF_PROG(getattr_fexit)188*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(getattr_fexit)
189*387f9dfdSAndroid Build Coastguard Worker {
190*387f9dfdSAndroid Build Coastguard Worker return probe_return(F_GETATTR);
191*387f9dfdSAndroid Build Coastguard Worker }
192*387f9dfdSAndroid Build Coastguard Worker
193*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "Dual BSD/GPL";
194