int softirq_exit()

in src/samplers/interrupt/bpf.c [50:83]


int softirq_exit(struct tracepoint__irq__softirq_exit *args)
{
    u64 delta_us;
    u32 vec;
    u32 pid = bpf_get_current_pid_tgid();
    account_val_t *valp;

    // fetch timestamp and calculate delta
    valp = soft_start.lookup(&pid);
    if (valp == 0) {
        return 0;   // missed start
    }
    delta_us = (bpf_ktime_get_ns() - valp->ts) / 1000ul;
    vec = valp->vec;
    u64 index = value_to_index2(delta_us);

    // May need updates if more softirqs are added
    switch (vec) {
        case 0: hi.increment(index); break;
        case 1: timer.increment(index); break;
        case 2: net_tx.increment(index); break;
        case 3: net_rx.increment(index); break;
        case 4: block.increment(index); break;
        case 5: irq_poll.increment(index); break;
        case 6: tasklet.increment(index); break;
        case 7: sched.increment(index); break;
        case 8: hr_timer.increment(index); break;
        case 9: rcu.increment(index); break;
        default: unknown.increment(index); break;
    }

    soft_start.delete(&pid);
    return 0;
}