Introduce an errno_to_name() function to return the name of a give errno number as string. 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@xxxxxxxxxxxxxxxxxx> --- 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..b7aef0f 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 ONE_ERRNO_NAME + 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@xxxxxxxxxxxxxxxxxx> + +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-s390" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html