Commit 0e501a65 authored by Namhyung Kim's avatar Namhyung Kim

perf record: Fix BTF type checks in the off-cpu profiling

The BTF func proto for a tracepoint has one more argument than the
actual tracepoint function since it has a context argument at the
begining.  So it should compare to 5 when the tracepoint has 4
arguments.

  typedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int);

Also, recent change in the perf tool would use a hand-written minimal
vmlinux.h to generate BTF in the skeleton.  So it won't have the info
of the tracepoint.  Anyway it should use the kernel's vmlinux BTF to
check the type in the kernel.

Fixes: b36888f7 ("perf record: Handle argument change in sched_switch")
Reviewed-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarSong Liu <song@kernel.org>
Cc: Hao Luo <haoluo@google.com>
CC: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20230922234444.3115821-1-namhyung@kernel.orgSigned-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent bb2e04d4
......@@ -98,7 +98,7 @@ static void off_cpu_finish(void *arg __maybe_unused)
/* v5.18 kernel added prev_state arg, so it needs to check the signature */
static void check_sched_switch_args(void)
{
const struct btf *btf = bpf_object__btf(skel->obj);
const struct btf *btf = btf__load_vmlinux_btf();
const struct btf_type *t1, *t2, *t3;
u32 type_id;
......@@ -116,7 +116,8 @@ static void check_sched_switch_args(void)
return;
t3 = btf__type_by_id(btf, t2->type);
if (t3 && btf_is_func_proto(t3) && btf_vlen(t3) == 4) {
/* btf_trace func proto has one more argument for the context */
if (t3 && btf_is_func_proto(t3) && btf_vlen(t3) == 5) {
/* new format: pass prev_state as 4th arg */
skel->rodata->has_prev_state = true;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment