return log2(v) + 1;
}
-int kprobe__blk_start_request(struct pt_regs *ctx, struct request *req)
+int kprobe__blk_account_io_completion(struct pt_regs *ctx, struct request *req)
{
int index = log2l(req->__data_len / 1024);
u64 *leaf = dist.lookup(&index);
BPF_HASH(start, struct request *);
-void kprobe__blk_start_request(struct pt_regs *ctx, struct request *req) {
+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 kprobe__blk_update_request(struct pt_regs *ctx, struct request *req) {
+void trace_completion(struct pt_regs *ctx, struct request *req) {
u64 *tsp, delta;
tsp = start.lookup(&req);
# load BPF program
b = BPF(src_file="disksnoop.c")
+b.attach_kprobe(event="blk_start_request", fn_name="trace_start")
+b.attach_kprobe(event="blk_mq_start_request", fn_name="trace_start")
+b.attach_kprobe(event="blk_account_io_completion", fn_name="trace_completion")
# header
print("%-18s %-2s %-7s %8s" % ("TIME(s)", "T", "BYTES", "LAT(ms)"))