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 Workerint 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 Workerint 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