Skip to content

Commit d9eec93

Browse files
chenhengqiyonghong-song
authored andcommitted
libbpf-tools: Allow offcputime to run on kernels without BPF trampoline
Another compatibility game, allow offcputime to run on kernels without BPF trampoline using raw tracepoint. Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
1 parent 91de381 commit d9eec93

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

libbpf-tools/offcputime.bpf.c

+23-14
Original file line numberDiff line numberDiff line change
@@ -58,53 +58,50 @@ struct {
5858

5959
static bool allow_record(struct task_struct *t)
6060
{
61-
u32 tgid = t->tgid;
62-
u32 pid = t->pid;
61+
u32 tgid = BPF_CORE_READ(t, tgid);
62+
u32 pid = BPF_CORE_READ(t, pid);
6363

6464
if (filter_by_tgid && !bpf_map_lookup_elem(&tgids, &tgid))
6565
return false;
6666
if (filter_by_pid && !bpf_map_lookup_elem(&pids, &pid))
6767
return false;
68-
if (user_threads_only && t->flags & PF_KTHREAD)
68+
if (user_threads_only && (BPF_CORE_READ(t, flags) & PF_KTHREAD))
6969
return false;
70-
else if (kernel_threads_only && !(t->flags & PF_KTHREAD))
70+
else if (kernel_threads_only && !(BPF_CORE_READ(t, flags) & PF_KTHREAD))
7171
return false;
7272
if (state != -1 && get_task_state(t) != state)
7373
return false;
7474
return true;
7575
}
7676

77-
SEC("tp_btf/sched_switch")
78-
int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next)
77+
static int handle_sched_switch(void *ctx, bool preempt, struct task_struct *prev, struct task_struct *next)
7978
{
8079
struct internal_key *i_keyp, i_key;
8180
struct val_t *valp, val;
8281
s64 delta;
8382
u32 pid;
8483

8584
if (allow_record(prev)) {
86-
pid = prev->pid;
85+
pid = BPF_CORE_READ(prev, pid);
8786
/* To distinguish idle threads of different cores */
8887
if (!pid)
8988
pid = bpf_get_smp_processor_id();
9089
i_key.key.pid = pid;
91-
i_key.key.tgid = prev->tgid;
90+
i_key.key.tgid = BPF_CORE_READ(prev, tgid);
9291
i_key.start_ts = bpf_ktime_get_ns();
9392

94-
if (prev->flags & PF_KTHREAD)
93+
if (BPF_CORE_READ(prev, flags) & PF_KTHREAD)
9594
i_key.key.user_stack_id = -1;
9695
else
97-
i_key.key.user_stack_id =
98-
bpf_get_stackid(ctx, &stackmap,
99-
BPF_F_USER_STACK);
96+
i_key.key.user_stack_id = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK);
10097
i_key.key.kern_stack_id = bpf_get_stackid(ctx, &stackmap, 0);
10198
bpf_map_update_elem(&start, &pid, &i_key, 0);
102-
bpf_probe_read_kernel_str(&val.comm, sizeof(prev->comm), prev->comm);
99+
bpf_probe_read_kernel_str(&val.comm, sizeof(prev->comm), BPF_CORE_READ(prev, comm));
103100
val.delta = 0;
104101
bpf_map_update_elem(&info, &i_key.key, &val, BPF_NOEXIST);
105102
}
106103

107-
pid = next->pid;
104+
pid = BPF_CORE_READ(next, pid);
108105
i_keyp = bpf_map_lookup_elem(&start, &pid);
109106
if (!i_keyp)
110107
return 0;
@@ -124,4 +121,16 @@ int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_s
124121
return 0;
125122
}
126123

124+
SEC("tp_btf/sched_switch")
125+
int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next)
126+
{
127+
return handle_sched_switch(ctx, preempt, prev, next);
128+
}
129+
130+
SEC("raw_tp/sched_switch")
131+
int BPF_PROG(sched_switch_raw, bool preempt, struct task_struct *prev, struct task_struct *next)
132+
{
133+
return handle_sched_switch(ctx, preempt, prev, next);
134+
}
135+
127136
char LICENSE[] SEC("license") = "GPL";

libbpf-tools/offcputime.c

+5
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,11 @@ int main(int argc, char **argv)
376376
env.perf_max_stack_depth * sizeof(unsigned long));
377377
bpf_map__set_max_entries(obj->maps.stackmap, env.stack_storage_size);
378378

379+
if (!probe_tp_btf("sched_switch"))
380+
bpf_program__set_autoload(obj->progs.sched_switch, false);
381+
else
382+
bpf_program__set_autoload(obj->progs.sched_switch_raw, false);
383+
379384
err = offcputime_bpf__load(obj);
380385
if (err) {
381386
fprintf(stderr, "failed to load BPF programs\n");

0 commit comments

Comments
 (0)