// Copyright (c) 2015 Brendan Gregg. // Licensed under the Apache License, Version 2.0 (the "License") #include #include BPF_HASH(start, struct request *); BPF_HISTOGRAM(dist); // time block I/O int trace_req_start(struct pt_regs *ctx, struct request *req) { u64 ts = bpf_ktime_get_ns(); start.update(&req, &ts); return 0; } // output int trace_req_done(struct pt_regs *ctx, struct request *req) { u64 *tsp, delta; // fetch timestamp and calculate delta tsp = start.lookup(&req); if (tsp == 0) { return 0; // missed issue } delta = bpf_ktime_get_ns() - *tsp; delta /= 1000; // usec // store as histogram dist.increment(bpf_log2l(delta)); start.delete(&req); return 0; }