From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v9 01/18] perf env: Add perf_env__e_machine helper and use in perf_env__arch
Date: Sun, 03 May 2026 00:52:56 +0000 [thread overview]
Message-ID: <20260503005257.16405C19425@smtp.kernel.org> (raw)
In-Reply-To: <20260503002248.1040791-2-irogers@google.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] Backwards and forwards compatibility breakage via architecture normalization.
- [High] Architecture misclassification and data loss due to guaranteed EM_HOST fallback.
- [High] Premature caching of the fallback architecture disables thread-based evaluation.
- [High] Flawed 64-bit kernel detection for MIPS, RISC-V, and legacy endianness suffixes.
--
commit 745bee191a4ba7e972076983225158e66679b6ae
Author: Ian Rogers <irogers@google.com>
perf env: Add perf_env__e_machine helper and use in perf_env__arch
This commit introduces a helper to lazily compute the e_machine from the
perf environment and uses the session's e_machine to derive the architecture
string. It updates the data file header writing to fetch the e_machine and
arch from the session if available.
> diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
> index 1e54e2c86360..0edc67a468ab 100644
> --- a/tools/perf/util/env.c
> +++ b/tools/perf/util/env.c
[ ... ]
> @@ -309,12 +311,21 @@ void perf_env__init(struct perf_env *env)
>
> static void perf_env__init_kernel_mode(struct perf_env *env)
> {
> - const char *arch = perf_env__raw_arch(env);
> + uint16_t e_machine = env->e_machine;
>
> - if (!strncmp(arch, "x86_64", 6) || !strncmp(arch, "aarch64", 7) ||
> - !strncmp(arch, "arm64", 5) || !strncmp(arch, "mips64", 6) ||
> - !strncmp(arch, "parisc64", 8) || !strncmp(arch, "riscv64", 7) ||
> - !strncmp(arch, "s390x", 5) || !strncmp(arch, "sparc64", 7))
> + if (env->arch && (e_machine == EM_NONE || e_machine == EM_MIPS || e_machine == EM_RISCV)) {
> + if (str_ends_with(env->arch, "64") || !strncmp(env->arch, "s390x", 5))
> + env->kernel_is_64_bit = 1;
> + else
> + env->kernel_is_64_bit = 0;
> + return;
> + }
e_machine_to_perf_arch() returns base strings like "mips" or "riscv" without
a "64" suffix. Does this cause new 64-bit MIPS and RISC-V traces to be
misclassified as 32-bit since str_ends_with() will return false?
Additionally, older perf.data files may contain endianness suffixes like
"mips64el" which correctly matched the previous strncmp() logic. Will these
legacy files fail the new str_ends_with("64") check and corrupt 64-bit
traces?
[ ... ]
> @@ -588,51 +599,187 @@ void cpu_cache_level__free(struct cpu_cache_level *cache)
[ ... ]
> -static const char *normalize_arch(char *arch)
> -{
> - if (!strcmp(arch, "x86_64"))
> - return "x86";
> - if (arch[0] == 'i' && arch[2] == '8' && arch[3] == '6')
> - return "x86";
> - if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5))
> - return "sparc";
> - if (!strncmp(arch, "aarch64", 7) || !strncmp(arch, "arm64", 5))
> - return "arm64";
> - if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110"))
> - return "arm";
> - if (!strncmp(arch, "s390", 4))
> - return "s390";
> - if (!strncmp(arch, "parisc", 6))
> - return "parisc";
> - if (!strncmp(arch, "powerpc", 7) || !strncmp(arch, "ppc", 3))
> - return "powerpc";
> - if (!strncmp(arch, "mips", 4))
> - return "mips";
> - if (!strncmp(arch, "sh", 2) && isdigit(arch[2]))
> - return "sh";
> - if (!strncmp(arch, "loongarch", 9))
> - return "loongarch";
> -
> - return arch;
[ ... ]
> const char *perf_env__arch(struct perf_env *env)
> {
> - char *arch_name;
> + uint16_t e_machine;
> + const char *arch;
>
> - if (!env || !env->arch) { /* Assume local operation */
> - static struct utsname uts = { .machine[0] = '\0', };
> - if (uts.machine[0] == '\0' && uname(&uts) < 0)
> - return NULL;
> - arch_name = uts.machine;
> - } else
> - arch_name = env->arch;
> + if (!env)
> + return e_machine_to_perf_arch(EM_HOST);
> +
> + if (env->arch)
> + return env->arch;
>
> - return normalize_arch(arch_name);
> + /*
> + * Lazily compute/allocate arch. The e_machine may have been
> + * read from a data file and so may not be EM_HOST.
> + */
> + e_machine = perf_env__e_machine(env, /*e_flags=*/NULL);
> + arch = e_machine_to_perf_arch(e_machine);
> + env->arch = strdup(arch);
> + /*
> + * Avoid potential crashes on the arch string if memory allocation in
> + * strdup fails and NULL were to be returned.
> + */
> + return env->arch ?: arch;
> }
The removal of normalize_arch() appears to break both backward and forward
compatibility.
When reading older perf.data files, env->arch is populated with the raw
string from the file (e.g., "x86_64"). Without normalize_arch(),
perf_env__arch() will return "x86_64", potentially breaking internal logic
that expects the normalized "x86".
Conversely, for new files, e_machine_to_perf_arch() generates normalized
names like "x86". Older versions of the perf tool expect the raw string for
64-bit detection:
perf_env__init_kernel_mode() {
const char *arch = perf_env__raw_arch(env);
if (!strncmp(arch, "x86_64", 6) || ...
}
Does this mean older perf binaries will incorrectly parse new 64-bit
perf.data files as 32-bit traces?
> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
> index f30e48eb3fc3..f1ae61392cce 100644
> --- a/tools/perf/util/header.c
> +++ b/tools/perf/util/header.c
[ ... ]
> -static int write_arch(struct feat_fd *ff,
> - struct evlist *evlist __maybe_unused)
> +static int write_arch(struct feat_fd *ff, struct evlist *evlist)
> {
> struct utsname uts;
> - int ret;
> + const char *arch = NULL;
>
> - ret = uname(&uts);
> - if (ret < 0)
> - return -1;
> + if (evlist->session) {
> + /* Force the computation in the perf_env of the e_machine of the threads. */
> + perf_session__e_machine(evlist->session, /*e_flags=*/NULL);
> + arch = perf_env__arch(perf_session__env(evlist->session));
> + }
Is it intended that perf_env__arch() permanently caches the fallback
architecture here?
perf_session__e_machine() avoids caching the fallback EM_HOST when no
threads are present, noting: "Don't cache in the perf_env in case later
threads indicate a better ELF machine type."
However, immediately afterward, perf_env__arch() calls perf_env__e_machine(),
which populates env->e_machine = EM_HOST. Because it gets cached, will all
subsequent evaluations for the session short-circuit and return EM_HOST,
ignoring the true thread architecture once threads are added?
>
> - return do_write_string(ff, uts.machine);
> + if (!arch) {
> + int ret = uname(&uts);
> +
> + if (ret < 0)
> + return -1;
> + arch = uts.machine;
> + }
> + return do_write_string(ff, arch);
> }
Can the if (!arch) block ever be reached?
perf_env__arch() is guaranteed to return a valid string (or "unknown"),
meaning arch will never be NULL. This skips the uname(&uts) fallback
entirely.
As a result, if it falls back to EM_HOST, won't a 32-bit perf binary
running on a 64-bit kernel incorrectly record a 32-bit system architecture?
Additionally, for system architectures missing from the prefix_to_e_machine
table (e.g., hexagon, openrisc), won't it permanently record "unknown" in
the header instead of the correct uname information?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260503002248.1040791-1-irogers@google.com?part=1
next prev parent reply other threads:[~2026-05-03 0:52 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-19 11:38 [PATCH v2] perf symbol: Remove psw_idle() from list of idle symbols Thomas Richter
2026-02-19 11:55 ` Jan Polensky
2026-02-23 21:46 ` Namhyung Kim
2026-02-23 23:14 ` Arnaldo Melo
2026-03-02 18:43 ` Arnaldo Carvalho de Melo
2026-03-02 19:44 ` Ian Rogers
2026-03-04 14:34 ` Arnaldo Carvalho de Melo
2026-03-02 23:43 ` [PATCH v1] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-03-24 17:14 ` Ian Rogers
2026-03-25 6:58 ` Namhyung Kim
2026-03-25 15:58 ` Ian Rogers
2026-03-25 16:18 ` [PATCH v2] " Ian Rogers
2026-03-26 7:20 ` Honglei Wang
2026-03-26 15:11 ` Ian Rogers
2026-03-26 17:45 ` [PATCH v3 0/2] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-03-26 17:45 ` [PATCH v3 1/2] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-03-26 17:45 ` [PATCH v3 2/2] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-03-27 6:56 ` Honglei Wang
2026-03-27 4:50 ` [PATCH v4 0/2] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-03-27 4:50 ` [PATCH v4 1/2] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-06 5:05 ` Namhyung Kim
2026-04-06 15:36 ` Ian Rogers
2026-03-27 4:50 ` [PATCH v4 2/2] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-06 5:10 ` Namhyung Kim
2026-04-06 16:11 ` Ian Rogers
2026-04-06 17:09 ` [PATCH v5 0/3] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-04-06 17:09 ` [PATCH v5 1/3] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-06 17:09 ` [PATCH v5 2/3] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-04-06 17:09 ` [PATCH v5 3/3] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-09 23:06 ` [PATCH v6 0/3] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-04-09 23:06 ` [PATCH v6 1/3] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-04-09 23:37 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 0/4] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-01 18:20 ` [PATCH v7 1/4] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-01 18:56 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 2/4] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-01 19:20 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 3/4] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-01 19:42 ` sashiko-bot
2026-05-01 18:20 ` [PATCH v7 4/4] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
2026-05-01 20:13 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 00/17] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-02 6:59 ` [PATCH v8 01/17] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-02 7:56 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 02/17] perf tests topology: Switch env->arch use to env->e_machine Ian Rogers
2026-05-02 6:59 ` [PATCH v8 03/17] perf capstone: Determine architecture from e_machine Ian Rogers
2026-05-02 7:58 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 04/17] perf print_insn: Use e_machine for fallback IP length check Ian Rogers
2026-05-02 7:55 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 05/17] perf machine: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:11 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 06/17] perf sample-raw: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 07/17] perf sort: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 08/17] perf symbol: Avoid use of machine__is Ian Rogers
2026-05-02 7:17 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 09/17] perf arch common: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:59 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 10/17] perf header: In print_pmu_caps use perf_env e_machine Ian Rogers
2026-05-02 6:59 ` [PATCH v8 11/17] perf c2c: Use perf_env e_machine rather than arch Ian Rogers
2026-05-02 7:44 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 12/17] perf lock-contention: " Ian Rogers
2026-05-02 6:59 ` [PATCH v8 13/17] perf env: Refactor perf_env__arch_strerrno Ian Rogers
2026-05-02 6:59 ` [PATCH v8 14/17] perf env: Remove unused perf_env__raw_arch Ian Rogers
2026-05-02 6:59 ` [PATCH v8 15/17] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-02 7:53 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 16/17] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-02 7:55 ` sashiko-bot
2026-05-02 6:59 ` [PATCH v8 17/17] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
2026-05-03 0:22 ` [PATCH v9 00/18] perf symbol/env: ELF machine clean up and lazy idle computation Ian Rogers
2026-05-03 0:22 ` [PATCH v9 01/18] perf env: Add perf_env__e_machine helper and use in perf_env__arch Ian Rogers
2026-05-03 0:52 ` sashiko-bot [this message]
2026-05-04 1:35 ` Namhyung Kim
2026-05-03 0:22 ` [PATCH v9 02/18] perf tests topology: Switch env->arch use to env->e_machine Ian Rogers
2026-05-03 0:22 ` [PATCH v9 03/18] perf env, dso, thread: Add _endian variants for e_machine helpers Ian Rogers
2026-05-03 0:39 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 04/18] perf capstone: Determine architecture from e_machine Ian Rogers
2026-05-03 0:50 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 05/18] perf print_insn: Use e_machine for fallback IP length check Ian Rogers
2026-05-03 0:22 ` [PATCH v9 06/18] perf symbol: Avoid use of machine__is Ian Rogers
2026-05-03 0:51 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 07/18] perf machine: Use perf_env e_machine rather than arch Ian Rogers
2026-05-03 1:00 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 08/18] perf sample-raw: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 09/18] perf sort: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 10/18] perf arch common: " Ian Rogers
2026-05-03 0:38 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 11/18] perf header: In print_pmu_caps use perf_env e_machine Ian Rogers
2026-05-03 0:22 ` [PATCH v9 12/18] perf c2c: Use perf_env e_machine rather than arch Ian Rogers
2026-05-03 0:22 ` [PATCH v9 13/18] perf lock-contention: " Ian Rogers
2026-05-03 0:22 ` [PATCH v9 14/18] perf env: Refactor perf_env__arch_strerrno Ian Rogers
2026-05-03 1:11 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 15/18] perf env: Remove unused perf_env__raw_arch Ian Rogers
2026-05-03 0:22 ` [PATCH v9 16/18] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-05-03 1:00 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 17/18] perf symbol: Add setters for bitfields sharing a byte to avoid concurrent update issues Ian Rogers
2026-05-03 0:59 ` sashiko-bot
2026-05-03 0:22 ` [PATCH v9 18/18] perf symbol: Lazily compute idle Ian Rogers
2026-05-03 1:11 ` sashiko-bot
2026-04-09 23:06 ` [PATCH v6 2/3] perf env: Add helper to lazily compute the os_release Ian Rogers
2026-04-09 23:50 ` sashiko-bot
2026-04-09 23:06 ` [PATCH v6 3/3] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
2026-04-10 0:11 ` sashiko-bot
2026-03-27 6:00 ` [PATCH v2] perf tests task-analyzer: Write test files to tmpdir Ian Rogers
2026-03-31 7:22 ` Namhyung Kim
2026-03-31 17:58 ` Ian Rogers
2026-04-01 3:41 ` 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=20260503005257.16405C19425@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=irogers@google.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.