int trace_req_start()

in src/samplers/disk/bpf.c [40:65]


int trace_req_start(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

    u64 *enqueued;
    enqueued = queue_start.lookup(&req);
    if (enqueued != 0) {
        unsigned int index = value_to_index2((now - *enqueued) / 1000);
        if (rwflag == 1) {
            queue_latency_write.increment(index);
        } else {
            queue_latency_read.increment(index);
        }
    }
    request_start.update(&req, &now);
    return 0;
}