perf tools: Get a perf cgroup more portably in BPF
The perf_event_cgrp_id can be different on other configurations. To be more portable as CO-RE, it needs to get the cgroup subsys id using the bpf_core_enum_value() helper. Suggested-by: Ian Rogers <irogers@google.com> Reviewed-by: Ian Rogers <irogers@google.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Hao Luo <haoluo@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <songliubraving@fb.com> Cc: bpf@vger.kernel.org Link: https://lore.kernel.org/r/20220923063205.772936-1-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
f76349cf41
commit
e42c9c54f2
@ -48,6 +48,7 @@ const volatile __u32 num_cpus = 1;
|
||||
|
||||
int enabled = 0;
|
||||
int use_cgroup_v2 = 0;
|
||||
int perf_subsys_id = -1;
|
||||
|
||||
static inline int get_cgroup_v1_idx(__u32 *cgrps, int size)
|
||||
{
|
||||
@ -58,7 +59,15 @@ static inline int get_cgroup_v1_idx(__u32 *cgrps, int size)
|
||||
int level;
|
||||
int cnt;
|
||||
|
||||
cgrp = BPF_CORE_READ(p, cgroups, subsys[perf_event_cgrp_id], cgroup);
|
||||
if (perf_subsys_id == -1) {
|
||||
#if __has_builtin(__builtin_preserve_enum_value)
|
||||
perf_subsys_id = bpf_core_enum_value(enum cgroup_subsys_id,
|
||||
perf_event_cgrp_id);
|
||||
#else
|
||||
perf_subsys_id = perf_event_cgrp_id;
|
||||
#endif
|
||||
}
|
||||
cgrp = BPF_CORE_READ(p, cgroups, subsys[perf_subsys_id], cgroup);
|
||||
level = BPF_CORE_READ(cgrp, level);
|
||||
|
||||
for (cnt = 0; i < MAX_LEVELS; i++) {
|
||||
|
@ -94,6 +94,8 @@ const volatile bool has_prev_state = false;
|
||||
const volatile bool needs_cgroup = false;
|
||||
const volatile bool uses_cgroup_v1 = false;
|
||||
|
||||
int perf_subsys_id = -1;
|
||||
|
||||
/*
|
||||
* Old kernel used to call it task_struct->state and now it's '__state'.
|
||||
* Use BPF CO-RE "ignored suffix rule" to deal with it like below:
|
||||
@ -119,11 +121,19 @@ static inline __u64 get_cgroup_id(struct task_struct *t)
|
||||
{
|
||||
struct cgroup *cgrp;
|
||||
|
||||
if (uses_cgroup_v1)
|
||||
cgrp = BPF_CORE_READ(t, cgroups, subsys[perf_event_cgrp_id], cgroup);
|
||||
else
|
||||
cgrp = BPF_CORE_READ(t, cgroups, dfl_cgrp);
|
||||
if (!uses_cgroup_v1)
|
||||
return BPF_CORE_READ(t, cgroups, dfl_cgrp, kn, id);
|
||||
|
||||
if (perf_subsys_id == -1) {
|
||||
#if __has_builtin(__builtin_preserve_enum_value)
|
||||
perf_subsys_id = bpf_core_enum_value(enum cgroup_subsys_id,
|
||||
perf_event_cgrp_id);
|
||||
#else
|
||||
perf_subsys_id = perf_event_cgrp_id;
|
||||
#endif
|
||||
}
|
||||
|
||||
cgrp = BPF_CORE_READ(t, cgroups, subsys[perf_subsys_id], cgroup);
|
||||
return BPF_CORE_READ(cgrp, kn, id);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user