* Infinite recursion in `perf record`
@ 2022-05-16 15:22 Avi Kivity
2022-05-16 22:04 ` Ian Rogers
2022-05-17 14:52 ` Arnaldo Carvalho de Melo
0 siblings, 2 replies; 6+ messages in thread
From: Avi Kivity @ 2022-05-16 15:22 UTC (permalink / raw)
To: linux-perf-users
In bpf-event.c we have:
struct btf * __weak btf__load_from_kernel_by_id(__u32 id)
{
struct btf *btf;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
int err = btf__get_from_id(id, &btf);
#pragma GCC diagnostic pop
return err ? ERR_PTR(err) : btf;
}
and in btf.c we have:
int btf__get_from_id(__u32 id, struct btf **btf)
{
struct btf *res;
int err;
*btf = NULL;
res = btf__load_from_kernel_by_id(id);
err = libbpf_get_error(res);
if (err)
return libbpf_err(err);
*btf = res;
return 0;
}
Obviously, if the first weak symbol isn't overridden we get into an
infinite recursion, which is what I see immediately on running perf record:
(gdb) bt
#0 0x00007f3d94c26d76 in btf__get_from_id (id=282,
btf=btf@entry=0x7ffc1dab4010) at btf.c:1410
#1 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#2 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4060) at btf.c:1411
#3 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#4 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab40b0) at btf.c:1411
#5 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#6 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4100) at btf.c:1411
#7 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#8 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4150) at btf.c:1411
#9 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#10 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab41a0) at btf.c:1411
#11 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#12 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab41f0) at btf.c:1411
#13 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#14 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4240) at btf.c:1411
#15 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#16 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4290) at btf.c:1411
#17 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#18 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab42e0) at btf.c:1411
#19 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#20 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4330) at btf.c:1411
#21 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#22 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4380) at btf.c:1411
#23 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#24 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab43d0) at btf.c:1411
#25 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#26 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4420) at btf.c:1411
#27 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#28 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4470) at btf.c:1411
#29 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#30 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab44c0) at btf.c:1411
#31 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#32 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4510) at btf.c:1411
#33 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#34 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4560) at btf.c:1411
#35 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#36 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab45b0) at btf.c:1411
#37 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#38 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4600) at btf.c:1411
#39 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#40 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4650) at btf.c:1411
#41 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#42 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab46a0) at btf.c:1411
#43 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#44 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab46f0) at btf.c:1411
#45 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#46 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4740) at btf.c:1411
#47 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#48 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4790) at btf.c:1411
#49 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#50 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab47e0) at btf.c:1411
#51 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#52 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4830) at btf.c:1411
#53 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#54 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4880) at btf.c:1411
#55 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#56 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab48d0) at btf.c:1411
#57 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#58 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4920) at btf.c:1411
#59 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#60 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4970) at btf.c:1411
#61 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#62 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab49c0) at btf.c:1411
#63 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#64 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4a10) at btf.c:1411
#65 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#66 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4a60) at btf.c:1411
#67 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#68 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4ab0) at btf.c:1411
#69 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#70 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4b00) at btf.c:1411
#71 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#72 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4b50) at btf.c:1411
#73 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#74 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4ba0) at btf.c:1411
#75 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#76 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4bf0) at btf.c:1411
#77 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
#78 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>,
btf=btf@entry=0x7ffc1dab4c40) at btf.c:1411
#79 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized
out>) at util/bpf-event.c:30
--Type <RET> for more, q to quit, c to continue without paging--
(rest of infinite stack trace omitted)
I guess I should load some library or other, but I have no idea which,
and in any case this is quite a fragile interface.
perf-5.17.6-300.fc36.x86_64
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: Infinite recursion in `perf record` 2022-05-16 15:22 Infinite recursion in `perf record` Avi Kivity @ 2022-05-16 22:04 ` Ian Rogers 2022-05-17 13:23 ` Avi Kivity 2022-05-17 14:52 ` Arnaldo Carvalho de Melo 1 sibling, 1 reply; 6+ messages in thread From: Ian Rogers @ 2022-05-16 22:04 UTC (permalink / raw) To: Avi Kivity; +Cc: linux-perf-users On Mon, May 16, 2022 at 8:23 AM Avi Kivity <avi@scylladb.com> wrote: > > In bpf-event.c we have: > > > struct btf * __weak btf__load_from_kernel_by_id(__u32 id) > { > struct btf *btf; > #pragma GCC diagnostic push > #pragma GCC diagnostic ignored "-Wdeprecated-declarations" > int err = btf__get_from_id(id, &btf); > #pragma GCC diagnostic pop > > return err ? ERR_PTR(err) : btf; > } > > and in btf.c we have: > > > int btf__get_from_id(__u32 id, struct btf **btf) > { > struct btf *res; > int err; > > *btf = NULL; > res = btf__load_from_kernel_by_id(id); > err = libbpf_get_error(res); > > if (err) > return libbpf_err(err); > > *btf = res; > return 0; > } > > Obviously, if the first weak symbol isn't overridden we get into an > infinite recursion, which is what I see immediately on running perf record: > > > (gdb) bt > #0 0x00007f3d94c26d76 in btf__get_from_id (id=282, > btf=btf@entry=0x7ffc1dab4010) at btf.c:1410 > #1 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #2 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4060) at btf.c:1411 > #3 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #4 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab40b0) at btf.c:1411 > #5 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #6 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4100) at btf.c:1411 > #7 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #8 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4150) at btf.c:1411 > #9 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #10 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab41a0) at btf.c:1411 > #11 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #12 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab41f0) at btf.c:1411 > #13 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #14 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4240) at btf.c:1411 > #15 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #16 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4290) at btf.c:1411 > #17 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #18 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab42e0) at btf.c:1411 > #19 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #20 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4330) at btf.c:1411 > #21 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #22 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4380) at btf.c:1411 > #23 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #24 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab43d0) at btf.c:1411 > #25 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #26 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4420) at btf.c:1411 > #27 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #28 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4470) at btf.c:1411 > #29 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #30 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab44c0) at btf.c:1411 > #31 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #32 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4510) at btf.c:1411 > #33 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #34 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4560) at btf.c:1411 > #35 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #36 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab45b0) at btf.c:1411 > #37 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #38 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4600) at btf.c:1411 > #39 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #40 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4650) at btf.c:1411 > #41 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #42 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab46a0) at btf.c:1411 > #43 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #44 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab46f0) at btf.c:1411 > #45 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #46 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4740) at btf.c:1411 > #47 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #48 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4790) at btf.c:1411 > #49 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #50 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab47e0) at btf.c:1411 > #51 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #52 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4830) at btf.c:1411 > #53 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #54 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4880) at btf.c:1411 > #55 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #56 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab48d0) at btf.c:1411 > #57 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #58 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4920) at btf.c:1411 > #59 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #60 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4970) at btf.c:1411 > #61 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #62 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab49c0) at btf.c:1411 > #63 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #64 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4a10) at btf.c:1411 > #65 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #66 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4a60) at btf.c:1411 > #67 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #68 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4ab0) at btf.c:1411 > #69 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #70 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4b00) at btf.c:1411 > #71 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #72 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4b50) at btf.c:1411 > #73 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #74 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4ba0) at btf.c:1411 > #75 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #76 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4bf0) at btf.c:1411 > #77 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > #78 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4c40) at btf.c:1411 > #79 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized > out>) at util/bpf-event.c:30 > --Type <RET> for more, q to quit, c to continue without paging-- > > > (rest of infinite stack trace omitted) > > > I guess I should load some library or other, but I have no idea which, > and in any case this is quite a fragile interface. > > > perf-5.17.6-300.fc36.x86_64 > Hi, could you provide more details of the build? I have a bazel based build and weak symbols are a problem for me too. For example, arm and arm64 code needs building and linking together on an arm64 build for the symbols to work properly - normally we just need 1 arch. There have also been issues with constant propagation. I'd prefer if we could use #ifdefs where we explicitly say what we expect to happen on each architecture. Weak symbols' implicit behavior is troublesome. With #ifdefs if things are broken then linking fails, which provides useful signal. Thanks, Ian ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Infinite recursion in `perf record` 2022-05-16 22:04 ` Ian Rogers @ 2022-05-17 13:23 ` Avi Kivity 0 siblings, 0 replies; 6+ messages in thread From: Avi Kivity @ 2022-05-17 13:23 UTC (permalink / raw) To: Ian Rogers; +Cc: linux-perf-users On 17/05/2022 01.04, Ian Rogers wrote: > >> perf-5.17.6-300.fc36.x86_64 >> > Hi, could you provide more details of the build? I have a bazel based > build and weak symbols are a problem for me too. For example, arm and > arm64 code needs building and linking together on an arm64 build for > the symbols to work properly - normally we just need 1 arch. There > have also been issues with constant propagation. I'd prefer if we > could use #ifdefs where we explicitly say what we expect to happen on > each architecture. Weak symbols' implicit behavior is troublesome. > With #ifdefs if things are broken then linking fails, which provides > useful signal. I'm not sure what details you want. The full build log is available here [1]. [1] https://kojipkgs.fedoraproject.org//packages/kernel/5.17.6/300.fc36/data/logs/x86_64/build.log ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Infinite recursion in `perf record` 2022-05-16 15:22 Infinite recursion in `perf record` Avi Kivity 2022-05-16 22:04 ` Ian Rogers @ 2022-05-17 14:52 ` Arnaldo Carvalho de Melo 2022-05-17 14:59 ` Avi Kivity 1 sibling, 1 reply; 6+ messages in thread From: Arnaldo Carvalho de Melo @ 2022-05-17 14:52 UTC (permalink / raw) To: Avi Kivity Cc: linux-perf-users, Jiri Olsa, Ian Rogers, Namhyung Kim, Adrian Hunter Em Mon, May 16, 2022 at 06:22:35PM +0300, Avi Kivity escreveu: > In bpf-event.c we have: > > > struct btf * __weak btf__load_from_kernel_by_id(__u32 id) > { > struct btf *btf; > #pragma GCC diagnostic push > #pragma GCC diagnostic ignored "-Wdeprecated-declarations" > int err = btf__get_from_id(id, &btf); > #pragma GCC diagnostic pop > > return err ? ERR_PTR(err) : btf; > } > > and in btf.c we have: > int btf__get_from_id(__u32 id, struct btf **btf) > { > struct btf *res; > int err; > > *btf = NULL; > res = btf__load_from_kernel_by_id(id); > err = libbpf_get_error(res); > > if (err) > return libbpf_err(err); > > *btf = res; > return 0; > } > > Obviously, if the first weak symbol isn't overridden we get into an infinite > recursion, which is what I see immediately on running perf record: So the intent was to be able to dynamicly link with older and newer libbpf versions, as btf__get_from_id() is being deprecated and btf__load_from_kernel_by_id() isn't available in older libbpf versions. This is all only when linking with the system's libbpf, not with the one in tools/lib/bpf/, when perf does a static link. So I think (will check) that your build is using LIBBPF_DYNAMIC=1, and while there is a test build for that in 'make -C tools/perf build-test'. make_libbpf_dynamic_O: make LIBBPF_DYNAMIC=1 It will cover testing just with the libbpf-devel installed on the tester's machine/container. I couldn't find the perf build log, the link you provided: https://kojipkgs.fedoraproject.org//packages/kernel/5.17.6/300.fc36/data/logs/x86_64/build.log is for the kernel, not tools/perf. I agree with Ian I should have done this using ifdef, a tools/build/feature check that tries to build a test app linking against libbpf-devel with btf__load_from_kernel_by_id(), if it is there, then use it directly, if not, implement it in terms of btf__get_from_id(). I'll try to use my unbroken fingers to do that 8-) - Arnaldo > (gdb) bt > #0 0x00007f3d94c26d76 in btf__get_from_id (id=282, > btf=btf@entry=0x7ffc1dab4010) at btf.c:1410 > #1 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #2 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4060) at btf.c:1411 > #3 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #4 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab40b0) at btf.c:1411 > #5 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #6 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4100) at btf.c:1411 > #7 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #8 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4150) at btf.c:1411 > #9 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #10 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab41a0) at btf.c:1411 > #11 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #12 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab41f0) at btf.c:1411 > #13 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #14 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4240) at btf.c:1411 > #15 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #16 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4290) at btf.c:1411 > #17 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #18 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab42e0) at btf.c:1411 > #19 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #20 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4330) at btf.c:1411 > #21 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #22 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4380) at btf.c:1411 > #23 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #24 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab43d0) at btf.c:1411 > #25 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #26 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4420) at btf.c:1411 > #27 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #28 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4470) at btf.c:1411 > #29 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #30 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab44c0) at btf.c:1411 > #31 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #32 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4510) at btf.c:1411 > #33 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #34 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4560) at btf.c:1411 > #35 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #36 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab45b0) at btf.c:1411 > #37 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #38 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4600) at btf.c:1411 > #39 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #40 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4650) at btf.c:1411 > #41 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #42 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab46a0) at btf.c:1411 > #43 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #44 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab46f0) at btf.c:1411 > #45 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #46 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4740) at btf.c:1411 > #47 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #48 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4790) at btf.c:1411 > #49 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #50 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab47e0) at btf.c:1411 > #51 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #52 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4830) at btf.c:1411 > #53 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #54 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4880) at btf.c:1411 > #55 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #56 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab48d0) at btf.c:1411 > #57 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #58 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4920) at btf.c:1411 > #59 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #60 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4970) at btf.c:1411 > #61 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #62 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab49c0) at btf.c:1411 > #63 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #64 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4a10) at btf.c:1411 > #65 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #66 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4a60) at btf.c:1411 > #67 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #68 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4ab0) at btf.c:1411 > #69 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #70 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4b00) at btf.c:1411 > #71 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #72 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4b50) at btf.c:1411 > #73 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #74 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4ba0) at btf.c:1411 > #75 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #76 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4bf0) at btf.c:1411 > #77 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > #78 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, > btf=btf@entry=0x7ffc1dab4c40) at btf.c:1411 > #79 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) > at util/bpf-event.c:30 > --Type <RET> for more, q to quit, c to continue without paging-- > > > (rest of infinite stack trace omitted) > > > I guess I should load some library or other, but I have no idea which, and > in any case this is quite a fragile interface. > > > perf-5.17.6-300.fc36.x86_64 > -- - Arnaldo ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Infinite recursion in `perf record` 2022-05-17 14:52 ` Arnaldo Carvalho de Melo @ 2022-05-17 14:59 ` Avi Kivity 2022-05-17 21:17 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 6+ messages in thread From: Avi Kivity @ 2022-05-17 14:59 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: linux-perf-users, Jiri Olsa, Ian Rogers, Namhyung Kim, Adrian Hunter On 17/05/2022 17.52, Arnaldo Carvalho de Melo wrote: > Em Mon, May 16, 2022 at 06:22:35PM +0300, Avi Kivity escreveu: >> In bpf-event.c we have: >> >> >> struct btf * __weak btf__load_from_kernel_by_id(__u32 id) >> { >> struct btf *btf; >> #pragma GCC diagnostic push >> #pragma GCC diagnostic ignored "-Wdeprecated-declarations" >> int err = btf__get_from_id(id, &btf); >> #pragma GCC diagnostic pop >> >> return err ? ERR_PTR(err) : btf; >> } >> >> and in btf.c we have: >> int btf__get_from_id(__u32 id, struct btf **btf) >> { >> struct btf *res; >> int err; >> >> *btf = NULL; >> res = btf__load_from_kernel_by_id(id); >> err = libbpf_get_error(res); >> >> if (err) >> return libbpf_err(err); >> >> *btf = res; >> return 0; >> } >> >> Obviously, if the first weak symbol isn't overridden we get into an infinite >> recursion, which is what I see immediately on running perf record: > So the intent was to be able to dynamicly link with older and newer > libbpf versions, as btf__get_from_id() is being deprecated and > btf__load_from_kernel_by_id() isn't available in older libbpf versions. > > This is all only when linking with the system's libbpf, not with the one > in tools/lib/bpf/, when perf does a static link. > > So I think (will check) that your build is using LIBBPF_DYNAMIC=1, and > while there is a test build for that in 'make -C tools/perf build-test'. > > make_libbpf_dynamic_O: make LIBBPF_DYNAMIC=1 > > It will cover testing just with the libbpf-devel installed on the > tester's machine/container. > > I couldn't find the perf build log, the link you provided: > > https://kojipkgs.fedoraproject.org//packages/kernel/5.17.6/300.fc36/data/logs/x86_64/build.log This link should work: https://kojipkgs.fedoraproject.org//packages/kernel-tools/5.17.6/300.fc36/data/logs/x86_64/build.log > is for the kernel, not tools/perf. > > I agree with Ian I should have done this using ifdef, a > tools/build/feature check that tries to build a test app linking against > libbpf-devel with btf__load_from_kernel_by_id(), if it is there, then > use it directly, if not, implement it in terms of btf__get_from_id(). > > I'll try to use my unbroken fingers to do that 8-) Thanks, I hope it doesn't cause more damage. > - Arnaldo > > > >> (gdb) bt >> #0 0x00007f3d94c26d76 in btf__get_from_id (id=282, >> btf=btf@entry=0x7ffc1dab4010) at btf.c:1410 >> #1 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #2 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4060) at btf.c:1411 >> #3 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #4 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab40b0) at btf.c:1411 >> #5 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #6 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4100) at btf.c:1411 >> #7 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #8 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4150) at btf.c:1411 >> #9 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #10 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab41a0) at btf.c:1411 >> #11 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #12 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab41f0) at btf.c:1411 >> #13 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #14 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4240) at btf.c:1411 >> #15 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #16 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4290) at btf.c:1411 >> #17 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #18 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab42e0) at btf.c:1411 >> #19 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #20 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4330) at btf.c:1411 >> #21 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #22 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4380) at btf.c:1411 >> #23 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #24 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab43d0) at btf.c:1411 >> #25 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #26 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4420) at btf.c:1411 >> #27 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #28 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4470) at btf.c:1411 >> #29 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #30 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab44c0) at btf.c:1411 >> #31 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #32 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4510) at btf.c:1411 >> #33 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #34 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4560) at btf.c:1411 >> #35 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #36 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab45b0) at btf.c:1411 >> #37 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #38 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4600) at btf.c:1411 >> #39 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #40 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4650) at btf.c:1411 >> #41 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #42 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab46a0) at btf.c:1411 >> #43 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #44 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab46f0) at btf.c:1411 >> #45 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #46 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4740) at btf.c:1411 >> #47 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #48 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4790) at btf.c:1411 >> #49 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #50 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab47e0) at btf.c:1411 >> #51 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #52 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4830) at btf.c:1411 >> #53 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #54 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4880) at btf.c:1411 >> #55 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #56 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab48d0) at btf.c:1411 >> #57 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #58 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4920) at btf.c:1411 >> #59 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #60 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4970) at btf.c:1411 >> #61 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #62 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab49c0) at btf.c:1411 >> #63 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #64 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4a10) at btf.c:1411 >> #65 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #66 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4a60) at btf.c:1411 >> #67 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #68 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4ab0) at btf.c:1411 >> #69 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #70 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4b00) at btf.c:1411 >> #71 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #72 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4b50) at btf.c:1411 >> #73 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #74 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4ba0) at btf.c:1411 >> #75 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #76 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4bf0) at btf.c:1411 >> #77 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> #78 0x00007f3d94c26d8d in btf__get_from_id (id=<optimized out>, >> btf=btf@entry=0x7ffc1dab4c40) at btf.c:1411 >> #79 0x000055f3ff6d5004 in btf__load_from_kernel_by_id (id=<optimized out>) >> at util/bpf-event.c:30 >> --Type <RET> for more, q to quit, c to continue without paging-- >> >> >> (rest of infinite stack trace omitted) >> >> >> I guess I should load some library or other, but I have no idea which, and >> in any case this is quite a fragile interface. >> >> >> perf-5.17.6-300.fc36.x86_64 >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Infinite recursion in `perf record` 2022-05-17 14:59 ` Avi Kivity @ 2022-05-17 21:17 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 6+ messages in thread From: Arnaldo Carvalho de Melo @ 2022-05-17 21:17 UTC (permalink / raw) To: Avi Kivity Cc: linux-perf-users, Jiri Olsa, Ian Rogers, Namhyung Kim, Adrian Hunter Em Tue, May 17, 2022 at 05:59:17PM +0300, Avi Kivity escreveu: > > On 17/05/2022 17.52, Arnaldo Carvalho de Melo wrote: > > Em Mon, May 16, 2022 at 06:22:35PM +0300, Avi Kivity escreveu: > > > In bpf-event.c we have: > > > > > > > > > struct btf * __weak btf__load_from_kernel_by_id(__u32 id) > > > { > > > struct btf *btf; > > > #pragma GCC diagnostic push > > > #pragma GCC diagnostic ignored "-Wdeprecated-declarations" > > > int err = btf__get_from_id(id, &btf); > > > #pragma GCC diagnostic pop > > > > > > return err ? ERR_PTR(err) : btf; > > > } > > > > > > and in btf.c we have: > > > int btf__get_from_id(__u32 id, struct btf **btf) > > > { > > > struct btf *res; > > > int err; > > > > > > *btf = NULL; > > > res = btf__load_from_kernel_by_id(id); > > > err = libbpf_get_error(res); > > > > > > if (err) > > > return libbpf_err(err); > > > > > > *btf = res; > > > return 0; > > > } > > > > > > Obviously, if the first weak symbol isn't overridden we get into an infinite > > > recursion, which is what I see immediately on running perf record: > > So the intent was to be able to dynamicly link with older and newer > > libbpf versions, as btf__get_from_id() is being deprecated and > > btf__load_from_kernel_by_id() isn't available in older libbpf versions. > > > > This is all only when linking with the system's libbpf, not with the one > > in tools/lib/bpf/, when perf does a static link. > > > > So I think (will check) that your build is using LIBBPF_DYNAMIC=1, and > > while there is a test build for that in 'make -C tools/perf build-test'. > > > > make_libbpf_dynamic_O: make LIBBPF_DYNAMIC=1 > > > > It will cover testing just with the libbpf-devel installed on the > > tester's machine/container. > > > > I couldn't find the perf build log, the link you provided: > > > > https://kojipkgs.fedoraproject.org//packages/kernel/5.17.6/300.fc36/data/logs/x86_64/build.log > > > This link should work: > https://kojipkgs.fedoraproject.org//packages/kernel-tools/5.17.6/300.fc36/data/logs/x86_64/build.log Thanks, I'll check. > > is for the kernel, not tools/perf. > > > > I agree with Ian I should have done this using ifdef, a > > tools/build/feature check that tries to build a test app linking against > > libbpf-devel with btf__load_from_kernel_by_id(), if it is there, then > > use it directly, if not, implement it in terms of btf__get_from_id(). > > > > I'll try to use my unbroken fingers to do that 8-) > Thanks, I hope it doesn't cause more damage. Hopefully not :-) - Arnaldo ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-05-17 21:17 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-05-16 15:22 Infinite recursion in `perf record` Avi Kivity 2022-05-16 22:04 ` Ian Rogers 2022-05-17 13:23 ` Avi Kivity 2022-05-17 14:52 ` Arnaldo Carvalho de Melo 2022-05-17 14:59 ` Avi Kivity 2022-05-17 21:17 ` Arnaldo Carvalho de Melo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).