xref: /aosp_15_r20/external/bcc/libbpf-tools/fsdist.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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