From: Ian Rogers <irogers@google.com>
To: Avi Kivity <avi@scylladb.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: Infinite recursion in `perf record`
Date: Mon, 16 May 2022 15:04:51 -0700 [thread overview]
Message-ID: <CAP-5=fV0rXit7BqBxghE=zK=ao_GYhwkCbu+GhJZebzhVCxq0g@mail.gmail.com> (raw)
In-Reply-To: <f0add43b-3de5-20c5-22c4-70aff4af959f@scylladb.com>
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
next prev parent reply other threads:[~2022-05-16 22:05 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-16 15:22 Infinite recursion in `perf record` Avi Kivity
2022-05-16 22:04 ` Ian Rogers [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAP-5=fV0rXit7BqBxghE=zK=ao_GYhwkCbu+GhJZebzhVCxq0g@mail.gmail.com' \
--to=irogers@google.com \
--cc=avi@scylladb.com \
--cc=linux-perf-users@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).