perf tools: Get a perf cgroup more portably in BPF
authorNamhyung Kim <namhyung@kernel.org>
Fri, 23 Sep 2022 06:32:05 +0000 (23:32 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 26 Sep 2022 13:05:50 +0000 (10:05 -0300)
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>
tools/perf/util/bpf_skel/bperf_cgroup.bpf.c
tools/perf/util/bpf_skel/off_cpu.bpf.c

index c72f8ad96f75191b9c017207d675cd25a39ca23d..9aa8cdd93de4e350fce6be3bcebd2892acc1458b 100644 (file)
@@ -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++) {
index c4ba2bcf179f44c1069825a54e7c01b3c6ffcb9c..38e3b287dbb225885f24d31acebff75d24e5dab1 100644 (file)
@@ -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);
 }