From: Ian Rogers <irogers@google.com>
To: irogers@google.com, acme@kernel.org, namhyung@kernel.org,
tmricht@linux.ibm.com
Cc: agordeev@linux.ibm.com, gor@linux.ibm.com, hca@linux.ibm.com,
jameshongleiwang@126.com, japo@linux.ibm.com,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
linux-s390@vger.kernel.org, sumanthk@linux.ibm.com
Subject: [PATCH v8 13/17] perf env: Refactor perf_env__arch_strerrno
Date: Fri, 1 May 2026 23:59:31 -0700 [thread overview]
Message-ID: <20260502065935.291960-14-irogers@google.com> (raw)
In-Reply-To: <20260502065935.291960-1-irogers@google.com>
perf_env__arch_strerrno is only available with libtraceevent so hide
the declaration if no libtraceevent.
The previous approach maps an architecture string to a function
pointer to a function that takes an int errno values and returns a
string. The new approach takes an e_machine and an errno value and
returns a string.
As the only call site is in builtin-trace.c, the e_machine is already
present and potentially more specific than the perf_env arch string
that is a single global value.
The major complication in this approach is having the shell script
that generates the C code map a linux directory name to the matching
ELF machine constants.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/builtin-trace.c | 5 ++-
tools/perf/trace/beauty/arch_errno_names.sh | 40 ++++++++++++++++++---
tools/perf/util/env.c | 13 +++----
tools/perf/util/env.h | 7 ++--
4 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index e58c49d047a2..d1f21b5e7c98 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -3008,9 +3008,8 @@ static int trace__sys_exit(struct trace *trace, struct evsel *evsel,
} else if (ret < 0) {
errno_print: {
char bf[STRERR_BUFSIZE];
- struct perf_env *env = evsel__env(evsel) ?: &trace->host_env;
const char *emsg = str_error_r(-ret, bf, sizeof(bf));
- const char *e = perf_env__arch_strerrno(env, err);
+ const char *e = perf_env__arch_strerrno(e_machine, err);
fprintf(trace->output, "-1 %s (%s)", e, emsg);
}
@@ -4890,7 +4889,7 @@ static size_t syscall__dump_stats(struct trace *trace, int e_machine, FILE *fp,
for (e = 0; e < stats->max_errno; ++e) {
if (stats->errnos[e] != 0)
- fprintf(fp, "\t\t\t\t%s: %d\n", perf_env__arch_strerrno(trace->host->env, e + 1), stats->errnos[e]);
+ fprintf(fp, "\t\t\t\t%s: %d\n", perf_env__arch_strerrno(e_machine, e + 1), stats->errnos[e]);
}
}
lines++;
diff --git a/tools/perf/trace/beauty/arch_errno_names.sh b/tools/perf/trace/beauty/arch_errno_names.sh
index b22890b8d272..89b742927168 100755
--- a/tools/perf/trace/beauty/arch_errno_names.sh
+++ b/tools/perf/trace/beauty/arch_errno_names.sh
@@ -52,21 +52,49 @@ process_arch()
|IFS=, create_errno_lookup_func "$arch"
}
+arch_to_e_machine()
+{
+ case "$1" in
+ alpha) printf '\tcase EM_ALPHA:\n' ;;
+ arc) printf '\tcase EM_ARC:\n' ;;
+ arm) printf '\tcase EM_ARM:\n' ;;
+ arm64) printf '\tcase EM_AARCH64:\n' ;;
+ csky) printf '\tcase EM_CSKY:\n' ;;
+ hexagon) printf '\tcase EM_HEXAGON:\n' ;;
+ loongarch) printf '\tcase EM_LOONGARCH:\n' ;;
+ microblaze) printf '\tcase EM_MICROBLAZE:\n' ;;
+ mips) printf '\tcase EM_MIPS:\n' ;;
+ parisc) printf '\tcase EM_PARISC:\n' ;;
+ powerpc) printf '\tcase EM_PPC:\n\tcase EM_PPC64:\n' ;;
+ riscv) printf '\tcase EM_RISCV:\n' ;;
+ s390) printf '\tcase EM_S390:\n' ;;
+ sh) printf '\tcase EM_SH:\n' ;;
+ sparc) printf '\tcase EM_SPARC:\n\tcase EM_SPARCV9:\n' ;;
+ x86) printf '\tcase EM_386:\n\tcase EM_X86_64:\n' ;;
+ xtensa) printf '\tcase EM_XTENSA:\n' ;;
+ esac
+}
+
create_arch_errno_table_func()
{
archlist="$1"
default="$2"
- printf 'static arch_syscalls__strerrno_t *\n'
- printf 'arch_syscalls__strerrno_function(const char *arch)\n'
+ printf 'static const char *\n'
+ printf 'arch_syscalls__strerrno(uint16_t e_machine, int err)\n'
printf '{\n'
+ printf '\tswitch (e_machine) {\n'
for arch in $archlist; do
arch_str=$(arch_string "$arch")
- printf '\tif (!strcmp(arch, "%s"))\n' "$arch_str"
- printf '\t\treturn errno_to_name__%s;\n' "$arch_str"
+ ems=$(arch_to_e_machine "$arch_str")
+ if [ -n "$ems" ]; then
+ printf '%s\n' "$ems"
+ printf '\t\treturn errno_to_name__%s(err);\n' "$arch_str"
+ fi
done
arch_str=$(arch_string "$default")
- printf '\treturn errno_to_name__%s;\n' "$arch_str"
+ printf '\tdefault:\n\t\treturn errno_to_name__%s(err);\n' "$arch_str"
+ printf '\t}\n'
printf '}\n'
}
@@ -74,6 +102,8 @@ cat <<EoHEADER
/* SPDX-License-Identifier: GPL-2.0 */
#include <string.h>
+#include <stdint.h>
+#include <elf.h>
EoHEADER
diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
index 4ff4caab3b32..97f4aa1131a1 100644
--- a/tools/perf/util/env.c
+++ b/tools/perf/util/env.c
@@ -786,17 +786,12 @@ const char *perf_env__arch(struct perf_env *env)
#include "trace/beauty/arch_errno_names.c"
#endif
-const char *perf_env__arch_strerrno(struct perf_env *env __maybe_unused, int err __maybe_unused)
-{
#if defined(HAVE_LIBTRACEEVENT)
- if (env->arch_strerrno == NULL)
- env->arch_strerrno = arch_syscalls__strerrno_function(perf_env__arch(env));
-
- return env->arch_strerrno ? env->arch_strerrno(err) : "no arch specific strerrno function";
-#else
- return "!HAVE_LIBTRACEEVENT";
-#endif
+const char *perf_env__arch_strerrno(uint16_t e_machine, int err)
+{
+ return arch_syscalls__strerrno(e_machine, err);
}
+#endif
const char *perf_env__cpuid(struct perf_env *env)
{
diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
index 7151a9138e3f..68dead1b36a6 100644
--- a/tools/perf/util/env.h
+++ b/tools/perf/util/env.h
@@ -67,8 +67,6 @@ struct cpu_domain_map {
struct domain_info **domains;
};
-typedef const char *(arch_syscalls__strerrno_t)(int err);
-
struct perf_env {
char *hostname;
char *os_release;
@@ -158,7 +156,6 @@ struct perf_env {
*/
bool enabled;
} clock;
- arch_syscalls__strerrno_t *arch_strerrno;
};
enum perf_compress_type {
@@ -190,7 +187,9 @@ void cpu_cache_level__free(struct cpu_cache_level *cache);
uint16_t perf_env__e_machine_nocache(struct perf_env *env, uint32_t *e_flags);
uint16_t perf_env__e_machine(struct perf_env *env, uint32_t *e_flags);
const char *perf_env__arch(struct perf_env *env);
-const char *perf_env__arch_strerrno(struct perf_env *env, int err);
+#if defined(HAVE_LIBTRACEEVENT)
+const char *perf_env__arch_strerrno(uint16_t e_machine, int err);
+#endif
const char *perf_env__cpuid(struct perf_env *env);
const char *perf_env__raw_arch(struct perf_env *env);
int perf_env__nr_cpus_avail(struct perf_env *env);
--
2.54.0.545.g6539524ca2-goog
next prev parent reply other threads:[~2026-05-02 7:00 UTC|newest]
Thread overview: 60+ 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-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:20 ` [PATCH v7 2/4] perf env: Add helper to lazily compute the os_release Ian Rogers
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 18:20 ` [PATCH v7 4/4] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
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 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 6:59 ` [PATCH v8 04/17] perf print_insn: Use e_machine for fallback IP length check Ian Rogers
2026-05-02 6:59 ` [PATCH v8 05/17] perf machine: Use perf_env e_machine rather than arch Ian Rogers
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 6:59 ` [PATCH v8 09/17] perf arch common: Use perf_env e_machine rather than arch Ian Rogers
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 6:59 ` [PATCH v8 12/17] perf lock-contention: " Ian Rogers
2026-05-02 6:59 ` Ian Rogers [this message]
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 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 6:59 ` [PATCH v8 17/17] perf symbol: Lazily compute idle and use a global lock for updates Ian Rogers
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:06 ` [PATCH v6 3/3] perf symbol: Lazily compute idle and use the perf_env Ian Rogers
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=20260502065935.291960-14-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=agordeev@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=jameshongleiwang@126.com \
--cc=japo@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=namhyung@kernel.org \
--cc=sumanthk@linux.ibm.com \
--cc=tmricht@linux.ibm.com \
/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