| /* |
| * disksnoop.c Trace block device I/O: basic version of iosnoop. |
| * For Linux, uses BCC, eBPF. See .py file. |
| * |
| * Copyright (c) 2015 Brendan Gregg. |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of version 2 of the GNU General Public |
| * License as published by the Free Software Foundation. |
| * |
| * 11-Aug-2015 Brendan Gregg Created this. |
| */ |
| |
| #include <uapi/linux/ptrace.h> |
| #include <linux/blkdev.h> |
| |
| BPF_HASH(start, struct request *); |
| |
| void trace_start(struct pt_regs *ctx, struct request *req) { |
| // stash start timestamp by request ptr |
| u64 ts = bpf_ktime_get_ns(); |
| |
| start.update(&req, &ts); |
| } |
| |
| void trace_completion(struct pt_regs *ctx, struct request *req) { |
| u64 *tsp, delta; |
| |
| tsp = start.lookup(&req); |
| if (tsp != 0) { |
| delta = bpf_ktime_get_ns() - *tsp; |
| bpf_trace_printk("%d %x %d\n", req->__data_len, |
| req->cmd_flags, delta / 1000); |
| start.delete(&req); |
| } |
| } |