linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Clark Williams <williams@redhat.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Ian Rogers <irogers@google.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jin Yao <yao.jin@linux.intel.com>, Jiri Olsa <jolsa@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Song Liu <songliubraving@fb.com>,
	Stephane Eranian <eranian@google.com>,
	clang-built-linux@googlegroups.com
Subject: [PATCH 08/57] perf annotate: Use libsubcmd's run-command.h to fork objdump
Date: Mon, 21 Oct 2019 10:37:45 -0300	[thread overview]
Message-ID: <20191021133834.25998-9-acme@kernel.org> (raw)
In-Reply-To: <20191021133834.25998-1-acme@kernel.org>

From: Ian Rogers <irogers@google.com>

Reduce duplicated logic by using the subcmd library. Ensure when errors
occur they are reported to the caller. Before this patch, if no lines
are read the error status is 0.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: clang-built-linux@googlegroups.com
Link: http://lore.kernel.org/lkml/20191010183649.23768-3-irogers@google.com
Link: http://lore.kernel.org/lkml/20191015003418.62563-1-irogers@google.com
[ merged follow up fix for NULL termination as in the 2nd link above ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/annotate.c | 72 ++++++++++++++++++++------------------
 1 file changed, 37 insertions(+), 35 deletions(-)

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index f9c39a742418..9835666db5a7 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -43,6 +43,7 @@
 #include <linux/string.h>
 #include <bpf/libbpf.h>
 #include <subcmd/parse-options.h>
+#include <subcmd/run-command.h>
 
 /* FIXME: For the HE_COLORSET */
 #include "ui/browser.h"
@@ -1864,12 +1865,19 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 	struct kcore_extract kce;
 	bool delete_extract = false;
 	bool decomp = false;
-	int stdout_fd[2];
 	int lineno = 0;
 	int nline;
-	pid_t pid;
 	char *line;
 	size_t line_len;
+	const char *objdump_argv[] = {
+		"/bin/sh",
+		"-c",
+		NULL, /* Will be the objdump command to run. */
+		"--",
+		NULL, /* Will be the symfs path. */
+		NULL,
+	};
+	struct child_process objdump_process;
 	int err = dso__disassemble_filename(dso, symfs_filename, sizeof(symfs_filename));
 
 	if (err)
@@ -1899,7 +1907,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 
 		if (dso__decompress_kmodule_path(dso, symfs_filename,
 						 tmp, sizeof(tmp)) < 0)
-			goto out;
+			return -1;
 
 		decomp = true;
 		strcpy(symfs_filename, tmp);
@@ -1924,38 +1932,28 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 
 	pr_debug("Executing: %s\n", command);
 
-	err = -1;
-	if (pipe(stdout_fd) < 0) {
-		pr_err("Failure creating the pipe to run %s\n", command);
-		goto out_free_command;
-	}
-
-	pid = fork();
-	if (pid < 0) {
-		pr_err("Failure forking to run %s\n", command);
-		goto out_close_stdout;
-	}
+	objdump_argv[2] = command;
+	objdump_argv[4] = symfs_filename;
 
-	if (pid == 0) {
-		close(stdout_fd[0]);
-		dup2(stdout_fd[1], 1);
-		close(stdout_fd[1]);
-		execl("/bin/sh", "sh", "-c", command, "--", symfs_filename,
-		      NULL);
-		perror(command);
-		exit(-1);
+	/* Create a pipe to read from for stdout */
+	memset(&objdump_process, 0, sizeof(objdump_process));
+	objdump_process.argv = objdump_argv;
+	objdump_process.out = -1;
+	if (start_command(&objdump_process)) {
+		pr_err("Failure starting to run %s\n", command);
+		err = -1;
+		goto out_free_command;
 	}
 
-	close(stdout_fd[1]);
-
-	file = fdopen(stdout_fd[0], "r");
+	file = fdopen(objdump_process.out, "r");
 	if (!file) {
 		pr_err("Failure creating FILE stream for %s\n", command);
 		/*
 		 * If we were using debug info should retry with
 		 * original binary.
 		 */
-		goto out_free_command;
+		err = -1;
+		goto out_close_stdout;
 	}
 
 	/* Storage for getline. */
@@ -1979,8 +1977,14 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 	}
 	free(line);
 
-	if (nline == 0)
+	err = finish_command(&objdump_process);
+	if (err)
+		pr_err("Error running %s\n", command);
+
+	if (nline == 0) {
+		err = -1;
 		pr_err("No output from %s\n", command);
+	}
 
 	/*
 	 * kallsyms does not have symbol sizes so there may a nop at the end.
@@ -1990,23 +1994,21 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
 		delete_last_nop(sym);
 
 	fclose(file);
-	err = 0;
+
+out_close_stdout:
+	close(objdump_process.out);
+
 out_free_command:
 	free(command);
-out_remove_tmp:
-	close(stdout_fd[0]);
 
+out_remove_tmp:
 	if (decomp)
 		unlink(symfs_filename);
 
 	if (delete_extract)
 		kcore_extract__delete(&kce);
-out:
-	return err;
 
-out_close_stdout:
-	close(stdout_fd[1]);
-	goto out_free_command;
+	return err;
 }
 
 static void calc_percent(struct sym_hist *sym_hist,
-- 
2.21.0


  parent reply	other threads:[~2019-10-21 13:39 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-21 13:37 [GIT PULL] perf/core improvements and fixes Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 01/57] perf tools: Allow to build with -ltcmalloc Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 02/57] perf script: Fix --reltime with --time Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 03/57] perf evlist: Fix fix for freed id arrays Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 04/57] perf test: Report failure for mmap events Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 05/57] perf test: Avoid infinite loop for task exit case Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 06/57] perf report: Add warning when libunwind not compiled in Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 07/57] perf annotate: Avoid reallocation in objdump parsing Arnaldo Carvalho de Melo
2019-10-21 13:37 ` Arnaldo Carvalho de Melo [this message]
2019-10-21 13:37 ` [PATCH 09/57] perf annotate: Don't pipe objdump output through 'grep' command Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 10/57] perf annotate: Don't pipe objdump output through 'expand' command Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 11/57] perf annotate: Fix objdump --no-show-raw-insn flag Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 12/57] perf jvmti: Link against tools/lib/ctype.h to have weak strlcpy() Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 13/57] perf stat: Support --all-kernel/--all-user Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 14/57] perf trace: Add syscall failure stats to -s/--summary and -S/--with-summary Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 15/57] perf trace: Introduce --errno-summary Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 16/57] perf string: Export asprintf__tp_filter_pids() Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 17/57] perf trace: Filter own pid to avoid a feedback look in 'perf trace record -a' Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 18/57] perf trace: Support tracepoint dynamic char arrays Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 19/57] perf vendor events arm64: Fix Hisi hip08 DDRC PMU eventname Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 20/57] perf vendor events arm64: Add some missing events for Hisi hip08 DDRC PMU Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 21/57] perf vendor events arm64: Add some missing events for Hisi hip08 L3C PMU Arnaldo Carvalho de Melo
2019-10-21 13:37 ` [PATCH 22/57] perf vendor events arm64: Add some missing events for Hisi hip08 HHA PMU Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 23/57] tools arch x86: Grab a copy of the file containing the IRQ vector defines Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 24/57] libbeauty: Add a generator for x86's IRQ vectors -> strings Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 25/57] libbeauty: Hook up the x86 irq_vectors table generator Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 26/57] libbeauty: Add a strarray__scnprintf_suffix() method Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 27/57] perf trace beauty: Add the glue for the autogenerated x86 IRQ vector array Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 28/57] perf trace: Hook the 'vec' tracepoint argument with the x86 IRQ vectors scnprintf/strtoul Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 29/57] perf trace: Show error message when not finding a field used in a filter expression Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 30/57] perf trace: Introduce accessors to trace specific evsel->priv Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 31/57] perf trace: Hide evsel->access further, simplify code Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 32/57] perf trace: Introduce 'struct evsel__trace' for evsel->priv needs Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 33/57] perf trace: Initialize evsel_trace->fmt for syscalls:sys_enter_* tracepoints Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 34/57] perf scripting engines: Iterate on tep event arrays directly Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 35/57] perf tools: Remove unused trace_find_next_event() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 36/57] libbeauty: Introduce syscall_arg__strtoul_strarray() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 37/57] perf trace: Honour --max-events in processing syscalls:sys_enter_* Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 38/57] perf trace: Pass a syscall_arg to syscall_arg_fmt->strtoul() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 39/57] perf list: Hide deprecated events by default Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 40/57] perf tests: Remove needless headers for bp_account Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 41/57] perf tests bp_account: Add dedicated checking helper is_supported() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 42/57] perf tests: Disable bp_signal testing for arm64 Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 43/57] libperf: Introduce perf_evlist__for_each_mmap() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 44/57] libperf: Move mmap allocation to perf_evlist__mmap_ops::get Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 45/57] libperf: Move mask setup to perf_evlist__mmap_ops() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 46/57] libperf: Link static tests with libapi.a Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 47/57] libperf: Add tests_mmap_thread test Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 48/57] libperf: Add tests_mmap_cpus test Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 49/57] libperf: Keep count of failed tests Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 50/57] libperf: Do not export perf_evsel__init()/perf_evlist__init() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 51/57] libperf: Add pr_err() macro Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 52/57] libbeauty: Introduce syscall_arg__strtoul_strarrays() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 53/57] perf trace: Use strtoul for the fcntl 'cmd' argument Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 54/57] libbeauty: Make the mmap_flags strarray visible outside of its beautifier Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 55/57] libbeauty: Introduce strarray__strtoul_flags() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 56/57] perf trace: Wire up strarray__strtoul_flags() Arnaldo Carvalho de Melo
2019-10-21 13:38 ` [PATCH 57/57] perf trace: Use STUL_STRARRAY_FLAGS with mmap Arnaldo Carvalho de Melo
2019-10-21 23:16 ` [GIT PULL] perf/core improvements and fixes Ingo Molnar

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=20191021133834.25998-9-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=clang-built-linux@googlegroups.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=songliubraving@fb.com \
    --cc=tglx@linutronix.de \
    --cc=williams@redhat.com \
    --cc=yao.jin@linux.intel.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;
as well as URLs for NNTP newsgroup(s).