int do_count()

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;
}