xref: /aosp_15_r20/external/bcc/examples/tracing/task_switch.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/ptrace.h>
2*387f9dfdSAndroid Build Coastguard Worker #include <linux/sched.h>
3*387f9dfdSAndroid Build Coastguard Worker 
4*387f9dfdSAndroid Build Coastguard Worker struct key_t {
5*387f9dfdSAndroid Build Coastguard Worker     u32 prev_pid;
6*387f9dfdSAndroid Build Coastguard Worker     u32 curr_pid;
7*387f9dfdSAndroid Build Coastguard Worker };
8*387f9dfdSAndroid Build Coastguard Worker 
9*387f9dfdSAndroid Build Coastguard Worker BPF_HASH(stats, struct key_t, u64, 1024);
count_sched(struct pt_regs * ctx,struct task_struct * prev)10*387f9dfdSAndroid Build Coastguard Worker int count_sched(struct pt_regs *ctx, struct task_struct *prev) {
11*387f9dfdSAndroid Build Coastguard Worker     struct key_t key = {};
12*387f9dfdSAndroid Build Coastguard Worker     u64 zero = 0, *val;
13*387f9dfdSAndroid Build Coastguard Worker 
14*387f9dfdSAndroid Build Coastguard Worker     key.curr_pid = bpf_get_current_pid_tgid();
15*387f9dfdSAndroid Build Coastguard Worker     key.prev_pid = prev->pid;
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker     // could also use `stats.increment(key);`
18*387f9dfdSAndroid Build Coastguard Worker     val = stats.lookup_or_try_init(&key, &zero);
19*387f9dfdSAndroid Build Coastguard Worker     if (val) {
20*387f9dfdSAndroid Build Coastguard Worker         (*val)++;
21*387f9dfdSAndroid Build Coastguard Worker     }
22*387f9dfdSAndroid Build Coastguard Worker     return 0;
23*387f9dfdSAndroid Build Coastguard Worker }
24