in src/samplers/disk/bpf.c [67:122]
int do_count(struct pt_regs *ctx, struct request *req)
{
u64 now = bpf_ktime_get_ns();
u64 rwflag = 0;
#ifdef REQ_WRITE
rwflag = !!(req->cmd_flags & REQ_WRITE);
#elif defined(REQ_OP_SHIFT)
rwflag = !!((req->cmd_flags >> REQ_OP_SHIFT) == REQ_OP_WRITE);
#else
rwflag = !!((req->cmd_flags & REQ_OP_MASK) == REQ_OP_WRITE);
#endif
// Size
struct val_t *valp;
valp = commbyreq.lookup(&req);
if (valp == 0) {
return 0;
}
u64 delta = req->__data_len / 1024;
unsigned int index = value_to_index2(delta);
if (req->__data_len > 0) {
if (rwflag == 1) {
io_size_write.increment(index);
} else {
io_size_read.increment(index);
}
}
// Latency
u64 *enqueued, *requested;
// total latency including queued time
enqueued = queue_start.lookup(&req);
if (enqueued != 0) {
unsigned int index = value_to_index2((now - *enqueued) / 1000);
if (rwflag == 1) {
latency_write.increment(index);
} else {
latency_read.increment(index);
}
}
// request latency not including queued time
requested = request_start.lookup(&req);
if (requested != 0) {
unsigned int index = value_to_index2((now - *requested) / 1000);
if (rwflag == 1) {
device_latency_write.increment(index);
} else {
device_latency_read.increment(index);
}
}
return 0;
}