2023-05-12 07:47 UTC-0700 ~ Yonghong Song <yhs@xxxxxxxx> > > > On 5/12/23 3:33 AM, Quentin Monnet wrote: >> From: Alexander Lobakin <alobakin@xxxxx> >> >> When building bpftool with !CONFIG_PERF_EVENTS: >> >> skeleton/pid_iter.bpf.c:47:14: error: incomplete definition of type >> 'struct bpf_perf_link' >> perf_link = container_of(link, struct bpf_perf_link, link); >> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h:74:22: >> note: expanded from macro 'container_of' >> ((type *)(__mptr - offsetof(type, member))); \ >> ^~~~~~~~~~~~~~~~~~~~~~ >> tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h:68:60: >> note: expanded from macro 'offsetof' >> #define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) >> ~~~~~~~~~~~^ >> skeleton/pid_iter.bpf.c:44:9: note: forward declaration of 'struct >> bpf_perf_link' >> struct bpf_perf_link *perf_link; >> ^ >> >> &bpf_perf_link is being defined and used only under the ifdef. >> Define struct bpf_perf_link___local with the `preserve_access_index` >> attribute inside the pid_iter BPF prog to allow compiling on any >> configs. CO-RE will substitute it with the real struct bpf_perf_link >> accesses later on. >> container_of() is not CO-REd, but it is a noop for > > 'container_of() is not CO-REd' is incorrect. > > #define container_of(ptr, type, member) \ > ({ \ > void *__mptr = (void *)(ptr); \ > ((type *)(__mptr - offsetof(type, member))); \ > }) > > > offsetof() will do necessary CO-RE relocation if the field is specified > with preserve_access_index attribute. So container_of will actually > do CO-RE relocation as well. Thanks! I'll amend the description for the next iteration. Quentin