On Tue, Oct 13, 2020 at 2:03 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > On Tue, Oct 13, 2020 at 12:56 PM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > > > On Thu, Oct 08, 2020 at 06:12:39PM -0700, Alexei Starovoitov wrote: > > > > SNIP > > > > > + > > > +#ifdef UNROLL > > > +#pragma unroll > > > +#endif > > > + for (int i = 0; i < MAX_CGROUPS_PATH_DEPTH; i++) { > > > + filepart_length = > > > + bpf_probe_read_str(payload, MAX_PATH, BPF_CORE_READ(cgroup_node, name)); > > > + if (!cgroup_node) > > > + return payload; > > > + if (cgroup_node == cgroup_root_node) > > > + *root_pos = payload - payload_start; > > > + if (filepart_length <= MAX_PATH) { > > > + barrier_var(filepart_length); > > > + payload += filepart_length; > > > + } > > > + cgroup_node = BPF_CORE_READ(cgroup_node, parent); > > > + } > > > + return payload; > > > +} > > > + > > > +static ino_t get_inode_from_kernfs(struct kernfs_node* node) > > > +{ > > > + struct kernfs_node___52* node52 = (void*)node; > > > + > > > + if (bpf_core_field_exists(node52->id.ino)) { > > > + barrier_var(node52); > > > + return BPF_CORE_READ(node52, id.ino); > > > + } else { > > > + barrier_var(node); > > > + return (u64)BPF_CORE_READ(node, id); > > > + } > > > +} > > > + > > > +int pids_cgrp_id = 1; > > > > > > hi, > > I'm getting compilation failure with this: > > > > CLNG-LLC [test_maps] profiler2.o > > In file included from progs/profiler2.c:6: > > progs/profiler.inc.h:246:5: error: redefinition of 'pids_cgrp_id' as different kind of symbol > > int pids_cgrp_id = 1; > > ^ > > /home/jolsa/linux-qemu/tools/testing/selftests/bpf/tools/include/vmlinux.h:14531:2: note: previous definition is here > > pids_cgrp_id = 11, > > Interesting. > You probably have CONFIG_CGROUP_PIDS in your .config? > I don't and bpf CI doesn't have it either, so this issue wasn't spotted earlier. > > I can hard code 11, of course, but > but maybe Andrii has a cool way to use co-re to deal with this? Cool or not, but we do have a way to deal with it. :) > I think > "extern bool CONFIG_CGROUP_PIDS __kconfig" > won't work. > A good opportunity to try to use bpf_core_enum_value_exists() ? There are fews parts here. First, we can't rely that vmlinux.h has pids_cgrp_id enum defined, so we need to define our own. But in such a way that it doesn't collide with enum cgroup_subsys_id in vmlinux.h. ___suffix for the rescue here: enum cgroup_subsys_id___local { pids_cgrp_id___local = 1, /* anything but zero */ }; If value is zero, built-in will complain. Need to check with Yonghong on why that is. For all things CO-RE, ___local suffix is going to be ignored. Second, detecting if the kernel even has this pids_cgrp_id defined. That could be done with __kconfig as you mentioned, actually (but need __weak as well). But one can also use bpf_core_enum_value_exists as well. So it's either: extern bool CONFIG_CGROUP_PIDS __kconfig __weak; ... if (ENABLE_CGROUP_V1_RESOLVER && CONFIG_CGROUP_PIDS) { ... } Or a bit more verbose way with relos: if (ENABLE_CGROUP_V1_RESOLVER && bpf_core_enum_value_exists(enum cgroup_subsys_id___local, pids_cgrp_id___local)) { ... } Third, actually getting the value of enum. This one would be impossible without CO-RE reloc, but that's exactly what bpf_core_enum_value() exists for: int cgrp_id = bpf_core_enum_value(enum cgroup_subsys_id___local, pids_cgrp_id___local); I'd go with Kconfig + bpf_core_enum_value(), as it's shorter and nicer. This compiles and works with my Kconfig, but I haven't checked with CONFIG_CGROUP_PIDS defined. diff --git a/tools/testing/selftests/bpf/progs/profiler.inc.h b/tools/testing/selftests/bpf/progs/profiler.inc.h index 00578311a423..79b8d2860a5c 100644 --- a/tools/testing/selftests/bpf/progs/profiler.inc.h +++ b/tools/testing/selftests/bpf/progs/profiler.inc.h @@ -243,7 +243,11 @@ static ino_t get_inode_from_kernfs(struct kernfs_node* node) } } -int pids_cgrp_id = 1; +extern bool CONFIG_CGROUP_PIDS __kconfig __weak; + +enum cgroup_subsys_id___local { + pids_cgrp_id___local = 1, /* anything but zero */ +}; static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data, struct task_struct* task, @@ -253,7 +257,9 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data, BPF_CORE_READ(task, nsproxy, cgroup_ns, root_cset, dfl_cgrp, kn); struct kernfs_node* proc_kernfs = BPF_CORE_READ(task, cgroups, dfl_cgrp, kn); - if (ENABLE_CGROUP_V1_RESOLVER) { + if (ENABLE_CGROUP_V1_RESOLVER && CONFIG_CGROUP_PIDS) { + int cgrp_id = bpf_core_enum_value(enum cgroup_subsys_id___local, pids_cgrp_id___local); + #ifdef UNROLL #pragma unroll #endif @@ -262,7 +268,7 @@ static INLINE void* populate_cgroup_info(struct cgroup_data_t* cgroup_data, BPF_CORE_READ(task, cgroups, subsys[i]); if (subsys != NULL) { int subsys_id = BPF_CORE_READ(subsys, ss, id); - if (subsys_id == pids_cgrp_id) { + if (subsys_id == cgrp_id) { proc_kernfs = BPF_CORE_READ(subsys, cgroup, kn); root_kernfs = BPF_CORE_READ(subsys, ss, root, kf_root, kn); break;