From: Leo Yan <leo.yan@linux.dev>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
Ian Rogers <irogers@google.com>, Jiri Olsa <jolsa@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
linux-perf-users@vger.kernel.org, Will Deacon <will@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
John Garry <john.g.garry@oracle.com>,
Mike Leach <mike.leach@linaro.org>
Subject: Re: [PATCH] perf tools: Fixup module symbol end address properly
Date: Tue, 13 Feb 2024 11:39:54 +0800 [thread overview]
Message-ID: <20240213033954.GB81405@debian-dev> (raw)
In-Reply-To: <20240212233322.1855161-1-namhyung@kernel.org>
On Mon, Feb 12, 2024 at 03:33:22PM -0800, Namhyung Kim wrote:
> I got a strange error on ARM to fail on processing FINISHED_ROUND
> record. It turned out that it was failing in symbol__alloc_hist()
> because the symbol size is too big.
>
> When a sample is captured on a specific BPF program, it failed. I've
> added a debug code and found the end address of the symbol is from
> the next module which is placed far way.
>
> ffff800008795778-ffff80000879d6d8: bpf_prog_1bac53b8aac4bc58_netcg_sock [bpf]
> ffff80000879d6d8-ffff80000ad656b4: bpf_prog_76867454b5944e15_netcg_getsockopt [bpf]
> ffff80000ad656b4-ffffd69b7af74048: bpf_prog_1d50286d2eb1be85_hn_egress [bpf] <---------- here
> ffffd69b7af74048-ffffd69b7af74048: $x.5 [sha3_generic]
> ffffd69b7af74048-ffffd69b7af740b8: crypto_sha3_init [sha3_generic]
> ffffd69b7af740b8-ffffd69b7af741e0: crypto_sha3_update [sha3_generic]
>
> The logic in symbols__fixup_end() just uses curr->start to update the
> prev->end. But in this case, it won't work as it's too different.
>
> I think ARM has a different kernel memory layout for modules and BPF
> than on x86. Actually there's a logic to handle kernel and module
> boundary. Let's do the same for symbols between different modules.
Even Arm32 and Arm64 kernel have different memory layout for modules
and kernel image.
eBPF program (JITed) should be allocated from the vmalloc region, for
Arm64, see bpf_jit_alloc_exec() in arch/arm64/net/bpf_jit_comp.c.
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/perf/util/symbol.c | 21 +++++++++++++++++++--
> 1 file changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index 35975189999b..9ebdb8e13c0b 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -248,14 +248,31 @@ void symbols__fixup_end(struct rb_root_cached *symbols, bool is_kallsyms)
> * segment is very big. Therefore do not fill this gap and do
> * not assign it to the kernel dso map (kallsyms).
> *
> + * Also BPF code can be allocated separately from text segments
> + * and modules. So the last entry in a module should not fill
> + * the gap too.
> + *
> * In kallsyms, it determines module symbols using '[' character
> * like in:
> * ffffffffc1937000 T hdmi_driver_init [snd_hda_codec_hdmi]
> */
> if (prev->end == prev->start) {
> + const char *prev_mod;
> + const char *curr_mod;
> +
> + if (!is_kallsyms) {
> + prev->end = curr->start;
> + continue;
> + }
> +
> + prev_mod = strchr(prev->name, '[');
> + curr_mod = strchr(curr->name, '[');
> +
> /* Last kernel/module symbol mapped to end of page */
> - if (is_kallsyms && (!strchr(prev->name, '[') !=
> - !strchr(curr->name, '[')))
> + if (!prev_mod != !curr_mod)
> + prev->end = roundup(prev->end + 4096, 4096);
> + /* Last symbol in the previous module */
> + else if (prev_mod && strcmp(prev_mod, curr_mod))
Should two consecutive moudles fall into this case? I think we need to assign
'prev->end = curr->start' for two two consecutive moudles.
If so, we should use a specific checking for eBPF program, e.g.:
else if (prev_mod && strcmp(prev_mod, curr_mod) &&
(!strcmp(prev->name, "bpf") ||
!strcmp(curr->name, "bpf")))
Thanks,
Leo
> prev->end = roundup(prev->end + 4096, 4096);
> else
> prev->end = curr->start;
> --
> 2.43.0.687.g38aa6559b0-goog
>
next prev parent reply other threads:[~2024-02-13 3:40 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-12 23:33 [PATCH] perf tools: Fixup module symbol end address properly Namhyung Kim
2024-02-13 3:39 ` Leo Yan [this message]
2024-02-13 18:48 ` Namhyung Kim
2024-02-14 10:14 ` Leo Yan
2024-02-16 5:19 ` Namhyung Kim
2024-02-16 12:29 ` Leo Yan
2024-02-21 2:00 ` Namhyung Kim
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=20240213033954.GB81405@debian-dev \
--to=leo.yan@linux.dev \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=irogers@google.com \
--cc=john.g.garry@oracle.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mike.leach@linaro.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=will@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).