Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0ac7b3c authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'perf-core-for-mingo-4.17-20180323' of...

Merge tag 'perf-core-for-mingo-4.17-20180323' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux

 into perf/core

Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

- Move non-TUI specific annotation routines out of the TUI browser so
  that it can be used in other UIs, and to demonstrate that introduce
  a 'perf annotate --stdio2' option that will apply those formatting
  routines to provide a non-interactive annotation mode (Arnaldo Carvalho de Melo)

- Add 'P' hotkey to the annotation TUI, so dump the current annotated
  symbol to a file, easing report thru e-mail, by getting rid of the
  spaces + right hand side scrollbar chars (Arnaldo Carvalho de Melo)

- Support --ignore-vmlinux to 'perf report' and 'perf annotate', that
  was already present in 'perf top', to use /proc/{kcore,kallsyms},
  allowing to see what is in fact running (patched stuff, alternatives,
  ftrace, etc), not the initial state of the kernel (vmlinux) (Arnaldo Carvalho de Melo)

- Support 'jump' instructions to a different function, treating them
  as 'call' instructions (Arnaldo Carvalho de Melo)

- Fix some jump artifacts when using vmlinux + ASM functions, where
  the ELF symtab for instance, for entry_SYSCALL_64 includes that and
  what comes after the 'syscall_return_via_sysret' label, but the
  objdump -dS prints the jump targets + offsets using the
  syscall_return_via_sysret address, which was confusing 'perf annotate'.
  See the cset comments for further info (Arnaldo Carvalho de Melo)

- Report error from dwfl_attach_state() in the unwind code (Martin Vuille)

- Reference Py_None before returning it in the python extension (Petr Machata)

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 7054e4e0 980b68ec
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -55,6 +55,9 @@ OPTIONS
--vmlinux=<file>::
        vmlinux pathname.

--ignore-vmlinux::
	Ignore vmlinux files.

-m::
--modules::
        Load module symbols. WARNING: use only with -k and LIVE kernel.
@@ -69,6 +72,8 @@ OPTIONS

--stdio:: Use the stdio interface.

--stdio2:: Use the stdio2 interface, non-interactive, uses the TUI formatting.

--stdio-color=<mode>::
	'always', 'never' or 'auto', allowing configuring color output
	via the command line, in addition to via "color.ui" .perfconfig.
+3 −0
Original line number Diff line number Diff line
@@ -296,6 +296,9 @@ OPTIONS
--vmlinux=<file>::
        vmlinux pathname

--ignore-vmlinux::
	Ignore vmlinux files.

--kallsyms=<file>::
        kallsyms pathname

+3 −2
Original line number Diff line number Diff line
@@ -2,9 +2,10 @@
#include <linux/compiler.h>

static int s390_call__parse(struct arch *arch, struct ins_operands *ops,
			    struct map *map)
			    struct map_symbol *ms)
{
	char *endptr, *tok, *name;
	struct map *map = ms->map;
	struct addr_map_symbol target = {
		.map = map,
	};
@@ -54,7 +55,7 @@ static struct ins_ops s390_call_ops = {

static int s390_mov__parse(struct arch *arch __maybe_unused,
			   struct ins_operands *ops,
			   struct map *map __maybe_unused)
			   struct map_symbol *ms __maybe_unused)
{
	char *s = strchr(ops->raw, ','), *target, *endptr;

+20 −7
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@
struct perf_annotate {
	struct perf_tool tool;
	struct perf_session *session;
	bool	   use_tui, use_stdio, use_gtk;
	bool	   use_tui, use_stdio, use_stdio2, use_gtk;
	bool	   full_paths;
	bool	   print_line;
	bool	   skip_missing;
@@ -202,6 +202,11 @@ static int process_branch_callback(struct perf_evsel *evsel,
	return ret;
}

static bool has_annotation(struct perf_annotate *ann)
{
	return ui__has_annotation() || ann->use_stdio2;
}

static int perf_evsel__add_sample(struct perf_evsel *evsel,
				  struct perf_sample *sample,
				  struct addr_location *al,
@@ -212,7 +217,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,
	struct hist_entry *he;
	int ret;

	if ((!ann->has_br_stack || !ui__has_annotation()) &&
	if ((!ann->has_br_stack || !has_annotation(ann)) &&
	    ann->sym_hist_filter != NULL &&
	    (al->sym == NULL ||
	     strcmp(ann->sym_hist_filter, al->sym->name) != 0)) {
@@ -236,7 +241,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,
	 */
	process_branch_stack(sample->branch_stack, al, sample);

	if (ann->has_br_stack && ui__has_annotation())
	if (ann->has_br_stack && has_annotation(ann))
		return process_branch_callback(evsel, sample, al, ann, machine);

	he = hists__add_entry(hists, al, NULL, NULL, NULL, sample, true);
@@ -282,8 +287,11 @@ static int hist_entry__tty_annotate(struct hist_entry *he,
				    struct perf_evsel *evsel,
				    struct perf_annotate *ann)
{
	if (!ann->use_stdio2)
		return symbol__tty_annotate(he->ms.sym, he->ms.map, evsel,
					    ann->print_line, ann->full_paths, 0, 0);
	return symbol__tty_annotate2(he->ms.sym, he->ms.map, evsel,
				     ann->print_line, ann->full_paths);
}

static void hists__find_annotations(struct hists *hists,
@@ -487,6 +495,9 @@ int cmd_annotate(int argc, const char **argv)
	OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),
	OPT_BOOLEAN(0, "tui", &annotate.use_tui, "Use the TUI interface"),
	OPT_BOOLEAN(0, "stdio", &annotate.use_stdio, "Use the stdio interface"),
	OPT_BOOLEAN(0, "stdio2", &annotate.use_stdio2, "Use the stdio interface"),
	OPT_BOOLEAN(0, "ignore-vmlinux", &symbol_conf.ignore_vmlinux,
                    "don't load vmlinux even if found"),
	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
		   "file", "vmlinux pathname"),
	OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
@@ -563,13 +574,15 @@ int cmd_annotate(int argc, const char **argv)
	if (ret < 0)
		goto out_delete;

	annotation_config__init();

	symbol_conf.try_vmlinux_path = true;

	ret = symbol__init(&annotate.session->header.env);
	if (ret < 0)
		goto out_delete;

	if (annotate.use_stdio)
	if (annotate.use_stdio || annotate.use_stdio2)
		use_browser = 0;
	else if (annotate.use_tui)
		use_browser = 1;
@@ -578,7 +591,7 @@ int cmd_annotate(int argc, const char **argv)

	setup_browser(true);

	if (use_browser == 1 && annotate.has_br_stack) {
	if ((use_browser == 1 || annotate.use_stdio2) && annotate.has_br_stack) {
		sort__mode = SORT_MODE__BRANCH;
		if (setup_sorting(annotate.session->evlist) < 0)
			usage_with_options(annotate_usage, options);
+3 −0
Original line number Diff line number Diff line
@@ -1018,6 +1018,8 @@ int cmd_report(int argc, const char **argv)
	OPT_BOOLEAN(0, "mmaps", &report.mmaps_mode, "Display recorded tasks memory maps"),
	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
		   "file", "vmlinux pathname"),
	OPT_BOOLEAN(0, "ignore-vmlinux", &symbol_conf.ignore_vmlinux,
                    "don't load vmlinux even if found"),
	OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
		   "file", "kallsyms pathname"),
	OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),
@@ -1340,6 +1342,7 @@ int cmd_report(int argc, const char **argv)
			symbol_conf.priv_size += sizeof(u32);
			symbol_conf.sort_by_name = true;
		}
		annotation_config__init();
	}

	if (symbol__init(&session->header.env) < 0)
Loading