From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com>,
Michael Petlan <mpetlan@redhat.com>, Jiri Olsa <jolsa@redhat.com>,
linux-perf-users@vger.kernel.org, linux-s390@vger.kernel.org
Subject: Re: [PATCH 2/3 v2] perf trace: Introduce errno_to_name()
Date: Thu, 7 Dec 2017 14:52:56 -0300 [thread overview]
Message-ID: <20171207175256.GG3173@kernel.org> (raw)
In-Reply-To: <1512658810-7874-1-git-send-email-brueckner@linux.vnet.ibm.com>
Em Thu, Dec 07, 2017 at 04:00:10PM +0100, Hendrik Brueckner escreveu:
> Introduce an errno_to_name() function to return the name of a
> give errno number as string.
Humm, we cannot use asm-generic for all, as there are differences in the
errno numbers from arch to arch, for instance:
In arch/alpha/include/uapi/asm/errno.h we use errno-base.h but even in
that part one of its entries gets a different number on the Alpha arch,
EAGAIN:
-------------------
#include <asm-generic/errno-base.h>
#undef EAGAIN /* 11 in errno-base.h */
#define EDEADLK 11 /* Resource deadlock would occur */
#define EAGAIN 35 /* Try again */
#define EWOULDBLOCK EAGAIN /* Operation would block */
-------------------
And then all these are different:
-------------------
#define EINPROGRESS 36 /* Operation now in progress */
#define EALREADY 37 /* Operation already in progress */
#define ENOTSOCK 38 /* Socket operation on non-socket */
#define EDESTADDRREQ 39 /* Destination address required */
#define EMSGSIZE 40 /* Message too long */
#define EPROTOTYPE 41 /* Protocol wrong type for socket */
#define ENOPROTOOPT 42 /* Protocol not available */
<SNIP>
-------------------
mips also has differences, shares errno-base.h completely but:
arch/mips/include/uapi/asm/errno.h
-------------------
/*
* These error numbers are intended to be MIPS ABI compatible
*/
#include <asm-generic/errno-base.h>
#define ENOMSG 35 /* No message of desired type */
#define EIDRM 36 /* Identifier removed */
#define ECHRNG 37 /* Channel number out of range */
#define EL2NSYNC 38 /* Level 2 not synchronized */
#define EL3HLT 39 /* Level 3 halted */
#define EL3RST 40 /* Level 3 reset */
#define ELNRNG 41 /* Link number out of range */
<SNIP>
-------------------
PARISC looks like MIPS, at least in this little excerpt:
arch/parisc/include/uapi/asm/errno.h
-------------------
#include <asm-generic/errno-base.h>
#define ENOMSG 35 /* No message of desired type */
#define EIDRM 36 /* Identifier removed */
#define ECHRNG 37 /* Channel number out of range */
#define EL2NSYNC 38 /* Level 2 not synchronized */
#define EL3HLT 39 /* Level 3 halted */
#define EL3RST 40 /* Level 3 reset */
#define ELNRNG 41 /* Link number out of range */
<SNIP>
-------------------
PowerPC is more modest, wants only to change one entry:
#include <asm-generic/errno.h>
#undef EDEADLOCK
#define EDEADLOCK 58 /* File locking deadlock error */
:-)
So you can try to copy all arch/*/include/uapi/asm/errno.h files and
use the arch to key that, i.e. its almost what you did, but needs to
take the arch into consideration.
Later we'll generate a two dimensional table of sorts, having the first
dimension be the arch name, so that we can translate errnos in a
perf.data file collected on, say, mips (one of these routers) in a tool
running on x86_64 (or S/390 :)).
- Arnaldo
> With this change, the dependency to libaudit can be removed for
> architectures that support syscall tables. Hence, remove the
> audit_errno_to_name() call in builtin-trace.c and just link
> util/syscalltbl.c against libaudit. A follow-up commit could
> then clean-up this dependency with respect to the syscall table.
>
> The errno name strings are generated by util/generate-errno-names.sh
> script and saved as util/errno-names.h.
>
> Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
> ---
> tools/perf/.gitignore | 1 +
> tools/perf/Makefile.config | 2 +-
> tools/perf/Makefile.perf | 12 ++++++++++--
> tools/perf/builtin-trace.c | 17 ++++++++++++++---
> tools/perf/util/generate-errno-names.sh | 32 ++++++++++++++++++++++++++++++++
> 5 files changed, 58 insertions(+), 6 deletions(-)
> create mode 100755 tools/perf/util/generate-errno-names.sh
>
> diff --git a/tools/perf/.gitignore b/tools/perf/.gitignore
> index 643cc4ba..4e022f9 100644
> --- a/tools/perf/.gitignore
> +++ b/tools/perf/.gitignore
> @@ -14,6 +14,7 @@ perf*.1
> perf*.xml
> perf*.html
> common-cmds.h
> +errno-names.h
> perf.data
> perf.data.old
> output.svg
> diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
> index ab16aab..d8447b1 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -251,7 +251,7 @@ INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/include/uapi
> INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/include/
> INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/
>
> -# $(obj-perf) for generated common-cmds.h
> +# $(obj-perf) for generated common-cmds.h and errno-names.h
> # $(obj-perf)/util for generated bison/flex headers
> ifneq ($(OUTPUT),)
> INC_FLAGS += -I$(obj-perf)/util
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 68cf136..82aed33d 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -518,6 +518,12 @@ $(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt
> $(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
> $(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
>
> +$(OUTPUT)util/errno-names.h: util/generate-errno-names.sh
> + $(QUIET_GEN). util/generate-errno-names.sh \
> + $(srctree)/include/uapi/asm-generic/errno-base.h \
> + $(srctree)/include/uapi/asm-generic/errno.h \
> + > $@+ && mv $@+ $@
> +
> $(SCRIPTS) : % : %.sh
> $(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
>
> @@ -565,7 +571,8 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
> $(vhost_virtio_ioctl_array) \
> $(madvise_behavior_array) \
> $(perf_ioctl_array) \
> - $(prctl_option_array)
> + $(prctl_option_array) \
> + $(OUTPUT)util/errno-names.h
>
> $(OUTPUT)%.o: %.c prepare FORCE
> $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
> @@ -847,7 +854,8 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
> $(OUTPUT)$(kcmp_type_array) \
> $(OUTPUT)$(vhost_virtio_ioctl_array) \
> $(OUTPUT)$(perf_ioctl_array) \
> - $(OUTPUT)$(prctl_option_array)
> + $(OUTPUT)$(prctl_option_array) \
> + $(OUTPUT)util/errno-names.h
> $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
>
> #
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index 84debdb..04af6a1 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -42,17 +42,16 @@
> #include "string2.h"
> #include "syscalltbl.h"
> #include "rb_resort.h"
> +#include "util/errno-names.h"
>
> #include <errno.h>
> #include <inttypes.h>
> -#include <libaudit.h> /* FIXME: Still needed for audit_errno_to_name */
> #include <poll.h>
> #include <signal.h>
> #include <stdlib.h>
> #include <string.h>
> #include <linux/err.h>
> #include <linux/filter.h>
> -#include <linux/audit.h>
> #include <linux/kernel.h>
> #include <linux/random.h>
> #include <linux/stringify.h>
> @@ -1659,6 +1658,18 @@ static int trace__fprintf_callchain(struct trace *trace, struct perf_sample *sam
> return sample__fprintf_callchain(sample, 38, print_opts, &callchain_cursor, trace->output);
> }
>
> +static const char *errno_to_name(int err)
> +{
> + switch (err) {
> +#define ERRNO_NAME_MAP(_err, _num) case _num: return #_err;
> + ALL_ERRNO_NAME_MAPPINGS
> +#undef ERRNO_NAME_MAP
> + default:
> + return "(unknown)";
> + break;
> + };
> +}
> +
> static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
> union perf_event *event __maybe_unused,
> struct perf_sample *sample)
> @@ -1729,7 +1740,7 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
> errno_print: {
> char bf[STRERR_BUFSIZE];
> const char *emsg = str_error_r(-ret, bf, sizeof(bf)),
> - *e = audit_errno_to_name(-ret);
> + *e = errno_to_name(-ret);
>
> fprintf(trace->output, ") = -1 %s %s", e, emsg);
> }
> diff --git a/tools/perf/util/generate-errno-names.sh b/tools/perf/util/generate-errno-names.sh
> new file mode 100755
> index 0000000..6c114a8
> --- /dev/null
> +++ b/tools/perf/util/generate-errno-names.sh
> @@ -0,0 +1,32 @@
> +#!/bin/sh
> +# SPDX-License-Identifier: GPL-2.0
> +#
> +# Generate errno names header file
> +#
> +# Copyright IBM Corp. 2017
> +# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
> +
> +infiles="$@"
> +tmpfile=$(mktemp -t generate-errno-names.XXXXXXXXX)
> +
> +trap 'rm -f $tmpfile' 0
> +
> +grep -hE '^#define[[:blank:]]+([^[:blank:]]+)[[:blank:]]+([[:digit:]]+).*' $infiles \
> + |awk '{ print $2", "$3; }' \
> + |sort -t, -k2 -nu \
> + |sed -e 's/^/\tERRNO_NAME_MAP(/' -e 's/$/)/' \
> + > $tmpfile
> +
> +cat <<EoHeader
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _UTIL_ERRNO_NAMES_H
> +#define _UTIL_ERRNO_NAMES_H
> +
> +#define ALL_ERRNO_NAME_MAPPINGS \\
> +EoHeader
> +head -n -1 $tmpfile |sed -e 's/$/ \\/'
> +tail -1 $tmpfile
> +
> +cat <<EoFooter
> +#endif /* _UTIL_ERRNO_NAMES_H */
> +EoFooter
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-12-07 17:53 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-07 8:27 [PATCH 0/3] perf: generate s390 syscall table and remove auditlibs dependency Hendrik Brueckner
2017-12-07 8:27 ` [PATCH 1/3] perf s390: generate system call table from asm/unistd.h Hendrik Brueckner
2017-12-07 15:30 ` Arnaldo Carvalho de Melo
2017-12-07 17:37 ` Arnaldo Carvalho de Melo
2017-12-11 9:06 ` Hendrik Brueckner
2017-12-11 14:19 ` Arnaldo Carvalho de Melo
2017-12-07 8:28 ` [PATCH 2/3] perf: introduce errno_to_name() function Hendrik Brueckner
2017-12-07 8:37 ` [PATCH 2/3] fixup! " Hendrik Brueckner
2017-12-07 14:48 ` Arnaldo Carvalho de Melo
2017-12-07 15:00 ` [PATCH 2/3 v2] perf trace: Introduce errno_to_name() Hendrik Brueckner
2017-12-07 17:52 ` Arnaldo Carvalho de Melo [this message]
2017-12-11 11:32 ` Hendrik Brueckner
2017-12-11 15:00 ` Arnaldo Carvalho de Melo
[not found] ` <20171211161640.GH4369@linux.vnet.ibm.com>
2017-12-13 16:31 ` container test for cross building s390 tools failing Arnaldo Carvalho de Melo
2017-12-14 13:26 ` Thomas-Mich Richter
2017-12-14 14:03 ` Arnaldo Carvalho de Melo
2017-12-07 8:28 ` [PATCH 3/3] perf trace: no longer require auditlibs if syscall tables are present Hendrik Brueckner
2017-12-07 17:53 ` Arnaldo Carvalho de Melo
2017-12-11 9:35 ` Hendrik Brueckner
2017-12-07 15:29 ` [PATCH 0/3] perf: generate s390 syscall table and remove auditlibs dependency 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=20171207175256.GG3173@kernel.org \
--to=acme@kernel.org \
--cc=brueckner@linux.vnet.ibm.com \
--cc=jolsa@redhat.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mpetlan@redhat.com \
--cc=tmricht@linux.vnet.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 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.