* 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).