xref: /aosp_15_r20/external/bcc/examples/tracing/vfsreadlat.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * vfsreadlat.c		VFS read latency distribution.
3*387f9dfdSAndroid Build Coastguard Worker  *			For Linux, uses BCC, eBPF. See .py file.
4*387f9dfdSAndroid Build Coastguard Worker  *
5*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) 2013-2015 PLUMgrid, http://plumgrid.com
6*387f9dfdSAndroid Build Coastguard Worker  * This program is free software; you can redistribute it and/or
7*387f9dfdSAndroid Build Coastguard Worker  * modify it under the terms of version 2 of the GNU General Public
8*387f9dfdSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation.
9*387f9dfdSAndroid Build Coastguard Worker  *
10*387f9dfdSAndroid Build Coastguard Worker  * 15-Aug-2015	Brendan Gregg	Created this.
11*387f9dfdSAndroid Build Coastguard Worker  */
12*387f9dfdSAndroid Build Coastguard Worker 
13*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/ptrace.h>
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(start, u32);
16*387f9dfdSAndroid Build Coastguard Worker BPF_HISTOGRAM(dist);
17*387f9dfdSAndroid Build Coastguard Worker 
do_entry(struct pt_regs * ctx)18*387f9dfdSAndroid Build Coastguard Worker int do_entry(struct pt_regs *ctx)
19*387f9dfdSAndroid Build Coastguard Worker {
20*387f9dfdSAndroid Build Coastguard Worker 	u32 pid;
21*387f9dfdSAndroid Build Coastguard Worker 	u64 ts;
22*387f9dfdSAndroid Build Coastguard Worker 
23*387f9dfdSAndroid Build Coastguard Worker 	pid = bpf_get_current_pid_tgid();
24*387f9dfdSAndroid Build Coastguard Worker 	ts = bpf_ktime_get_ns();
25*387f9dfdSAndroid Build Coastguard Worker 	start.update(&pid, &ts);
26*387f9dfdSAndroid Build Coastguard Worker 	return 0;
27*387f9dfdSAndroid Build Coastguard Worker }
28*387f9dfdSAndroid Build Coastguard Worker 
do_return(struct pt_regs * ctx)29*387f9dfdSAndroid Build Coastguard Worker int do_return(struct pt_regs *ctx)
30*387f9dfdSAndroid Build Coastguard Worker {
31*387f9dfdSAndroid Build Coastguard Worker 	u32 pid;
32*387f9dfdSAndroid Build Coastguard Worker 	u64 *tsp, delta;
33*387f9dfdSAndroid Build Coastguard Worker 
34*387f9dfdSAndroid Build Coastguard Worker 	pid = bpf_get_current_pid_tgid();
35*387f9dfdSAndroid Build Coastguard Worker 	tsp = start.lookup(&pid);
36*387f9dfdSAndroid Build Coastguard Worker 
37*387f9dfdSAndroid Build Coastguard Worker 	if (tsp != 0) {
38*387f9dfdSAndroid Build Coastguard Worker 		delta = bpf_ktime_get_ns() - *tsp;
39*387f9dfdSAndroid Build Coastguard Worker 		dist.increment(bpf_log2l(delta / 1000));
40*387f9dfdSAndroid Build Coastguard Worker 		start.delete(&pid);
41*387f9dfdSAndroid Build Coastguard Worker 	}
42*387f9dfdSAndroid Build Coastguard Worker 
43*387f9dfdSAndroid Build Coastguard Worker 	return 0;
44*387f9dfdSAndroid Build Coastguard Worker }
45