#include <uapi/linux/ptrace.h>
typedef struct irq_key {
u32 vec;
u64 slot;
} irq_key_t;
typedef struct account_val {
u64 ts;
u32 vec;
} account_val_t;
BPF_HASH(start, u32, account_val_t);
BPF_HISTOGRAM(dist, irq_key_t);
int softirq_entry(struct tracepoint__irq__softirq_entry *args)
{
u32 pid = bpf_get_current_pid_tgid();
account_val_t val = {};
val.ts = bpf_ktime_get_ns();
val.vec = args->vec;
start.update(&pid, &val);
return 0;
}
int softirq_exit(struct tracepoint__irq__softirq_exit *args)
{
u64 delta;
u32 vec;
u32 pid = bpf_get_current_pid_tgid();
account_val_t *valp;
irq_key_t key = {0};
valp = start.lookup(&pid);
if (valp == 0) {
return 0; }
delta = bpf_ktime_get_ns() - valp->ts;
vec = valp->vec;
key.vec = valp->vec;
u64 zero = 0,
*vp = dist.lookup_or_init(&key, &zero);
(*vp) += delta;
start.delete(&pid);
return 0;
}