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