libbpf-tools: use raw_tp sched_switch instead of kprobe
authorWenbo Zhang <ethercflow@gmail.com>
Fri, 26 Mar 2021 02:53:18 +0000 (10:53 +0800)
committeryonghong-song <ys114321@gmail.com>
Thu, 1 Apr 2021 14:54:01 +0000 (07:54 -0700)
Signed-off-by: Wenbo Zhang <ethercflow@gmail.com>
libbpf-tools/cpudist.bpf.c

index a115897f6c94fd35fabbe25371e85541748a0ab4..bee2af9eb19882dc2d18a1f2d8de1a926569f264 100644 (file)
@@ -62,7 +62,8 @@ static __always_inline void update_hist(struct task_struct *task,
                histp = bpf_map_lookup_elem(&hists, &id);
                if (!histp)
                        return;
-               BPF_CORE_READ_STR_INTO(&histp->comm, task, comm);
+               bpf_probe_read_kernel_str(&histp->comm, sizeof(task->comm),
+                                         task->comm);
        }
        delta = ts - *tsp;
        if (targ_ms)
@@ -75,20 +76,19 @@ static __always_inline void update_hist(struct task_struct *task,
        __sync_fetch_and_add(&histp->slots[slot], 1);
 }
 
-SEC("kprobe/finish_task_switch")
-int BPF_KPROBE(finish_task_switch, struct task_struct *prev)
+SEC("tp_btf/sched_switch")
+int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev,
+            struct task_struct *next)
 {
-       u32 prev_tgid = BPF_CORE_READ(prev, tgid);
-       u32 prev_pid = BPF_CORE_READ(prev, pid);
-       u64 id = bpf_get_current_pid_tgid();
-       u32 tgid = id >> 32, pid = id;
+       u32 prev_tgid = prev->tgid, prev_pid = prev->pid;
+       u32 tgid = next->tgid, pid = next->pid;
        u64 ts = bpf_ktime_get_ns();
 
        if (targ_offcpu) {
                store_start(prev_tgid, prev_pid, ts);
-               update_hist((void*)bpf_get_current_task(), tgid, pid, ts);
+               update_hist(next, tgid, pid, ts);
        } else {
-               if (BPF_CORE_READ(prev, state) == TASK_RUNNING)
+               if (prev->state == TASK_RUNNING)
                        update_hist(prev, prev_tgid, prev_pid, ts);
                store_start(tgid, pid, ts);
        }