Skip to contentSkip to conversation

perf/core improvements and fixes

GIT PULL New Arnaldo Carvalho de Melo 2 participants 16 messages Apr 19, 2016 perf events

lore
Share & tools
lore

Arnaldo Carvalho de Melo

author maintainer
#0 lore raw

Hi Ingo,

Please consider pulling,

- Arnaldo

The following changes since commit 9243ae5b28d02dc7d71a4f00c981ef6feaede3f1:

Merge tag 'perf-core-for-mingo-20160415' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-04-16 11:09:57 +0200)

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160419

for you to fetch changes up to 6566feafb4dba4eef30a9c0b25e6f49f996178b6:

perf test: Add missing verbose output explaining the reason for failure (2016-04-19 12:39:36 -0300)

----------------------------------------------------------------
perf/core improvements and fixes:

Build fixes:

- Fix 'perf trace' build when DWARF unwind isn't available (Arnaldo Carvalho de Melo)

- Remove x86 references from arch-neutral Build, fixing it in !x86 arches, reported as breaking the build for powerpc64le in linux-next (Arnaldo Carvalho de Melo)

Infrastructure:

- Do memset() variable 'st' using the correct size in the jit code (Colin Ian King)

- Fix postgresql ubuntu 'perf script' install instructions (Chris Phlipot)

- Use callchain_param more thoroughly when checking how callchains were configured, eventually will be the only way to look for callchain parameters (Arnaldo Carvalho de Melo)

- Fix some issues in the 'perf test kallsyms' entry (Arnaldo Carvalho de Melo)

----------------------------------------------------------------
Arnaldo Carvalho de Melo (12):
perf trace: Fix build when DWARF unwind isn't available
perf evsel: Add missign class prefix to has_branch_stack method perf script: Check sample->callchain before using it
perf callchain: Set callchain_param.enabled when parsing --call-graph perf report: Use callchain_param.enabled instead of tool specific knob perf tools: Ditch record_opts.callgraph_set
perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain perf build: Remove x86 references from arch-neutral Build perf symbols: Allow loading kallsyms without considering kcore files perf test: Ignore kcore files in the "vmlinux matches kallsyms" test perf test: Add missing verbose output explaining the reason for failure

Chris Phlipot (1):
perf script: Fix postgresql ubuntu install instructions

Colin Ian King (1):
perf jit: memset() variable 'st' using the correct size

 tools/perf/builtin-record.c                       | 14 ++++++-------
 tools/perf/builtin-report.c                       | 11 +++++-----
 tools/perf/builtin-script.c                       |  2 +-
 tools/perf/builtin-top.c                          | 25 +++++++++++------------
 tools/perf/builtin-trace.c                        | 10 ++++-----
 tools/perf/perf.h                                 |  1 -
 tools/perf/scripts/python/export-to-postgresql.py |  5 ++---
 tools/perf/tests/vmlinux-kallsyms.c               | 11 +++++++++-
 tools/perf/ui/browsers/hists.c                    |  5 ++---
 tools/perf/util/Build                             |  4 ----
 tools/perf/util/callchain.c                       |  2 ++
 tools/perf/util/evsel.h                           |  2 +-
 tools/perf/util/jitdump.c                         |  4 ++--
 tools/perf/util/machine.c                         | 14 +++++++++----
 tools/perf/util/machine.h                         |  2 ++
 tools/perf/util/session.c                         |  4 ++--
 tools/perf/util/symbol.c                          | 12 ++++++++---
 tools/perf/util/symbol.h                          |  2 ++
 18 files changed, 74 insertions(+), 56 deletions(-)
author maintainer
#1 lore raw

PATCH 1/14 perf trace: Fix build when DWARF unwind isn't available

From: Arnaldo Carvalho de Melo <[email protected]>

The variable is initialized and then conditionally set to a different value, but not used when DWARF unwinding is not available, bummer, write 1000 times: "Run make -C tools/perf build-test"...

builtin-trace.c: In function ‘cmd_trace’:
builtin-trace.c:3112:6: error: variable ‘max_stack_user_set’ set but not used [-Werror=unused-but-set-variable]

    bool max_stack_user_set = true;
        ^

cc1: all warnings being treated as err

Fix it by marking it as __maybe_unused.

Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Milian Wolff <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Fixes 056149932602 ("perf trace: Make --(min,max}-stack imply "--call-graph dwarf"")
---
 tools/perf/builtin-trace.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-trace.c +1 -1
index 026ec0c749b0..0e3c1cecef1b 100644
@@ -3109,7 +3109,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
 			"per thread proc mmap processing timeout in ms"),
 	OPT_END()
 	};
-	bool max_stack_user_set = true;
+	bool __maybe_unused max_stack_user_set = true;
 	bool mmap_pages_user_set = true;
 	const char * const trace_subcommands[] = { "record", NULL };
 	int err;
Signature · 1 line
2.5.5
author maintainer
#2 lore raw

PATCH 2/14 perf evsel: Add missign class prefix to has_branch_stack method

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

---
 tools/perf/util/evsel.h   | 2 +-
 tools/perf/util/machine.c | 2 +-
 tools/perf/util/session.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/evsel.h +1 -1
index b993218744d4..8a644fef452c 100644
@@ -420,7 +420,7 @@ for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); 	\
      (_evsel) && (_evsel)->leader == (_leader);					\
      (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node))
 
-static inline bool has_branch_callstack(struct perf_evsel *evsel)
+static inline bool perf_evsel__has_branch_callstack(const struct perf_evsel *evsel)
 {
 	return evsel->attr.branch_sample_type & PERF_SAMPLE_BRANCH_CALL_STACK;
 }
tools/perf/util/machine.c +1 -1
index 0c4dabc69932..52b51e004fe8 100644
@@ -1808,7 +1808,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,
 
 	callchain_cursor_reset(cursor);
 
-	if (has_branch_callstack(evsel)) {
+	if (perf_evsel__has_branch_callstack(evsel)) {
 		err = resolve_lbr_callchain_sample(thread, cursor, sample, parent,
 						   root_al, max_stack);
 		if (err)
tools/perf/util/session.c +2 -2
index ca1827c4af4a..2335b2824d8a 100644
@@ -907,7 +907,7 @@ static void callchain__printf(struct perf_evsel *evsel,
 	unsigned int i;
 	struct ip_callchain *callchain = sample->callchain;
 
-	if (has_branch_callstack(evsel))
+	if (perf_evsel__has_branch_callstack(evsel))
 		callchain__lbr_callstack_printf(sample);
 
 	printf("... FP chain: nr:%" PRIu64 "\n", callchain->nr);
@@ -1081,7 +1081,7 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
 	if (sample_type & PERF_SAMPLE_CALLCHAIN)
 		callchain__printf(evsel, sample);
 
-	if ((sample_type & PERF_SAMPLE_BRANCH_STACK) && !has_branch_callstack(evsel))
+	if ((sample_type & PERF_SAMPLE_BRANCH_STACK) && !perf_evsel__has_branch_callstack(evsel))
 		branch_stack__printf(sample);
 
 	if (sample_type & PERF_SAMPLE_REGS_USER)
Signature · 1 line
2.5.5
author maintainer
#3 lore raw

PATCH 3/14 perf script: Check sample->callchain before using it

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

Found by code inspection, while looking at thread__resolve_callchain() callsites, one had it, the other didn't.

---
 tools/perf/builtin-script.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-script.c +1 -1
index 0e93282b405e..5099740aa50b 100644
@@ -791,7 +791,7 @@ static void process_event(struct perf_script *script,
 	if (PRINT_FIELD(IP)) {
 		struct callchain_cursor *cursor = NULL, cursor_callchain;
 
-		if (symbol_conf.use_callchain &&
+		if (symbol_conf.use_callchain && sample->callchain &&
 		    thread__resolve_callchain(al->thread, &cursor_callchain, evsel,
 					      sample, NULL, NULL, scripting_max_stack) == 0)
 			cursor = &cursor_callchain;
Signature · 1 line
2.5.5
author maintainer
#4 lore raw

PATCH 4/14 perf callchain: Set callchain_param.enabled when parsing --call-graph

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

Trying to move in the direction of using callchain_param for all callchain parameters, eventually ditching them from symbol_conf.

---
 tools/perf/util/callchain.c | 2 ++
 1 file changed, 2 insertions(+)
tools/perf/util/callchain.c +2 -0
index 2b4ceaf058bb..aa248dcb4440 100644
@@ -109,6 +109,7 @@ __parse_callchain_report_opt(const char *arg, bool allow_record_opt)
 	bool record_opt_set = false;
 	bool try_stack_size = false;
 
+	callchain_param.enabled = true;
 	symbol_conf.use_callchain = true;
 
 	if (!arg)
@@ -117,6 +118,7 @@ __parse_callchain_report_opt(const char *arg, bool allow_record_opt)
 	while ((tok = strtok((char *)arg, ",")) != NULL) {
 		if (!strncmp(tok, "none", strlen(tok))) {
 			callchain_param.mode = CHAIN_NONE;
+			callchain_param.enabled = false;
 			symbol_conf.use_callchain = false;
 			return 0;
 		}
Signature · 1 line
2.5.5
author maintainer
#5 lore raw

PATCH 5/14 perf report: Use callchain_param.enabled instead of tool specific knob

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

We have callchain_param.enabled, so no need to have something just for 'perf report' to do the same thing.

---
 tools/perf/builtin-report.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
tools/perf/builtin-report.c +6 -5
index 160ea23b45aa..1d5be0bd426f 100644
@@ -47,7 +47,6 @@ struct report {
 	struct perf_tool	tool;
 	struct perf_session	*session;
 	bool			use_tui, use_gtk, use_stdio;
-	bool			dont_use_callchains;
 	bool			show_full_info;
 	bool			show_threads;
 	bool			inverted_callchain;
@@ -247,7 +246,7 @@ static int report__setup_sample_type(struct report *rep)
 				  "you call 'perf record' without -g?\n");
 			return -1;
 		}
-	} else if (!rep->dont_use_callchains &&
+	} else if (!callchain_param.enabled &&
 		   callchain_param.mode != CHAIN_NONE &&
 		   !symbol_conf.use_callchain) {
 			symbol_conf.use_callchain = true;
@@ -599,13 +598,15 @@ static int __cmd_report(struct report *rep)
 static int
 report_parse_callchain_opt(const struct option *opt, const char *arg, int unset)
 {
-	struct report *rep = (struct report *)opt->value;
+	struct callchain_param *callchain = opt->value;
 
+	callchain->enabled = !unset;
 	/*
 	 * --no-call-graph
 	 */
 	if (unset) {
-		rep->dont_use_callchains = true;
+		symbol_conf.use_callchain = false;
+		callchain->mode = CHAIN_NONE;
 		return 0;
 	}
 
@@ -734,7 +735,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 		   "regex filter to identify parent, see: '--sort parent'"),
 	OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
 		    "Only display entries with parent-match"),
-	OPT_CALLBACK_DEFAULT('g', "call-graph", &report,
+	OPT_CALLBACK_DEFAULT('g', "call-graph", &callchain_param,
 			     "print_type,threshold[,print_limit],order,sort_key[,branch],value",
 			     report_callchain_help, &report_parse_callchain_opt,
 			     callchain_default_opt),
Signature · 1 line
2.5.5
author maintainer
#6 lore raw

PATCH 6/14 perf tools: Ditch record_opts.callgraph_set

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

We have callchain_param.enabled for that.

---
 tools/perf/builtin-record.c | 14 ++++++--------
 tools/perf/builtin-top.c    | 13 ++++++-------
 tools/perf/builtin-trace.c  |  8 ++++----
 tools/perf/perf.h           |  1 -
 4 files changed, 16 insertions(+), 20 deletions(-)
tools/perf/builtin-record.c +6 -8
index 5b4758a08a49..bd9593346bb2 100644
@@ -946,7 +946,6 @@ int record_opts__parse_callchain(struct record_opts *record,
 				 const char *arg, bool unset)
 {
 	int ret;
-	record->callgraph_set = true;
 	callchain->enabled = !unset;
 
 	/* --no-call-graph */
@@ -978,15 +977,14 @@ int record_callchain_opt(const struct option *opt,
 			 const char *arg __maybe_unused,
 			 int unset __maybe_unused)
 {
-	struct record_opts *record = (struct record_opts *)opt->value;
+	struct callchain_param *callchain = opt->value;
 
-	record->callgraph_set = true;
-	callchain_param.enabled = true;
+	callchain->enabled = true;
 
-	if (callchain_param.record_mode == CALLCHAIN_NONE)
-		callchain_param.record_mode = CALLCHAIN_FP;
+	if (callchain->record_mode == CALLCHAIN_NONE)
+		callchain->record_mode = CALLCHAIN_FP;
 
-	callchain_debug(&callchain_param);
+	callchain_debug(callchain);
 	return 0;
 }
 
@@ -1224,7 +1222,7 @@ struct option __record_options[] = {
 		     record__parse_mmap_pages),
 	OPT_BOOLEAN(0, "group", &record.opts.group,
 		    "put the counters into a counter group"),
-	OPT_CALLBACK_NOOPT('g', NULL, &record.opts,
+	OPT_CALLBACK_NOOPT('g', NULL, &callchain_param,
 			   NULL, "enables call-graph recording" ,
 			   &record_callchain_opt),
 	OPT_CALLBACK(0, "call-graph", &record.opts,
tools/perf/builtin-top.c +6 -7
index 8846df0ec0c3..f0cfdf394fac 100644
@@ -1045,18 +1045,17 @@ callchain_opt(const struct option *opt, const char *arg, int unset)
 static int
 parse_callchain_opt(const struct option *opt, const char *arg, int unset)
 {
-	struct record_opts *record = (struct record_opts *)opt->value;
+	struct callchain_param *callchain = opt->value;
 
-	record->callgraph_set = true;
-	callchain_param.enabled = !unset;
-	callchain_param.record_mode = CALLCHAIN_FP;
+	callchain->enabled = !unset;
+	callchain->record_mode = CALLCHAIN_FP;
 
 	/*
 	 * --no-call-graph
 	 */
 	if (unset) {
 		symbol_conf.use_callchain = false;
-		callchain_param.record_mode = CALLCHAIN_NONE;
+		callchain->record_mode = CALLCHAIN_NONE;
 		return 0;
 	}
 
@@ -1162,10 +1161,10 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
 		   "output field(s): overhead, period, sample plus all of sort keys"),
 	OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
 		    "Show a column with the number of samples"),
-	OPT_CALLBACK_NOOPT('g', NULL, &top.record_opts,
+	OPT_CALLBACK_NOOPT('g', NULL, &callchain_param,
 			   NULL, "enables call-graph recording and display",
 			   &callchain_opt),
-	OPT_CALLBACK(0, "call-graph", &top.record_opts,
+	OPT_CALLBACK(0, "call-graph", &callchain_param,
 		     "record_mode[,record_size],print_type,threshold[,print_limit],order,sort_key[,branch]",
 		     top_callchain_help, &parse_callchain_opt),
 	OPT_BOOLEAN(0, "children", &symbol_conf.cumulate_callchain,
tools/perf/builtin-trace.c +4 -4
index 0e3c1cecef1b..5e2614bbb48d 100644
@@ -2457,7 +2457,7 @@ static int trace__add_syscall_newtp(struct trace *trace)
 	perf_evlist__add(evlist, sys_enter);
 	perf_evlist__add(evlist, sys_exit);
 
-	if (trace->opts.callgraph_set && !trace->kernel_syscallchains) {
+	if (callchain_param.enabled && !trace->kernel_syscallchains) {
 		/*
 		 * We're interested only in the user space callchain
 		 * leading to the syscall, allow overriding that for
@@ -2546,7 +2546,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
 
 	perf_evlist__config(evlist, &trace->opts, NULL);
 
-	if (trace->opts.callgraph_set && trace->syscalls.events.sys_exit) {
+	if (callchain_param.enabled && trace->syscalls.events.sys_exit) {
 		perf_evsel__config_callchain(trace->syscalls.events.sys_exit,
 					     &trace->opts, &callchain_param);
                /*
@@ -3153,11 +3153,11 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
 	}
 
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
-	if ((trace.min_stack || max_stack_user_set) && !trace.opts.callgraph_set)
+	if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled)
 		record_opts__parse_callchain(&trace.opts, &callchain_param, "dwarf", false);
 #endif
 
-	if (trace.opts.callgraph_set) {
+	if (callchain_param.enabled) {
 		if (!mmap_pages_user_set && geteuid() == 0)
 			trace.opts.mmap_pages = perf_event_mlock_kb_in_pages() * 4;
 
tools/perf/perf.h +0 -1
index 5381a01c0610..cd8f1b150f9e 100644
@@ -52,7 +52,6 @@ struct record_opts {
 	bool	     sample_weight;
 	bool	     sample_time;
 	bool	     sample_time_set;
-	bool	     callgraph_set;
 	bool	     period;
 	bool	     running_time;
 	bool	     full_auxtrace;
Signature · 1 line
2.5.5
author maintainer
#7 lore raw

PATCH 7/14 perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

---
 tools/perf/ui/browsers/hists.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/ui/browsers/hists.c +2 -3
index e70df2e54d66..6a4681932ba5 100644
@@ -1896,11 +1896,10 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser,
 	bool first = true;
 	int ret;
 
-	if (symbol_conf.use_callchain)
+	if (symbol_conf.use_callchain) {
 		folded_sign = hist_entry__folded(he);
-
-	if (symbol_conf.use_callchain)
 		printed += fprintf(fp, "%c ", folded_sign);
+	}
 
 	hists__for_each_format(browser->hists, fmt) {
 		if (perf_hpp__should_skip(fmt, he->hists))
Signature · 1 line
2.5.5
author maintainer
#8 lore raw

PATCH 8/14 perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

One more step in the direction of using just callchain_param for callchain parameters.

---
 tools/perf/builtin-top.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/builtin-top.c +6 -6
index f0cfdf394fac..c130a11d3a0d 100644
@@ -917,15 +917,15 @@ out_err:
 	return -1;
 }
 
-static int perf_top__setup_sample_type(struct perf_top *top __maybe_unused)
+static int callchain_param__setup_sample_type(struct callchain_param *callchain)
 {
 	if (!sort__has_sym) {
-		if (symbol_conf.use_callchain) {
+		if (callchain->enabled) {
 			ui__error("Selected -g but \"sym\" not present in --sort/-s.");
 			return -EINVAL;
 		}
-	} else if (callchain_param.mode != CHAIN_NONE) {
-		if (callchain_register_param(&callchain_param) < 0) {
+	} else if (callchain->mode != CHAIN_NONE) {
+		if (callchain_register_param(callchain) < 0) {
 			ui__error("Can't register callchain params.\n");
 			return -EINVAL;
 		}
@@ -952,7 +952,7 @@ static int __cmd_top(struct perf_top *top)
 			goto out_delete;
 	}
 
-	ret = perf_top__setup_sample_type(top);
+	ret = callchain_param__setup_sample_type(&callchain_param);
 	if (ret)
 		goto out_delete;
 
@@ -1311,7 +1311,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
 
 	top.sym_evsel = perf_evlist__first(top.evlist);
 
-	if (!symbol_conf.use_callchain) {
+	if (!callchain_param.enabled) {
 		symbol_conf.cumulate_callchain = false;
 		perf_hpp__cancel_cumulate();
 	}
Signature · 1 line
2.5.5
author maintainer
#9 lore raw

PATCH 9/14 perf script: Fix postgresql ubuntu install instructions

In reply to Arnaldo Carvalho de Melo

From: Chris Phlipot <[email protected]>

The current instructions for setting up an Ubuntu system for using the export-to-postgresql.py script are incorrect.

The instructions in the script have been updated to work on newer versions of ubuntu.

-Add missing dependencies to apt-get command:
python-pyside.qtsql, libqt4-sql-psql
-Add '-s' option to createuser command to force the user to be a
superuser since the command doesn't prompt as indicated in the current instructions.

Tested on: Ubuntu 14.04, Ubuntu 16.04(beta)

---
 tools/perf/scripts/python/export-to-postgresql.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/scripts/python/export-to-postgresql.py +2 -3
index 1b02cdc0cab6..6f0ca6873c17 100644
@@ -34,10 +34,9 @@ import datetime
 #
 # ubuntu:
 #
-#	$ sudo apt-get install postgresql
+#	$ sudo apt-get install postgresql python-pyside.qtsql libqt4-sql-psql
 #	$ sudo su - postgres
-#	$ createuser <your user id here>
-#	Shall the new role be a superuser? (y/n) y
+#	$ createuser -s <your user id here>
 #
 # An example of using this script with Intel PT:
 #
Signature · 1 line
2.5.5
author maintainer
#10 lore raw

PATCH 10/14 perf jit: memset() variable 'st' using the correct size

In reply to Arnaldo Carvalho de Melo

From: Colin Ian King <[email protected]>

The current code is memsetting the 'struct stat' variable 'st' with the size of 'stat' (which turns out to be 1 byte) rather than the size of variable 'sz'.

Committer notes:

sizeof(function) isn't valid, the result depends on the compiler used, with gcc, enabling pedantic warnings we get:

  $ cat sizeof_function.c
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <unistd.h>
  #include <stdio.h>

int main(void)

  {
	  printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
	  return 0;
  }
  $ readelf -sW sizeof_function | grep -w stat
      49: 0000000000400630    16 FUNC    WEAK   HIDDEN    13 stat
  $ cc -pedantic sizeof_function.c   -o sizeof_function
  sizeof_function.c: In function ‘main’:
  sizeof_function.c:8:46: warning: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
    printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
                                              ^
  $ ./sizeof_function
  sizeof(stat)=1, stat=0x400630
  $

Standard C, section 6.5.3.4:

"The sizeof operator shall not be applied to an expression that has function
type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member."

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

Cc Adrian Hunter <[email protected]>
Cc Alexander Shishkin <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Fixes 9b07e27f88b9 ("perf inject: Add jitdump mmap injection support")
---
 tools/perf/util/jitdump.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/jitdump.c +2 -2
index 52fcef3074fe..86afe9618bb0 100644
@@ -412,7 +412,7 @@ static int jit_repipe_code_load(struct jit_buf_desc *jd, union jr_entry *jr)
 		return -1;
 	}
 	if (stat(filename, &st))
-		memset(&st, 0, sizeof(stat));
+		memset(&st, 0, sizeof(st));
 
 	event->mmap2.header.type = PERF_RECORD_MMAP2;
 	event->mmap2.header.misc = PERF_RECORD_MISC_USER;
@@ -500,7 +500,7 @@ static int jit_repipe_code_move(struct jit_buf_desc *jd, union jr_entry *jr)
 	size++; /* for \0 */
 
 	if (stat(filename, &st))
-		memset(&st, 0, sizeof(stat));
+		memset(&st, 0, sizeof(st));
 
 	size = PERF_ALIGN(size, sizeof(u64));
 
Signature · 1 line
2.5.5
author maintainer
#11 lore raw

PATCH 11/14 perf build: Remove x86 references from arch-neutral Build

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

It will already be dealt with generating the syscalltbl.c file in the x86 arch specific Build files, namely via 'archheaders'.

This fixes the build on !x86 arches, as reported for powerpcle

Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc "H. Peter Anvin" <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Thomas Gleixner <[email protected]>
Cc Wang Nan <[email protected]>
Fixes 1b700c997500 ("perf tools: Build syscall table .c header from kernel's syscall_64.tbl")
[ Removed the syscalltbl.o altogether, as per Jiri's suggestion ]
---
 tools/perf/util/Build | 4 ----
 1 file changed, 4 deletions(-)
tools/perf/util/Build +0 -4
index 85a9ab62e23f..90229a88f969 100644
@@ -150,10 +150,6 @@ CFLAGS_libstring.o     += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ET
 CFLAGS_hweight.o       += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
 CFLAGS_parse-events.o  += -Wno-redundant-decls
 
-$(OUTPUT)util/syscalltbl.o: util/syscalltbl.c arch/x86/entry/syscalls/syscall_64.tbl $(OUTPUT)arch/x86/include/generated/asm/syscalls_64.c FORCE
-	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
-
 $(OUTPUT)util/kallsyms.o: ../lib/symbol/kallsyms.c FORCE
 	$(call rule_mkdir)
 	$(call if_changed_dep,cc_o_c)
Signature · 1 line
2.5.5
author maintainer
#12 lore raw

PATCH 12/14 perf symbols: Allow loading kallsyms without considering kcore files

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

Before the support for using /proc/kcore was introduced, the kallsyms routines used /proc/modules and the first 'perf test' entry expected finding maps for each module in the system, which is not the case with the kcore code. Provide a way to ignore kcore files so that the test can have its expectations met.

Improving the test to cover kcore files as well needs to be done.

---
 tools/perf/util/machine.c | 12 +++++++++---
 tools/perf/util/machine.h |  2 ++
 tools/perf/util/symbol.c  | 12 +++++++++---
 tools/perf/util/symbol.h  |  2 ++
 4 files changed, 22 insertions(+), 6 deletions(-)
tools/perf/util/machine.c +9 -3
index 52b51e004fe8..656c1d7ee7d4 100644
@@ -908,11 +908,11 @@ int machines__create_kernel_maps(struct machines *machines, pid_t pid)
 	return machine__create_kernel_maps(machine);
 }
 
-int machine__load_kallsyms(struct machine *machine, const char *filename,
-			   enum map_type type, symbol_filter_t filter)
+int __machine__load_kallsyms(struct machine *machine, const char *filename,
+			     enum map_type type, bool no_kcore, symbol_filter_t filter)
 {
 	struct map *map = machine__kernel_map(machine);
-	int ret = dso__load_kallsyms(map->dso, filename, map, filter);
+	int ret = __dso__load_kallsyms(map->dso, filename, map, no_kcore, filter);
 
 	if (ret > 0) {
 		dso__set_loaded(map->dso, type);
@@ -927,6 +927,12 @@ int machine__load_kallsyms(struct machine *machine, const char *filename,
 	return ret;
 }
 
+int machine__load_kallsyms(struct machine *machine, const char *filename,
+			   enum map_type type, symbol_filter_t filter)
+{
+	return __machine__load_kallsyms(machine, filename, type, false, filter);
+}
+
 int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
 			       symbol_filter_t filter)
 {
tools/perf/util/machine.h +2 -0
index 382873bdc563..4822de5e4544 100644
@@ -215,6 +215,8 @@ struct symbol *machine__find_kernel_function_by_name(struct machine *machine,
 struct map *machine__findnew_module_map(struct machine *machine, u64 start,
 					const char *filename);
 
+int __machine__load_kallsyms(struct machine *machine, const char *filename,
+			     enum map_type type, bool no_kcore, symbol_filter_t filter);
 int machine__load_kallsyms(struct machine *machine, const char *filename,
 			   enum map_type type, symbol_filter_t filter);
 int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
tools/perf/util/symbol.c +9 -3
index a36823c3b7c0..415c4f6d98fd 100644
@@ -1208,8 +1208,8 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)
 	return 0;
 }
 
-int dso__load_kallsyms(struct dso *dso, const char *filename,
-		       struct map *map, symbol_filter_t filter)
+int __dso__load_kallsyms(struct dso *dso, const char *filename,
+			 struct map *map, bool no_kcore, symbol_filter_t filter)
 {
 	u64 delta = 0;
 
@@ -1230,12 +1230,18 @@ int dso__load_kallsyms(struct dso *dso, const char *filename,
 	else
 		dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
 
-	if (!dso__load_kcore(dso, map, filename))
+	if (!no_kcore && !dso__load_kcore(dso, map, filename))
 		return dso__split_kallsyms_for_kcore(dso, map, filter);
 	else
 		return dso__split_kallsyms(dso, map, delta, filter);
 }
 
+int dso__load_kallsyms(struct dso *dso, const char *filename,
+		       struct map *map, symbol_filter_t filter)
+{
+	return __dso__load_kallsyms(dso, filename, map, false, filter);
+}
+
 static int dso__load_perf_map(struct dso *dso, struct map *map,
 			      symbol_filter_t filter)
 {
tools/perf/util/symbol.h +2 -0
index 1da7b101bc7f..c8e43979ed5c 100644
@@ -240,6 +240,8 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
 		      symbol_filter_t filter);
 int dso__load_vmlinux_path(struct dso *dso, struct map *map,
 			   symbol_filter_t filter);
+int __dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
+			 bool no_kcore, symbol_filter_t filter);
 int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
 		       symbol_filter_t filter);
 
Signature · 1 line
2.5.5
author maintainer
#13 lore raw

PATCH 13/14 perf test: Ignore kcore files in the "vmlinux matches kallsyms" test

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

Before:

  # perf test -v kallsyms
<SNIP>
  Maps only in vmlinux:
   ffffffff81d5e000-ffffffff81ec3ac8 115e000 [kernel].init.text
   ffffffff81ec3ac8-ffffffffa0000000 12c3ac8 [kernel].exit.text
   ffffffffa0000000-ffffffffa000c000 0 [fjes]
   ffffffffa000c000-ffffffffa0017000 0 [video]
   ffffffffa0017000-ffffffffa001c000 0 [grace]
<SNIP>
   ffffffffa0a7f000-ffffffffa0ba5000 0 [xfs]
   ffffffffa0ba5000-ffffffffffffffff 0 [veth]
  Maps in vmlinux with a different name in kallsyms:
  Maps only in kallsyms:
   ffff880000100000-ffff88001000b000 80000103000 [kernel.kallsyms]
   ffff88001000b000-ffff880100000000 8001000e000 [kernel.kallsyms]
   ffff880100000000-ffffc90000000000 80100003000 [kernel.kallsyms]
<SNIP>
   ffffffffa0000000-ffffffffff600000 7fffa0003000 [kernel.kallsyms]
   ffffffffff600000-ffffffffffffffff 7fffff603000 [kernel.kallsyms]
  test child finished with -1
  ---- end ----
  vmlinux symtab matches kallsyms: FAILED!
  #

After:

  # perf test -v 1
   1: vmlinux symtab matches kallsyms                          :
  --- start ---
  test child forked, pid 7058
  Looking at the vmlinux_path (8 entries long)
  Using /lib/modules/4.6.0-rc1+/build/vmlinux for symbols
  0xffffffff81076870: diff end addr for aesni_gcm_dec v: 0xffffffff810791f2 k: 0xffffffff81076902
  0xffffffff81079200: diff end addr for aesni_gcm_enc v: 0xffffffff8107bb03 k: 0xffffffff81079292
  0xffffffff8107e8d0: diff end addr for aesni_gcm_enc_avx_gen2 v: 0xffffffff81083e76 k: 0xffffffff8107e943
  0xffffffff81083e80: diff end addr for aesni_gcm_dec_avx_gen2 v: 0xffffffff81089611 k: 0xffffffff81083ef3
  0xffffffff81089990: diff end addr for aesni_gcm_enc_avx_gen4 v: 0xffffffff8108e7c4 k: 0xffffffff81089a03
  0xffffffff8108e7d0: diff end addr for aesni_gcm_dec_avx_gen4 v: 0xffffffff810937ef k: 0xffffffff8108e843
  Maps only in vmlinux:
   ffffffff81d5e000-ffffffff81ec3ac8 115e000 [kernel].init.text
   ffffffff81ec3ac8-ffffffffa0000000 12c3ac8 [kernel].exit.text
  Maps in vmlinux with a different name in kallsyms:
  Maps only in kallsyms:
  test child finished with -1
  ---- end ----
 vmlinux symtab matches kallsyms: FAILED!
  #
Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Fixes 8e0cf965f95e ("perf symbols: Add support for reading from /proc/kcore")
---
 tools/perf/tests/vmlinux-kallsyms.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
tools/perf/tests/vmlinux-kallsyms.c +7 -1
index 630b0b409b97..c05f1bdd9210 100644
@@ -54,8 +54,14 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)
 	 * Step 3:
 	 *
 	 * Load and split /proc/kallsyms into multiple maps, one per module.
+	 * Do not use kcore, as this test was designed before kcore support
+	 * and has parts that only make sense if using the non-kcore code.
+	 * XXX: extend it to stress the kcorre code as well, hint: the list
+	 * of modules extracted from /proc/kcore, in its current form, can't
+	 * be compacted against the list of modules found in the "vmlinux"
+	 * code and with the one got from /proc/modules from the "kallsyms" code.
 	 */
-	if (machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, NULL) <= 0) {
+	if (__machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, true, NULL) <= 0) {
 		pr_debug("dso__load_kallsyms ");
 		goto out;
 	}
Signature · 1 line
2.5.5
author maintainer
#14 lore raw

PATCH 14/14 perf test: Add missing verbose output explaining the reason for failure

In reply to Arnaldo Carvalho de Melo

From: Arnaldo Carvalho de Melo <[email protected]>

One of the branches leading to an error had no debug message emitted, fix it, the new lines are:

  # perf test -v kallsyms
<SNIP>
  0xffffffff81001000: diff name v: xen_hypercall_set_trap_table k: hypercall_page
  0xffffffff810691f0: diff name v: try_to_free_pud_page k: try_to_free_pmd_page
<SNIP>
  0xffffffff8150bb20: diff name v: wakeup_expire_count_show.part.5 k: wakeup_active_count_show.part.7
  0xffffffff816bc7f0: diff name v: phys_switch_id_show.part.11 k: phys_port_name_show.part.12
  0xffffffff817bbb90: diff name v: __do_softirq k: __softirqentry_text_start
<SNIP>

This in turn exercises another bug, still under investigation, because those aliases _are_ in kallsyms, with the same name...

Cc Adrian Hunter <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Fixes ab414dcda8fa ("perf test: Fixup aliases checking in the 'vmlinux matches kallsyms' test")
---
 tools/perf/tests/vmlinux-kallsyms.c | 3 +++
 1 file changed, 3 insertions(+)
tools/perf/tests/vmlinux-kallsyms.c +3 -0
index c05f1bdd9210..e63abab7d5a1 100644
@@ -163,6 +163,9 @@ next_pair:
 
 					pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n",
 						 mem_start, sym->name, pair->name);
+				} else {
+					pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n",
+						 mem_start, sym->name, first_pair->name);
 				}
 			}
 		} else
Signature · 1 line
2.5.5
#15 lore raw
In reply to Arnaldo Carvalho de Melo
Quoted 75 lines · Arnaldo Carvalho de Melo

Hi Ingo,

Please consider pulling,

- Arnaldo

The following changes since commit 9243ae5b28d02dc7d71a4f00c981ef6feaede3f1:

Merge tag 'perf-core-for-mingo-20160415' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-04-16 11:09:57 +0200)

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160419

for you to fetch changes up to 6566feafb4dba4eef30a9c0b25e6f49f996178b6:

perf test: Add missing verbose output explaining the reason for failure (2016-04-19 12:39:36 -0300)

----------------------------------------------------------------
perf/core improvements and fixes:

Build fixes:

- Fix 'perf trace' build when DWARF unwind isn't available (Arnaldo Carvalho de Melo)

- Remove x86 references from arch-neutral Build, fixing it in !x86 arches, reported as breaking the build for powerpc64le in linux-next (Arnaldo Carvalho de Melo)

Infrastructure:

- Do memset() variable 'st' using the correct size in the jit code (Colin Ian King)

- Fix postgresql ubuntu 'perf script' install instructions (Chris Phlipot)

- Use callchain_param more thoroughly when checking how callchains were configured, eventually will be the only way to look for callchain parameters (Arnaldo Carvalho de Melo)

- Fix some issues in the 'perf test kallsyms' entry (Arnaldo Carvalho de Melo)

----------------------------------------------------------------
Arnaldo Carvalho de Melo (12):
perf trace: Fix build when DWARF unwind isn't available
perf evsel: Add missign class prefix to has_branch_stack method perf script: Check sample->callchain before using it
perf callchain: Set callchain_param.enabled when parsing --call-graph perf report: Use callchain_param.enabled instead of tool specific knob perf tools: Ditch record_opts.callgraph_set
perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain perf build: Remove x86 references from arch-neutral Build perf symbols: Allow loading kallsyms without considering kcore files perf test: Ignore kcore files in the "vmlinux matches kallsyms" test perf test: Add missing verbose output explaining the reason for failure

Chris Phlipot (1):
perf script: Fix postgresql ubuntu install instructions

Colin Ian King (1):
perf jit: memset() variable 'st' using the correct size

 tools/perf/builtin-record.c                       | 14 ++++++-------
 tools/perf/builtin-report.c                       | 11 +++++-----
 tools/perf/builtin-script.c                       |  2 +-
 tools/perf/builtin-top.c                          | 25 +++++++++++------------
 tools/perf/builtin-trace.c                        | 10 ++++-----
 tools/perf/perf.h                                 |  1 -
 tools/perf/scripts/python/export-to-postgresql.py |  5 ++---
 tools/perf/tests/vmlinux-kallsyms.c               | 11 +++++++++-
 tools/perf/ui/browsers/hists.c                    |  5 ++---
 tools/perf/util/Build                             |  4 ----
 tools/perf/util/callchain.c                       |  2 ++
Quoted 8 lines
 tools/perf/util/evsel.h                           |  2 +-
 tools/perf/util/jitdump.c                         |  4 ++--
 tools/perf/util/machine.c                         | 14 +++++++++----
 tools/perf/util/machine.h                         |  2 ++
 tools/perf/util/session.c                         |  4 ++--
 tools/perf/util/symbol.c                          | 12 ++++++++---
 tools/perf/util/symbol.h                          |  2 ++
 18 files changed, 74 insertions(+), 56 deletions(-)

Pulled, thanks a lot Arnaldo!

Ingo