linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Avi Kivity <avi@scylladb.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: linux-perf-users@vger.kernel.org, Jiri Olsa <jolsa@kernel.org>,
	Ian Rogers <irogers@google.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>
Subject: Re: Infinite recursion in `perf record`
Date: Tue, 17 May 2022 17:59:17 +0300	[thread overview]
Message-ID: <9f21cc03-f411-828d-7817-5d9570d43ba1@scylladb.com> (raw)
In-Reply-To: <YoO2wrQ41W1lO88T@kernel.org>


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
>>

  reply	other threads:[~2022-05-17 14:59 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
2022-05-17 13:23   ` Avi Kivity
2022-05-17 14:52 ` Arnaldo Carvalho de Melo
2022-05-17 14:59   ` Avi Kivity [this message]
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=9f21cc03-f411-828d-7817-5d9570d43ba1@scylladb.com \
    --to=avi@scylladb.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=namhyung@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).