All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/23] perf tools: Several memory events updates
@ 2016-02-15  8:34 Jiri Olsa
  2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
                   ` (22 more replies)
  0 siblings, 23 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

hi,
this is generic part of the c2c patchset. It contains
several enhancements for perf mem and script commands:

  - display memory events properties in perf script
  - perf mem DATALA events support
  - few other assorted fixes/options

Also available in here:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  perf/mem

thanks,
jirka


---
Jiri Olsa (23):
      perf record: Add --all-user/--all-kernel options
      perf tools: Make cl_address global
      perf tools: Introduce cl_offset function
      perf tools: Add monitored events array
      perf mem: Add -e record option
      perf mem: Check for memory events support
      perf mem: Introduce perf_mem_events__name function
      perf mem: Add -l/--ldlat option
      perf mem: Add -u/-k options
      perf x86 intel: Add DATALA events into sysfs
      perf mem: Add Intel DATALA memory events
      perf tools: Use ARRAY_SIZE in mem sort display functions
      perf tools: Introduce perf_mem__tlb_scnprintf function
      perf tools: Introduce perf_mem__lvl_scnprintf function
      perf tools: Introduce perf_mem__snp_scnprintf function
      perf tools: Introduce perf_mem__lck_scnprintf function
      perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
      perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
      perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
      perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
      perf script: Add data_src and weight column definitions
      perf script: Display addr/data_src/weight columns for raw events
      perf script: Display data_src values

 arch/x86/kernel/cpu/perf_event_intel.c   |  39 +++++++++++++
 tools/perf/Documentation/perf-record.txt |   6 ++
 tools/perf/builtin-mem.c                 |  96 +++++++++++++++++++++++++++---
 tools/perf/builtin-record.c              |   4 ++
 tools/perf/builtin-script.c              |  41 ++++++++++++-
 tools/perf/perf.h                        |   2 +
 tools/perf/util/Build                    |   1 +
 tools/perf/util/evsel.c                  |  10 ++++
 tools/perf/util/mem-events.c             | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/mem-events.h             |  56 ++++++++++++++++++
 tools/perf/util/sort.c                   | 148 ++--------------------------------------------
 tools/perf/util/sort.h                   |  11 ++++
 12 files changed, 551 insertions(+), 152 deletions(-)
 create mode 100644 tools/perf/util/mem-events.c
 create mode 100644 tools/perf/util/mem-events.h

^ permalink raw reply	[flat|nested] 45+ messages in thread

* [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-16 16:56   ` Arnaldo Carvalho de Melo
  2016-02-20 11:34   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 02/23] perf tools: Make cl_address global Jiri Olsa
                   ` (21 subsequent siblings)
  22 siblings, 2 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Allow user to easily switch all events to user or
kernel space with simple --all-user or --all-kernel
options.

This will be handy within perf mem/c2c wrappers to
switch easily monitoring modes.

Link: http://lkml.kernel.org/n/tip-hdd2u0y1o8cwfpplrpzc1iqd@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/Documentation/perf-record.txt |  6 ++++++
 tools/perf/builtin-record.c              |  4 ++++
 tools/perf/perf.h                        |  2 ++
 tools/perf/util/evsel.c                  | 10 ++++++++++
 4 files changed, 22 insertions(+)

diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index fbceb631387c..19aa17532a16 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo.
 --buildid-all::
 Record build-id of all DSOs regardless whether it's actually hit or not.
 
+--all-kernel::
+Configure all used events to run in kernel space.
+
+--all-user::
+Configure all used events to run in user space.
+
 SEE ALSO
 --------
 linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index caa8235ed027..b64f31a4c993 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1151,6 +1151,10 @@ struct option __record_options[] = {
 			"per thread proc mmap processing timeout in ms"),
 	OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
 		    "Record context switch events"),
+	OPT_BOOLEAN(0, "all-kernel", &record.opts.all_kernel,
+		    "Configure all used events to run in kernel space."),
+	OPT_BOOLEAN(0, "all-user", &record.opts.all_user,
+		    "Configure all used events to run in user space."),
 	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
 		   "clang binary to use for compiling BPF scriptlets"),
 	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index 90129accffbe..5381a01c0610 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -58,6 +58,8 @@ struct record_opts {
 	bool	     full_auxtrace;
 	bool	     auxtrace_snapshot_mode;
 	bool	     record_switch_events;
+	bool	     all_kernel;
+	bool	     all_user;
 	unsigned int freq;
 	unsigned int mmap_pages;
 	unsigned int auxtrace_mmap_pages;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 467808680ee4..6ae20d0056de 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
 	if (evsel->precise_max)
 		perf_event_attr__set_max_precise_ip(attr);
 
+	if (opts->all_user) {
+		attr->exclude_kernel = 1;
+		attr->exclude_user   = 0;
+	}
+
+	if (opts->all_kernel) {
+		attr->exclude_kernel = 0;
+		attr->exclude_user   = 1;
+	}
+
 	/*
 	 * Apply event specific term settings,
 	 * it overloads any global configuration.
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 02/23] perf tools: Make cl_address global
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
  2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa
                   ` (20 subsequent siblings)
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

It'll be used in following patches.

Link: http://lkml.kernel.org/n/tip-up22drulx98h0nskjtpngr5s@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.c | 6 ------
 tools/perf/util/sort.h | 5 +++++
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index de715756f281..3305149326bb 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1020,12 +1020,6 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 	return repsep_snprintf(bf, size, "%-*s", width, out);
 }
 
-static inline  u64 cl_address(u64 address)
-{
-	/* return the cacheline of the address */
-	return (address & ~(cacheline_size - 1));
-}
-
 static int64_t
 sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right)
 {
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 89a1273fd2da..46f159f9d947 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -162,6 +162,11 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he)
 	return period * 100.0 / total_period;
 }
 
+static inline u64 cl_address(u64 address)
+{
+	/* return the cacheline of the address */
+	return (address & ~(cacheline_size - 1));
+}
 
 enum sort_mode {
 	SORT_MODE__NORMAL,
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 03/23] perf tools: Introduce cl_offset function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
  2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
  2016-02-15  8:34 ` [PATCH 02/23] perf tools: Make cl_address global Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
                   ` (19 subsequent siblings)
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

It'll be used in following patches.

Link: http://lkml.kernel.org/n/tip-m7dfmhya60y30hzhboeaczqk@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 46f159f9d947..5b9c6246de6d 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -168,6 +168,12 @@ static inline u64 cl_address(u64 address)
 	return (address & ~(cacheline_size - 1));
 }
 
+static inline u64 cl_offset(u64 address)
+{
+	/* return the cacheline of the address */
+	return (address & (cacheline_size - 1));
+}
+
 enum sort_mode {
 	SORT_MODE__NORMAL,
 	SORT_MODE__BRANCH,
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 04/23] perf tools: Add monitored events array
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (2 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-23 15:10   ` Arnaldo Carvalho de Melo
  2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 05/23] perf mem: Add -e record option Jiri Olsa
                   ` (18 subsequent siblings)
  22 siblings, 2 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

It will ease up configuration of memory events
and addition of other memory events in following
patches.

Link: http://lkml.kernel.org/n/tip-5n4yyd6dlrjhpd9rmaa2sycs@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c     | 17 +++++++++--------
 tools/perf/util/Build        |  1 +
 tools/perf/util/mem-events.c | 10 ++++++++++
 tools/perf/util/mem-events.h | 20 ++++++++++++++++++++
 4 files changed, 40 insertions(+), 8 deletions(-)
 create mode 100644 tools/perf/util/mem-events.c
 create mode 100644 tools/perf/util/mem-events.h

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 390170041696..36c56a4b778b 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -6,6 +6,7 @@
 #include "util/tool.h"
 #include "util/session.h"
 #include "util/data.h"
+#include "util/mem-events.h"
 
 #define MEM_OPERATION_LOAD	0x1
 #define MEM_OPERATION_STORE	0x2
@@ -34,20 +35,20 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 	rec_argv[i++] = "record";
 
-	if (mem->operation & MEM_OPERATION_LOAD)
+	if (mem->operation & MEM_OPERATION_LOAD) {
+		perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
 		rec_argv[i++] = "-W";
+	}
 
 	rec_argv[i++] = "-d";
 
-	if (mem->operation & MEM_OPERATION_LOAD) {
-		rec_argv[i++] = "-e";
-		rec_argv[i++] = "cpu/mem-loads/pp";
-	}
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		if (!perf_mem_events[j].record)
+			continue;
 
-	if (mem->operation & MEM_OPERATION_STORE) {
 		rec_argv[i++] = "-e";
-		rec_argv[i++] = "cpu/mem-stores/pp";
-	}
+		rec_argv[i++] = perf_mem_events[j].name;
+	};
 
 	for (j = 1; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index a34752d28488..df2b690970ac 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -82,6 +82,7 @@ libperf-y += parse-branch-options.o
 libperf-y += parse-regs-options.o
 libperf-y += term.o
 libperf-y += help-unknown-cmd.o
+libperf-y += mem-events.o
 
 libperf-$(CONFIG_LIBBPF) += bpf-loader.o
 libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
new file mode 100644
index 000000000000..c6ba0a19ec9a
--- /dev/null
+++ b/tools/perf/util/mem-events.c
@@ -0,0 +1,10 @@
+#include "mem-events.h"
+
+#define E(n) { .name = n }
+
+struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
+	E("cpu/mem-loads,ldlat=30/P"),
+	E("cpu/mem-stores/P"),
+};
+
+#undef E
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
new file mode 100644
index 000000000000..ee5fde222389
--- /dev/null
+++ b/tools/perf/util/mem-events.h
@@ -0,0 +1,20 @@
+#ifndef __PERF_MEM_EVENTS_H
+#define __PERF_MEM_EVENTS_H
+
+#include <stdbool.h>
+
+struct perf_mem_event {
+	bool		record;
+	const char	*name;
+};
+
+enum {
+	PERF_MEM_EVENTS__LOAD,
+	PERF_MEM_EVENTS__STORE,
+	PERF_MEM_EVENTS__MAX,
+};
+
+extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
+
+#endif /* __PERF_MEM_EVENTS_H */
+
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 05/23] perf mem: Add -e record option
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (3 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 06/23] perf mem: Check for memory events support Jiri Olsa
                   ` (17 subsequent siblings)
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding -e option for perf mem record command,
to be able to specify memory event directly.

Get list of available events:

  $ perf mem record -e list
  ldlat-loads
  ldlat-stores

Monitor ldlat-loads:
  $ perf mem record -e ldlat-loads true

Link: http://lkml.kernel.org/n/tip-x5famenpxjfmhojzo95sf26s@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c     | 63 +++++++++++++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.h |  3 +++
 3 files changed, 106 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 36c56a4b778b..b3f8a89ede40 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -7,6 +7,7 @@
 #include "util/session.h"
 #include "util/data.h"
 #include "util/mem-events.h"
+#include "util/debug.h"
 
 #define MEM_OPERATION_LOAD	0x1
 #define MEM_OPERATION_STORE	0x2
@@ -22,11 +23,55 @@ struct perf_mem {
 	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
 };
 
+static int parse_record_events(const struct option *opt,
+			       const char *str, int unset __maybe_unused)
+{
+	struct perf_mem *mem = *(struct perf_mem **)opt->value;
+	int j;
+
+	if (strcmp(str, "list")) {
+		if (!perf_mem_events__parse(str)) {
+			mem->operation = 0;
+			return 0;
+		}
+		exit(-1);
+	}
+
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		struct perf_mem_event *e = &perf_mem_events[j];
+
+		fprintf(stderr, "%-20s%s",
+			e->tag, verbose ? "" : "\n");
+		if (verbose)
+			fprintf(stderr, " [%s]\n", e->name);
+	}
+	exit(0);
+}
+
+static const char * const __usage[] = {
+	"perf mem record [<options>] [<command>]",
+	"perf mem record [<options>] -- <command> [<options>]",
+	NULL
+};
+
+static const char * const *record_mem_usage = __usage;
+
 static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 {
 	int rec_argc, i = 0, j;
 	const char **rec_argv;
 	int ret;
+	struct option options[] = {
+	OPT_CALLBACK('e', "event", &mem, "event",
+		     "event selector. use 'perf mem record -e list' to list available events",
+		     parse_record_events),
+	OPT_INCR('v', "verbose", &verbose,
+		 "be more verbose (show counter open errors, etc)"),
+	OPT_END()
+	};
+
+	argc = parse_options(argc, argv, options, record_mem_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
 
 	rec_argc = argc + 7; /* max number of arguments */
 	rec_argv = calloc(rec_argc + 1, sizeof(char *));
@@ -35,10 +80,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 	rec_argv[i++] = "record";
 
-	if (mem->operation & MEM_OPERATION_LOAD) {
+	if (mem->operation & MEM_OPERATION_LOAD)
 		perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
+
+	if (perf_mem_events[PERF_MEM_EVENTS__LOAD].record)
 		rec_argv[i++] = "-W";
-	}
 
 	rec_argv[i++] = "-d";
 
@@ -50,9 +96,19 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		rec_argv[i++] = perf_mem_events[j].name;
 	};
 
-	for (j = 1; j < argc; j++, i++)
+	for (j = 0; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
 
+	if (verbose > 0) {
+		pr_debug("calling: record ");
+
+		while (rec_argv[j]) {
+			pr_debug("%s ", rec_argv[j]);
+			j++;
+		}
+		pr_debug("\n");
+	}
+
 	ret = cmd_record(i, rec_argv, NULL);
 	free(rec_argv);
 	return ret;
@@ -299,7 +355,6 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
 		NULL
 	};
 
-
 	argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands,
 					mem_usage, PARSE_OPT_STOP_AT_NON_OPTION);
 
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index c6ba0a19ec9a..b1507c04b257 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -1,10 +1,51 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
 #include "mem-events.h"
+#include "debug.h"
 
-#define E(n) { .name = n }
+#define E(t, n) { .tag = t, .name = n }
 
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
-	E("cpu/mem-loads,ldlat=30/P"),
-	E("cpu/mem-stores/P"),
+	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P"),
+	E("ldlat-stores",	"cpu/mem-stores/P"),
 };
 
 #undef E
+
+int perf_mem_events__parse(const char *str)
+{
+	char *tok, *saveptr = NULL;
+	bool found = false;
+	char *buf;
+	int j;
+
+	/* We need buffer that we know we can write to. */
+	buf = malloc(strlen(str) + 1);
+	if (!buf)
+		return -ENOMEM;
+
+	strcpy(buf, str);
+
+	tok = strtok_r((char *)buf, ",", &saveptr);
+
+	while (tok) {
+		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+			struct perf_mem_event *e = &perf_mem_events[j];
+
+			if (strstr(e->tag, tok))
+				e->record = found = true;
+		}
+
+		tok = strtok_r(NULL, ",", &saveptr);
+	}
+
+	free(buf);
+
+	if (found)
+		return 0;
+
+	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
+	return -1;
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index ee5fde222389..0b5247468462 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -5,6 +5,7 @@
 
 struct perf_mem_event {
 	bool		record;
+	const char	*tag;
 	const char	*name;
 };
 
@@ -16,5 +17,7 @@ enum {
 
 extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
 
+int perf_mem_events__parse(const char *str);
+
 #endif /* __PERF_MEM_EVENTS_H */
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 06/23] perf mem: Check for memory events support
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (4 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 05/23] perf mem: Add -e record option Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-23 15:18   ` Arnaldo Carvalho de Melo
  2016-02-15  8:34 ` [PATCH 07/23] perf mem: Introduce perf_mem_events__name function Jiri Olsa
                   ` (16 subsequent siblings)
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Check if current kernel support available memory events
and display the status within -e  list option:

  $ perf mem record -e list
  [ok] ldlat-loads
  [ok] ldlat-stores

Link: http://lkml.kernel.org/n/tip-r8smhxjfe69q67jwt7mzs0e9@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c     | 14 +++++++++++++-
 tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.h |  3 +++
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index b3f8a89ede40..e64e0aa7ba0e 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -40,7 +40,8 @@ static int parse_record_events(const struct option *opt,
 	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
 		struct perf_mem_event *e = &perf_mem_events[j];
 
-		fprintf(stderr, "%-20s%s",
+		fprintf(stderr, "%s%-20s%s",
+			e->supported ? "[ok] " : "     ",
 			e->tag, verbose ? "" : "\n");
 		if (verbose)
 			fprintf(stderr, " [%s]\n", e->name);
@@ -92,6 +93,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		if (!perf_mem_events[j].record)
 			continue;
 
+		if (!perf_mem_events[j].supported) {
+			pr_err("failed: event '%s' not supported\n",
+			       perf_mem_events[j].name);
+			return -1;
+		}
+
 		rec_argv[i++] = "-e";
 		rec_argv[i++] = perf_mem_events[j].name;
 	};
@@ -355,6 +362,11 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
 		NULL
 	};
 
+	if (perf_mem_events__init()) {
+		pr_err("failed: memory events not supported\n");
+		return -1;
+	}
+
 	argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands,
 					mem_usage, PARSE_OPT_STOP_AT_NON_OPTION);
 
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index b1507c04b257..e21853fe1312 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -2,15 +2,20 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <api/fs/fs.h>
 #include "mem-events.h"
 #include "debug.h"
 
-#define E(t, n) { .tag = t, .name = n }
+#define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
 
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
-	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P"),
-	E("ldlat-stores",	"cpu/mem-stores/P"),
+	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P",	"mem-loads"),
+	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
 };
+#undef E
 
 #undef E
 
@@ -49,3 +54,27 @@ int perf_mem_events__parse(const char *str)
 	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
 	return -1;
 }
+
+int perf_mem_events__init(void)
+{
+	const char *mnt = sysfs__mount();
+	bool found = false;
+	int j;
+
+	if (!mnt)
+		return -ENOENT;
+
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		char path[PATH_MAX];
+		struct perf_mem_event *e = &perf_mem_events[j];
+		struct stat st;
+
+		scnprintf(path, PATH_MAX, "%s/devices/cpu/events/%s",
+			  mnt, e->sysfs_name);
+
+		if (!stat(path, &st))
+			e->supported = found = true;
+	}
+
+	return found ? 0 : -ENOENT;
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 0b5247468462..b9a786346c03 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -5,8 +5,10 @@
 
 struct perf_mem_event {
 	bool		record;
+	bool		supported;
 	const char	*tag;
 	const char	*name;
+	const char	*sysfs_name;
 };
 
 enum {
@@ -18,6 +20,7 @@ enum {
 extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
 
 int perf_mem_events__parse(const char *str);
+int perf_mem_events__init(void);
 
 #endif /* __PERF_MEM_EVENTS_H */
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 07/23] perf mem: Introduce perf_mem_events__name function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (5 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 06/23] perf mem: Check for memory events support Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 08/23] perf mem: Add -l/--ldlat option Jiri Olsa
                   ` (15 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Wrap perf_mem_events[].name into perf_mem_events__name
function so we could alter the events name if needed.

This will be handy when changing latency settings for
loads event in following patch.

Link: http://lkml.kernel.org/n/tip-76wibzfbjamxfu7vapizsszj@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c     | 4 ++--
 tools/perf/util/mem-events.c | 5 +++++
 tools/perf/util/mem-events.h | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index e64e0aa7ba0e..26b2f9e0b153 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -95,12 +95,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 		if (!perf_mem_events[j].supported) {
 			pr_err("failed: event '%s' not supported\n",
-			       perf_mem_events[j].name);
+			       perf_mem_events__name(j));
 			return -1;
 		}
 
 		rec_argv[i++] = "-e";
-		rec_argv[i++] = perf_mem_events[j].name;
+		rec_argv[i++] = perf_mem_events__name(j);
 	};
 
 	for (j = 0; j < argc; j++, i++)
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index e21853fe1312..0f62e930de13 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -19,6 +19,11 @@ struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
 
 #undef E
 
+char *perf_mem_events__name(int i)
+{
+	return (char *) perf_mem_events[i].name;
+}
+
 int perf_mem_events__parse(const char *str)
 {
 	char *tok, *saveptr = NULL;
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index b9a786346c03..23e3239dfa34 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -22,5 +22,6 @@ extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
 int perf_mem_events__parse(const char *str);
 int perf_mem_events__init(void);
 
+char *perf_mem_events__name(int i);
 #endif /* __PERF_MEM_EVENTS_H */
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 08/23] perf mem: Add -l/--ldlat option
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (6 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 07/23] perf mem: Introduce perf_mem_events__name function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 09/23] perf mem: Add -u/-k options Jiri Olsa
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding -l/--ldlat option to specify desired latency
for loads event.

Specify 50 as loads event latency:

  $ perf mem record -e ldlat-loads -v -l 50 true
  calling: record -W -d -e cpu/mem-loads,ldlat=50/P true

Link: http://lkml.kernel.org/n/tip-ec2m0cvivkfs8uhtiv411hfc@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c     |  1 +
 tools/perf/util/mem-events.c | 17 ++++++++++++++++-
 tools/perf/util/mem-events.h |  1 +
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 26b2f9e0b153..94243429bb6e 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -66,6 +66,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 	OPT_CALLBACK('e', "event", &mem, "event",
 		     "event selector. use 'perf mem record -e list' to list available events",
 		     parse_record_events),
+	OPT_UINTEGER('l', "ldlat", &perf_mem_events__loads_ldlat, "mem-loads latency"),
 	OPT_INCR('v', "verbose", &verbose,
 		 "be more verbose (show counter open errors, etc)"),
 	OPT_END()
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 0f62e930de13..3772a3a8a6ee 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -9,18 +9,33 @@
 #include "mem-events.h"
 #include "debug.h"
 
+unsigned int perf_mem_events__loads_ldlat = 30;
+
 #define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
 
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
-	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P",	"mem-loads"),
+	E("ldlat-loads",	"cpu/mem-loads,ldlat=%u/P",	"mem-loads"),
 	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
 };
 #undef E
 
 #undef E
 
+static char mem_loads_name[100];
+static bool mem_loads_name__init;
+
 char *perf_mem_events__name(int i)
 {
+	if (i == PERF_MEM_EVENTS__LOAD) {
+		if (!mem_loads_name__init) {
+			mem_loads_name__init = true;
+			scnprintf(mem_loads_name, sizeof(mem_loads_name),
+				  perf_mem_events[i].name,
+				  perf_mem_events__loads_ldlat);
+		}
+		return mem_loads_name;
+	}
+
 	return (char *) perf_mem_events[i].name;
 }
 
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 23e3239dfa34..d690907f7e50 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -18,6 +18,7 @@ enum {
 };
 
 extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
+extern unsigned int perf_mem_events__loads_ldlat;
 
 int perf_mem_events__parse(const char *str);
 int perf_mem_events__init(void);
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 09/23] perf mem: Add -u/-k options
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (7 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 08/23] perf mem: Add -l/--ldlat option Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 10/23] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
                   ` (13 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Add -u/-k (--all-user/--all-kernel) options to use
the perf record --all-user/--all-kernel options.

Link: http://lkml.kernel.org/n/tip-adxn5c48oe0gmjrjmq6we27q@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-mem.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 94243429bb6e..cb4aa83162a6 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -62,6 +62,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 	int rec_argc, i = 0, j;
 	const char **rec_argv;
 	int ret;
+	bool all_user = false, all_kernel = false;
 	struct option options[] = {
 	OPT_CALLBACK('e', "event", &mem, "event",
 		     "event selector. use 'perf mem record -e list' to list available events",
@@ -69,13 +70,15 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 	OPT_UINTEGER('l', "ldlat", &perf_mem_events__loads_ldlat, "mem-loads latency"),
 	OPT_INCR('v', "verbose", &verbose,
 		 "be more verbose (show counter open errors, etc)"),
+	OPT_BOOLEAN('u', "--all-user", &all_user, "collect only user level data"),
+	OPT_BOOLEAN('k', "--all-kernel", &all_kernel, "collect only kernel level data"),
 	OPT_END()
 	};
 
 	argc = parse_options(argc, argv, options, record_mem_usage,
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 
-	rec_argc = argc + 7; /* max number of arguments */
+	rec_argc = argc + 9; /* max number of arguments */
 	rec_argv = calloc(rec_argc + 1, sizeof(char *));
 	if (!rec_argv)
 		return -1;
@@ -104,6 +107,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		rec_argv[i++] = perf_mem_events__name(j);
 	};
 
+	if (all_user)
+		rec_argv[i++] = "--all-user";
+
+	if (all_kernel)
+		rec_argv[i++] = "--all-kernel";
+
 	for (j = 0; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 10/23] perf x86 intel: Add DATALA events into sysfs
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (8 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 09/23] perf mem: Add -u/-k options Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 11/23] perf mem: Add Intel DATALA memory events Jiri Olsa
                   ` (12 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding DATALA events into Haaswell events sysfs
directory, so it's easier to use them.

Adding all DATALA events as specified by Intel SDM
manual 18.10.3 PEBS Data Address Profiling.

Link: http://lkml.kernel.org/n/tip-dvpk5ys80v41oh5xgqvloviw@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 arch/x86/kernel/cpu/perf_event_intel.c | 39 ++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
index fed2ab1f1065..aadccb782e78 100644
--- a/arch/x86/kernel/cpu/perf_event_intel.c
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
@@ -3253,6 +3253,26 @@ static __init void intel_ht_bug(void)
 EVENT_ATTR_STR(mem-loads,	mem_ld_hsw,	"event=0xcd,umask=0x1,ldlat=3");
 EVENT_ATTR_STR(mem-stores,	mem_st_hsw,	"event=0xd0,umask=0x82")
 
+EVENT_ATTR_STR(mem-stlb-miss-loads,	hsw_stlb_miss_loads,	"event=0xd0,umask=0x11");
+EVENT_ATTR_STR(mem-stlb-miss-stores,	hsw_stlb_miss_stores,	"event=0xd0,umask=0x12");
+EVENT_ATTR_STR(mem-lock-loads,		hsw_lock_loads,		"event=0xd0,umask=0x21");
+EVENT_ATTR_STR(mem-split-loads,		hsw_split_loads,	"event=0xd0,umask=0x41");
+EVENT_ATTR_STR(mem-split-stores,	hsw_split_stores,	"event=0xd0,umask=0x42");
+EVENT_ATTR_STR(mem-all-loads,		hsw_all_loads,		"event=0xd0,umask=0x81");
+EVENT_ATTR_STR(mem-all-stores,		hsw_all_stores,		"event=0xd0,umask=0x82");
+EVENT_ATTR_STR(mem-load-l1-hit,		hsw_load_l1_hit,	"event=0xd1,umask=0x01");
+EVENT_ATTR_STR(mem-load-l2-hit,		hsw_load_l2_hit,	"event=0xd1,umask=0x02");
+EVENT_ATTR_STR(mem-load-l3-hit,		hsw_load_l3_hit,	"event=0xd1,umask=0x04");
+EVENT_ATTR_STR(mem-load-l1-miss,	hsw_load_l1_miss,	"event=0xd1,umask=0x08");
+EVENT_ATTR_STR(mem-load-l2-miss,	hsw_load_l2_miss,	"event=0xd1,umask=0x10");
+EVENT_ATTR_STR(mem-load-l3-miss,	hsw_load_l3_miss,	"event=0xd1,umask=0x20");
+EVENT_ATTR_STR(mem-load-hit-lfb,	hsw_load_hit_lfb,	"event=0xd1,umask=0x40");
+EVENT_ATTR_STR(mem-snp-miss,		hsw_snp_miss,		"event=0xd2,umask=0x01");
+EVENT_ATTR_STR(mem-snp-hit,		hsw_snp_hit,		"event=0xd2,umask=0x02");
+EVENT_ATTR_STR(mem-snp-hitm,		hsw_snp_hitm,		"event=0xd2,umask=0x04");
+EVENT_ATTR_STR(mem-snp-none,		hsw_snp_none,		"event=0xd2,umask=0x08");
+EVENT_ATTR_STR(mem-local-dram,		hsw_local_dram,		"event=0xd3,umask=0x01");
+
 /* Haswell special events */
 EVENT_ATTR_STR(tx-start,	tx_start,	"event=0xc9,umask=0x1");
 EVENT_ATTR_STR(tx-commit,	tx_commit,	"event=0xc9,umask=0x2");
@@ -3282,6 +3302,25 @@ static struct attribute *hsw_events_attrs[] = {
 	EVENT_PTR(cycles_ct),
 	EVENT_PTR(mem_ld_hsw),
 	EVENT_PTR(mem_st_hsw),
+	EVENT_PTR(hsw_stlb_miss_loads),
+	EVENT_PTR(hsw_stlb_miss_stores),
+	EVENT_PTR(hsw_lock_loads),
+	EVENT_PTR(hsw_split_loads),
+	EVENT_PTR(hsw_split_stores),
+	EVENT_PTR(hsw_all_loads),
+	EVENT_PTR(hsw_all_stores),
+	EVENT_PTR(hsw_load_l1_hit),
+	EVENT_PTR(hsw_load_l2_hit),
+	EVENT_PTR(hsw_load_l3_hit),
+	EVENT_PTR(hsw_load_l1_miss),
+	EVENT_PTR(hsw_load_l2_miss),
+	EVENT_PTR(hsw_load_l3_miss),
+	EVENT_PTR(hsw_load_hit_lfb),
+	EVENT_PTR(hsw_snp_miss),
+	EVENT_PTR(hsw_snp_hit),
+	EVENT_PTR(hsw_snp_hitm),
+	EVENT_PTR(hsw_snp_none),
+	EVENT_PTR(hsw_local_dram),
 	NULL
 };
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 11/23] perf mem: Add Intel DATALA memory events
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (9 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 10/23] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions Jiri Olsa
                   ` (11 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding Intel DATALA memory events into
perf mem record command:

  $ perf mem record -e list
  [ok] ldlat-loads
  [ok] ldlat-stores
       stlb-miss-loads
       stlb-miss-stores
       lock-loads
       split-loads
       split-stores
       all-loads
       all-stores
       l1-hit
       l2-hit
       l3-hit
       l1-miss
       l2-miss
       l3-miss
       lfb
       snp-miss
       snp-hit
       snp-hitm
       snp-none
       local-dram

All events from above lists are compiled in, but only
those with [ok] are supported by kernel/HW. You need
previous DATALA patch to support all of them.

Link: http://lkml.kernel.org/n/tip-cximteb8r1a6750wz8sgeajh@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 19 +++++++++++++++++++
 tools/perf/util/mem-events.h | 19 +++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 3772a3a8a6ee..92d3bc9914e6 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -16,6 +16,25 @@ unsigned int perf_mem_events__loads_ldlat = 30;
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
 	E("ldlat-loads",	"cpu/mem-loads,ldlat=%u/P",	"mem-loads"),
 	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
+	E("stlb-miss-loads",	"cpu/mem-stlb-miss-loads/P",	"mem-stlb-miss-loads"),
+	E("stlb-miss-stores",	"cpu/mem-stlb-miss-stores/P",	"mem-stlb-miss-stores"),
+	E("lock-loads",		"cpu/mem-lock-loads/P",		"mem-lock-loads"),
+	E("split-loads",	"cpu/mem-split-loads/P",	"mem-split-loads"),
+	E("split-stores",	"cpu/mem-split-stores/P",	"mem-split-stores"),
+	E("all-loads",		"cpu/mem-all-loads/P",		"mem-all-loads"),
+	E("all-stores",		"cpu/mem-all-stores/P",		"mem-all-stores"),
+	E("l1-hit",		"cpu/mem-load-l1-hit/P",	"mem-load-l1-hit"),
+	E("l2-hit",		"cpu/mem-load-l2-hit/P",	"mem-load-l2-hit"),
+	E("l3-hit",		"cpu/mem-load-l3-hit/P",	"mem-load-l3-hit"),
+	E("l1-miss",		"cpu/mem-load-l1-miss/P",	"mem-load-l1-miss"),
+	E("l2-miss",		"cpu/mem-load-l2-miss/P",	"mem-load-l2-miss"),
+	E("l3-miss",		"cpu/mem-load-l3-miss/P",	"mem-load-l3-miss"),
+	E("lfb",		"cpu/mem-load-hit-lfb/P",	"mem-load-hit-lfb"),
+	E("snp-miss",		"cpu/mem-snp-miss/P",		"mem-snp-miss"),
+	E("snp-hit",		"cpu/mem-snp-hit/P",		"mem-snp-hit"),
+	E("snp-hitm",		"cpu/mem-snp-hitm/P",		"mem-snp-hitm"),
+	E("snp-none",		"cpu/mem-snp-none/P",		"mem-snp-none"),
+	E("local-dram",		"cpu/mem-local-dram/P",		"mem-local-dram"),
 };
 #undef E
 
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index d690907f7e50..4abf606b256b 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -14,6 +14,25 @@ struct perf_mem_event {
 enum {
 	PERF_MEM_EVENTS__LOAD,
 	PERF_MEM_EVENTS__STORE,
+	PERF_MEM_EVENTS__STLB_MISS_LOADS,
+	PERF_MEM_EVENTS__STLB_MISS_STORES,
+	PERF_MEM_EVENTS__LOCK_LOADS,
+	PERF_MEM_EVENTS__SPLIT_LOADS,
+	PERF_MEM_EVENTS__SPLIT_STORES,
+	PERF_MEM_EVENTS__ALL_LOADS,
+	PERF_MEM_EVENTS__ALL_STORES,
+	PERF_MEM_EVENTS__L1_HIT,
+	PERF_MEM_EVENTS__L2_HIT,
+	PERF_MEM_EVENTS__L3_HIT,
+	PERF_MEM_EVENTS__L1_MISS,
+	PERF_MEM_EVENTS__L2_MISS,
+	PERF_MEM_EVENTS__L3_MISS,
+	PERF_MEM_EVENTS__LFB,
+	PERF_MEM_EVENTS__SNP_MISS,
+	PERF_MEM_EVENTS__SNP_HIT,
+	PERF_MEM_EVENTS__SNP_HITM,
+	PERF_MEM_EVENTS__SNP_NONE,
+	PERF_MEM_EVENTS__LOCAL_DRAM,
 	PERF_MEM_EVENTS__MAX,
 };
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (10 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 11/23] perf mem: Add Intel DATALA memory events Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
                   ` (10 subsequent siblings)
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

There's no need to define extra macros for that.

Link: http://lkml.kernel.org/n/tip-ib5fkxt3i5bp1pi9ym6etx8p@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 3305149326bb..5cb3e13b8f2e 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -843,7 +843,6 @@ static const char * const tlb_access[] = {
 	"Walker",
 	"Fault",
 };
-#define NUM_TLB_ACCESS (sizeof(tlb_access)/sizeof(const char *))
 
 static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -865,7 +864,7 @@ static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,
 	/* already taken care of */
 	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
 
-	for (i = 0; m && i < NUM_TLB_ACCESS; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {
@@ -920,7 +919,6 @@ static const char * const mem_lvl[] = {
 	"I/O",
 	"Uncached",
 };
-#define NUM_MEM_LVL (sizeof(mem_lvl)/sizeof(const char *))
 
 static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -942,7 +940,7 @@ static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
 	/* already taken care of */
 	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
 
-	for (i = 0; m && i < NUM_MEM_LVL; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {
@@ -988,7 +986,6 @@ static const char * const snoop_access[] = {
 	"Hit",
 	"HitM",
 };
-#define NUM_SNOOP_ACCESS (sizeof(snoop_access)/sizeof(const char *))
 
 static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -1003,7 +1000,7 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 	if (he->mem_info)
 		m = he->mem_info->data_src.mem_snoop;
 
-	for (i = 0; m && i < NUM_SNOOP_ACCESS; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (11 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
                   ` (9 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Move meminfo's tlb display function into mem-events.c
object, so it could be reused later from script code.

Link: http://lkml.kernel.org/n/tip-kdsvxdm3ucwknyvkluwavydh@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/mem-events.h |  3 +++
 tools/perf/util/sort.c       | 44 ++---------------------------------------
 3 files changed, 52 insertions(+), 42 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 92d3bc9914e6..68f6f8e4922a 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -8,6 +8,7 @@
 #include <api/fs/fs.h>
 #include "mem-events.h"
 #include "debug.h"
+#include "symbol.h"
 
 unsigned int perf_mem_events__loads_ldlat = 30;
 
@@ -117,3 +118,49 @@ int perf_mem_events__init(void)
 
 	return found ? 0 : -ENOENT;
 }
+
+static const char * const tlb_access[] = {
+	"N/A",
+	"HIT",
+	"MISS",
+	"L1",
+	"L2",
+	"Walker",
+	"Fault",
+};
+
+void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+{
+	size_t l = 0, i;
+	u64 m = PERF_MEM_TLB_NA;
+	u64 hit, miss;
+
+	sz -= 1; /* -1 for null termination */
+	out[0] = '\0';
+
+	if (mem_info)
+		m = mem_info->data_src.mem_dtlb;
+
+	hit = m & PERF_MEM_TLB_HIT;
+	miss = m & PERF_MEM_TLB_MISS;
+
+	/* already taken care of */
+	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
+
+	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
+		if (!(m & 0x1))
+			continue;
+		if (l) {
+			strcat(out, " or ");
+			l += 4;
+		}
+		strncat(out, tlb_access[i], sz - l);
+		l += strlen(tlb_access[i]);
+	}
+	if (*out == '\0')
+		strcpy(out, "N/A");
+	if (hit)
+		strncat(out, " hit", sz - l);
+	if (miss)
+		strncat(out, " miss", sz - l);
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 4abf606b256b..1af23966e3fc 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -43,5 +43,8 @@ int perf_mem_events__parse(const char *str);
 int perf_mem_events__init(void);
 
 char *perf_mem_events__name(int i);
+
+struct mem_info;
+void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 #endif /* __PERF_MEM_EVENTS_H */
 
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 5cb3e13b8f2e..b7834a5a002d 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -6,6 +6,7 @@
 #include "evsel.h"
 #include "evlist.h"
 #include <traceevent/event-parse.h>
+#include "mem-events.h"
 
 regex_t		parent_regex;
 const char	default_parent_pattern[] = "^sys_|^do_page_fault";
@@ -834,53 +835,12 @@ sort__tlb_cmp(struct hist_entry *left, struct hist_entry *right)
 	return (int64_t)(data_src_r.mem_dtlb - data_src_l.mem_dtlb);
 }
 
-static const char * const tlb_access[] = {
-	"N/A",
-	"HIT",
-	"MISS",
-	"L1",
-	"L2",
-	"Walker",
-	"Fault",
-};
-
 static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
 {
 	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t l = 0, i;
-	u64 m = PERF_MEM_TLB_NA;
-	u64 hit, miss;
-
-	out[0] = '\0';
-
-	if (he->mem_info)
-		m = he->mem_info->data_src.mem_dtlb;
-
-	hit = m & PERF_MEM_TLB_HIT;
-	miss = m & PERF_MEM_TLB_MISS;
-
-	/* already taken care of */
-	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
-
-	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, tlb_access[i], sz - l);
-		l += strlen(tlb_access[i]);
-	}
-	if (*out == '\0')
-		strcpy(out, "N/A");
-	if (hit)
-		strncat(out, " hit", sz - l);
-	if (miss)
-		strncat(out, " miss", sz - l);
 
+	perf_mem__tlb_scnprintf(out, sizeof(out), he->mem_info);
 	return repsep_snprintf(bf, size, "%-*s", width, out);
 }
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (12 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Move meminfo's lvl display function into mem-events.c
object, so it could be reused later from script code.

Link: http://lkml.kernel.org/n/tip-ujrrar78msnlkbvrgujwc7z1@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/mem-events.h |  1 +
 tools/perf/util/sort.c       | 50 +----------------------------------------
 3 files changed, 55 insertions(+), 49 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 68f6f8e4922a..f291f93ac11d 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -164,3 +164,56 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 	if (miss)
 		strncat(out, " miss", sz - l);
 }
+
+static const char * const mem_lvl[] = {
+	"N/A",
+	"HIT",
+	"MISS",
+	"L1",
+	"LFB",
+	"L2",
+	"L3",
+	"Local RAM",
+	"Remote RAM (1 hop)",
+	"Remote RAM (2 hops)",
+	"Remote Cache (1 hop)",
+	"Remote Cache (2 hops)",
+	"I/O",
+	"Uncached",
+};
+
+void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+{
+	size_t i, l = 0;
+	u64 m =  PERF_MEM_LVL_NA;
+	u64 hit, miss;
+
+	if (mem_info)
+		m  = mem_info->data_src.mem_lvl;
+
+	sz -= 1; /* -1 for null termination */
+	out[0] = '\0';
+
+	hit = m & PERF_MEM_LVL_HIT;
+	miss = m & PERF_MEM_LVL_MISS;
+
+	/* already taken care of */
+	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
+
+	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
+		if (!(m & 0x1))
+			continue;
+		if (l) {
+			strcat(out, " or ");
+			l += 4;
+		}
+		strncat(out, mem_lvl[i], sz - l);
+		l += strlen(mem_lvl[i]);
+	}
+	if (*out == '\0')
+		strcpy(out, "N/A");
+	if (hit)
+		strncat(out, " hit", sz - l);
+	if (miss)
+		strncat(out, " miss", sz - l);
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 1af23966e3fc..fc6d94fc96e8 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -46,5 +46,6 @@ char *perf_mem_events__name(int i);
 
 struct mem_info;
 void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 #endif /* __PERF_MEM_EVENTS_H */
 
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index b7834a5a002d..c7b52f4987d8 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -863,60 +863,12 @@ sort__lvl_cmp(struct hist_entry *left, struct hist_entry *right)
 	return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl);
 }
 
-static const char * const mem_lvl[] = {
-	"N/A",
-	"HIT",
-	"MISS",
-	"L1",
-	"LFB",
-	"L2",
-	"L3",
-	"Local RAM",
-	"Remote RAM (1 hop)",
-	"Remote RAM (2 hops)",
-	"Remote Cache (1 hop)",
-	"Remote Cache (2 hops)",
-	"I/O",
-	"Uncached",
-};
-
 static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
 {
 	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t i, l = 0;
-	u64 m =  PERF_MEM_LVL_NA;
-	u64 hit, miss;
-
-	if (he->mem_info)
-		m  = he->mem_info->data_src.mem_lvl;
-
-	out[0] = '\0';
-
-	hit = m & PERF_MEM_LVL_HIT;
-	miss = m & PERF_MEM_LVL_MISS;
-
-	/* already taken care of */
-	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
-
-	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, mem_lvl[i], sz - l);
-		l += strlen(mem_lvl[i]);
-	}
-	if (*out == '\0')
-		strcpy(out, "N/A");
-	if (hit)
-		strncat(out, " hit", sz - l);
-	if (miss)
-		strncat(out, " miss", sz - l);
 
+	perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info);
 	return repsep_snprintf(bf, size, "%-*s", width, out);
 }
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (13 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 16/23] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Move meminfo's snp display function into mem-events.c
object, so it could be reused later from script code.

Link: http://lkml.kernel.org/n/tip-zhd9q561o49xzhrtg8cz5jui@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 34 ++++++++++++++++++++++++++++++++++
 tools/perf/util/mem-events.h |  1 +
 tools/perf/util/sort.c       | 31 +------------------------------
 3 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index f291f93ac11d..1d57defe6ea7 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -217,3 +217,37 @@ void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 	if (miss)
 		strncat(out, " miss", sz - l);
 }
+
+static const char * const snoop_access[] = {
+	"N/A",
+	"None",
+	"Miss",
+	"Hit",
+	"HitM",
+};
+
+void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+{
+	size_t i, l = 0;
+	u64 m = PERF_MEM_SNOOP_NA;
+
+	sz -= 1; /* -1 for null termination */
+	out[0] = '\0';
+
+	if (mem_info)
+		m = mem_info->data_src.mem_snoop;
+
+	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
+		if (!(m & 0x1))
+			continue;
+		if (l) {
+			strcat(out, " or ");
+			l += 4;
+		}
+		strncat(out, snoop_access[i], sz - l);
+		l += strlen(snoop_access[i]);
+	}
+
+	if (*out == '\0')
+		strcpy(out, "N/A");
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index fc6d94fc96e8..7b9e172cfa72 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -47,5 +47,6 @@ char *perf_mem_events__name(int i);
 struct mem_info;
 void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 #endif /* __PERF_MEM_EVENTS_H */
 
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index c7b52f4987d8..de936ce324b7 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -891,41 +891,12 @@ sort__snoop_cmp(struct hist_entry *left, struct hist_entry *right)
 	return (int64_t)(data_src_r.mem_snoop - data_src_l.mem_snoop);
 }
 
-static const char * const snoop_access[] = {
-	"N/A",
-	"None",
-	"Miss",
-	"Hit",
-	"HitM",
-};
-
 static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
 {
 	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t i, l = 0;
-	u64 m = PERF_MEM_SNOOP_NA;
-
-	out[0] = '\0';
-
-	if (he->mem_info)
-		m = he->mem_info->data_src.mem_snoop;
-
-	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, snoop_access[i], sz - l);
-		l += strlen(snoop_access[i]);
-	}
-
-	if (*out == '\0')
-		strcpy(out, "N/A");
 
+	perf_mem__snp_scnprintf(out, sizeof(out), he->mem_info);
 	return repsep_snprintf(bf, size, "%-*s", width, out);
 }
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 16/23] perf tools: Introduce perf_mem__lck_scnprintf function
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (14 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
                   ` (6 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Move meminfo's lck display function into mem-events.c
object, so it could be reused later from script code.

Link: http://lkml.kernel.org/n/tip-qiwjnu0m6vzknv25t5ggund6@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 16 ++++++++++++++++
 tools/perf/util/mem-events.h |  2 ++
 tools/perf/util/sort.c       | 14 ++------------
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 1d57defe6ea7..915fae6ad3ee 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -251,3 +251,19 @@ void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 	if (*out == '\0')
 		strcpy(out, "N/A");
 }
+
+void perf_mem__lck_scnprintf(char *out, size_t sz __maybe_unused,
+			     struct mem_info *mem_info)
+{
+	u64 mask = PERF_MEM_LOCK_NA;
+
+	if (mem_info)
+		mask = mem_info->data_src.mem_lock;
+
+	if (mask & PERF_MEM_LOCK_NA)
+		strncat(out, "N/A", 3);
+	else if (mask & PERF_MEM_LOCK_LOCKED)
+		strncat(out, "Yes", 3);
+	else
+		strncat(out, "No", 2);
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 7b9e172cfa72..0dd2efb37c44 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -48,5 +48,7 @@ struct mem_info;
 void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+void perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+
 #endif /* __PERF_MEM_EVENTS_H */
 
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index de936ce324b7..e9553738f2ce 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -800,19 +800,9 @@ sort__locked_cmp(struct hist_entry *left, struct hist_entry *right)
 static int hist_entry__locked_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
 {
-	const char *out;
-	u64 mask = PERF_MEM_LOCK_NA;
-
-	if (he->mem_info)
-		mask = he->mem_info->data_src.mem_lock;
-
-	if (mask & PERF_MEM_LOCK_NA)
-		out = "N/A";
-	else if (mask & PERF_MEM_LOCK_LOCKED)
-		out = "Yes";
-	else
-		out = "No";
+	char out[10];
 
+	perf_mem__lck_scnprintf(out, sizeof(out), he->mem_info);
 	return repsep_snprintf(bf, size, "%.*s", width, out);
 }
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (15 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 16/23] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
                   ` (5 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Moving strncat/strcpy calls into scnprintf to easily track
number of displayed bytes. It will be used in following patch.

Link: http://lkml.kernel.org/n/tip-9q9h9trua9zljnw26c56memh@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 13 +++++++------
 tools/perf/util/mem-events.h |  2 +-
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 915fae6ad3ee..440221ca4f8a 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -129,7 +129,7 @@ static const char * const tlb_access[] = {
 	"Fault",
 };
 
-void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 {
 	size_t l = 0, i;
 	u64 m = PERF_MEM_TLB_NA;
@@ -154,15 +154,16 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 			strcat(out, " or ");
 			l += 4;
 		}
-		strncat(out, tlb_access[i], sz - l);
-		l += strlen(tlb_access[i]);
+		l += scnprintf(out + l, sz - l, tlb_access[i]);
 	}
 	if (*out == '\0')
-		strcpy(out, "N/A");
+		l += scnprintf(out, sz - l, "N/A");
 	if (hit)
-		strncat(out, " hit", sz - l);
+		l += scnprintf(out + l, sz - l, " hit");
 	if (miss)
-		strncat(out, " miss", sz - l);
+		l += scnprintf(out + l, sz - l, " miss");
+
+	return l;
 }
 
 static const char * const mem_lvl[] = {
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 0dd2efb37c44..ce9ed0540014 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -45,7 +45,7 @@ int perf_mem_events__init(void);
 char *perf_mem_events__name(int i);
 
 struct mem_info;
-void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (16 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 19/23] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
                   ` (4 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Moving strncat/strcpy calls into scnprintf to easily track
number of displayed bytes. It will be used in following patch.

Link: http://lkml.kernel.org/n/tip-9q9h9trua9zljnw26c56memh@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 13 +++++++------
 tools/perf/util/mem-events.h |  2 +-
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 440221ca4f8a..5f713d77ac8a 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -183,7 +183,7 @@ static const char * const mem_lvl[] = {
 	"Uncached",
 };
 
-void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 {
 	size_t i, l = 0;
 	u64 m =  PERF_MEM_LVL_NA;
@@ -208,15 +208,16 @@ void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 			strcat(out, " or ");
 			l += 4;
 		}
-		strncat(out, mem_lvl[i], sz - l);
-		l += strlen(mem_lvl[i]);
+		l += scnprintf(out + l, sz - l, mem_lvl[i]);
 	}
 	if (*out == '\0')
-		strcpy(out, "N/A");
+		l += scnprintf(out, sz - l, "N/A");
 	if (hit)
-		strncat(out, " hit", sz - l);
+		l += scnprintf(out + l, sz - l, " hit");
 	if (miss)
-		strncat(out, " miss", sz - l);
+		l += scnprintf(out + l, sz - l, " miss");
+
+	return l;
 }
 
 static const char * const snoop_access[] = {
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index ce9ed0540014..a06efff4ef09 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -46,7 +46,7 @@ char *perf_mem_events__name(int i);
 
 struct mem_info;
 int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
-void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 19/23] perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (17 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 20/23] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
                   ` (3 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Moving strncat/strcpy calls into scnprintf to easily track
number of displayed bytes. It will be used in following patch.

Link: http://lkml.kernel.org/n/tip-dvtk0c7clgi857x699mk08ya@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 9 +++++----
 tools/perf/util/mem-events.h | 2 +-
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 5f713d77ac8a..aaeb619a9e77 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -228,7 +228,7 @@ static const char * const snoop_access[] = {
 	"HitM",
 };
 
-void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 {
 	size_t i, l = 0;
 	u64 m = PERF_MEM_SNOOP_NA;
@@ -246,12 +246,13 @@ void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 			strcat(out, " or ");
 			l += 4;
 		}
-		strncat(out, snoop_access[i], sz - l);
-		l += strlen(snoop_access[i]);
+		l += scnprintf(out + l, sz - l, snoop_access[i]);
 	}
 
 	if (*out == '\0')
-		strcpy(out, "N/A");
+		l += scnprintf(out, sz - l, "N/A");
+
+	return l;
 }
 
 void perf_mem__lck_scnprintf(char *out, size_t sz __maybe_unused,
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index a06efff4ef09..4b5d0b93979b 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -47,7 +47,7 @@ char *perf_mem_events__name(int i);
 struct mem_info;
 int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
-void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 void perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 
 #endif /* __PERF_MEM_EVENTS_H */
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 20/23] perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (18 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 19/23] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-15  8:34 ` [PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa
                   ` (2 subsequent siblings)
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Moving strncat call into scnprintf to easily track
number of displayed bytes. It will be used in following patch.

Link: http://lkml.kernel.org/n/tip-oqjs8kf50g0n65uj8sfqlb8y@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/mem-events.c | 12 +++++++-----
 tools/perf/util/mem-events.h |  2 +-
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index aaeb619a9e77..0da707da127c 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -255,18 +255,20 @@ int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 	return l;
 }
 
-void perf_mem__lck_scnprintf(char *out, size_t sz __maybe_unused,
-			     struct mem_info *mem_info)
+int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 {
 	u64 mask = PERF_MEM_LOCK_NA;
+	int l;
 
 	if (mem_info)
 		mask = mem_info->data_src.mem_lock;
 
 	if (mask & PERF_MEM_LOCK_NA)
-		strncat(out, "N/A", 3);
+		l = scnprintf(out, sz, "N/A");
 	else if (mask & PERF_MEM_LOCK_LOCKED)
-		strncat(out, "Yes", 3);
+		l = scnprintf(out, sz, "Yes");
 	else
-		strncat(out, "No", 2);
+		l = scnprintf(out, sz, "No");
+
+	return l;
 }
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 4b5d0b93979b..759d35da2d6a 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -48,7 +48,7 @@ struct mem_info;
 int perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
-void perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 
 #endif /* __PERF_MEM_EVENTS_H */
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 21/23] perf script: Add data_src and weight column definitions
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (19 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 20/23] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events Jiri Olsa
  2016-02-15  8:34 ` [PATCH 23/23] perf script: Display data_src values Jiri Olsa
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding data_src and weight column definitions, so it's
displayed for related sample types.

Link: http://lkml.kernel.org/n/tip-d9d387o10v7ega0mbd4b2zpo@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-script.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index c691214d820f..b7f1e8e22dcf 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -58,6 +58,8 @@ enum perf_output_field {
 	PERF_OUTPUT_IREGS	    = 1U << 14,
 	PERF_OUTPUT_BRSTACK	    = 1U << 15,
 	PERF_OUTPUT_BRSTACKSYM	    = 1U << 16,
+	PERF_OUTPUT_DATA_SRC	    = 1U << 17,
+	PERF_OUTPUT_WEIGHT	    = 1U << 18,
 };
 
 struct output_option {
@@ -81,6 +83,8 @@ struct output_option {
 	{.str = "iregs", .field = PERF_OUTPUT_IREGS},
 	{.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
 	{.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
+	{.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
+	{.str = "weight",   .field = PERF_OUTPUT_WEIGHT},
 };
 
 /* default set to maintain compatibility with current format */
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
 					   PERF_OUTPUT_ADDR, allow_user_set))
 		return -EINVAL;
 
+	if (PRINT_FIELD(DATA_SRC) &&
+		perf_evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC",
+					PERF_OUTPUT_DATA_SRC))
+		return -EINVAL;
+
+	if (PRINT_FIELD(WEIGHT) &&
+		perf_evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT",
+					PERF_OUTPUT_WEIGHT))
+		return -EINVAL;
+
 	if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
 		pr_err("Display of symbols requested but neither sample IP nor "
 			   "sample address\nis selected. Hence, no addresses to convert "
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,
 	if (PRINT_FIELD(ADDR))
 		print_sample_addr(event, sample, thread, attr);
 
+	if (PRINT_FIELD(DATA_SRC))
+		printf("%16" PRIx64, sample->data_src);
+
+	if (PRINT_FIELD(WEIGHT))
+		printf("%16" PRIu64, sample->weight);
+
 	if (PRINT_FIELD(IP)) {
 		if (!symbol_conf.use_callchain)
 			printf(" ");
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (20 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-15  8:34 ` [PATCH 23/23] perf script: Display data_src values Jiri Olsa
  22 siblings, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding addr/data_src/weight columns for raw events.

Example:
  $ perf script
  ...
  true 11883 322960.489590: ...  ffff8801aa0b8400        68501042             246 ffffffff813b2cd
  true 11883 322960.489600: ...  ffff8800b90b38d8        68501042             251 ffffffff811d0b7
  true 11883 322960.489612: ...  ffff880196893130        6a100142              94 ffffffff8177fb8
  true 11883 322960.489637: ...  ffff880164277b40        68100842             101 ffffffff813b2cd
  true 11883 322960.489683: ...  ffff880035d3d818        68501042             201 ffffffff811d0b7
  true 11883 322960.489733: ...      7fb9616efcf0        68100242             199     7fb961aaba9
  true 11883 322960.489818: ...  ffffea000481c39c        6a100142             122 ffffffff811b634

                                 ^^^^^^^^^^^^^^^^        ^^^^^^^^             ^^^
                                             addr        data_src          weight

Link: http://lkml.kernel.org/n/tip-y761oo0pgvg82uco3ca9iwix@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-script.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index b7f1e8e22dcf..f4caf4898245 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -135,7 +135,8 @@ static struct {
 			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 			      PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
-			      PERF_OUTPUT_PERIOD,
+			      PERF_OUTPUT_PERIOD |  PERF_OUTPUT_ADDR |
+			      PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT,
 
 		.invalid_fields = PERF_OUTPUT_TRACE,
 	},
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 23/23] perf script: Display data_src values
  2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
                   ` (21 preceding siblings ...)
  2016-02-15  8:34 ` [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events Jiri Olsa
@ 2016-02-15  8:34 ` Jiri Olsa
  22 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-15  8:34 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Adding support to display data_src values,
for events with data_src data in sample.

Example:
  $ perf script
  ...
           rcuos/3    32 [002] ... 68501042 Local RAM hit|SNP None or Hit|TLB L1 or L2 hit|LCK No   ...
           rcuos/3    32 [002] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No                 ...
           swapper     0 [002] ... 68100242 LFB hit|SNP None|TLB L1 or L2 hit|LCK No                ...
           swapper     0 [000] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No                 ...
           swapper     0 [000] ... 50100142 L1 hit|SNP None|TLB L2 miss|LCK No                      ...
           rcuos/3    32 [002] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No                 ...
   plugin-containe 16538 [000] ... 6a100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK Yes                ...
           gkrellm  1736 [000] ... 68100242 LFB hit|SNP None|TLB L1 or L2 hit|LCK No                ...
           gkrellm  1736 [000] ... 6a100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK Yes                ...

                                   ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                             data_src value                     data_src translation

Link: http://lkml.kernel.org/n/tip-48x7lm7d765bzo3oghap376m@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-script.c  | 20 +++++++++++++++++++-
 tools/perf/util/mem-events.c | 15 +++++++++++++++
 tools/perf/util/mem-events.h |  2 ++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index f4caf4898245..8ff5ff0fe38c 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -23,6 +23,7 @@
 #include "util/stat.h"
 #include <linux/bitmap.h>
 #include "asm/bug.h"
+#include "util/mem-events.h"
 
 static char const		*script_name;
 static char const		*generate_script_lang;
@@ -649,6 +650,23 @@ static int perf_evlist__max_name_len(struct perf_evlist *evlist)
 	return max;
 }
 
+static size_t data_src__printf(u64 data_src)
+{
+	struct mem_info mi = { .data_src.val = data_src };
+	char decode[100];
+	char out[100];
+	static int maxlen;
+	int len;
+
+	perf_script__meminfo_scnprintf(decode, 100, &mi);
+
+	len = scnprintf(out, 100, "%16" PRIx64 " %s", data_src, decode);
+	if (maxlen < len)
+		maxlen = len;
+
+	return printf("%-*s", maxlen, out);
+}
+
 static void process_event(struct perf_script *script, union perf_event *event,
 			  struct perf_sample *sample, struct perf_evsel *evsel,
 			  struct addr_location *al)
@@ -689,7 +707,7 @@ static void process_event(struct perf_script *script, union perf_event *event,
 		print_sample_addr(event, sample, thread, attr);
 
 	if (PRINT_FIELD(DATA_SRC))
-		printf("%16" PRIx64, sample->data_src);
+		data_src__printf(sample->data_src);
 
 	if (PRINT_FIELD(WEIGHT))
 		printf("%16" PRIu64, sample->weight);
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 0da707da127c..31e079a1ab7b 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -272,3 +272,18 @@ int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
 
 	return l;
 }
+
+int perf_script__meminfo_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+{
+	int i = 0;
+
+	i += perf_mem__lvl_scnprintf(out, sz, mem_info);
+	i += scnprintf(out + i, sz - i, "|SNP ");
+	i += perf_mem__snp_scnprintf(out + i, sz - i, mem_info);
+	i += scnprintf(out + i, sz - i, "|TLB ");
+	i += perf_mem__tlb_scnprintf(out + i, sz - i, mem_info);
+	i += scnprintf(out + i, sz - i, "|LCK ");
+	i += perf_mem__lck_scnprintf(out + i, sz - i, mem_info);
+
+	return i;
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 759d35da2d6a..0f63d6a1c53a 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -50,5 +50,7 @@ int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
 
+int perf_script__meminfo_scnprintf(char *bf, size_t size, struct mem_info *mem_info);
+
 #endif /* __PERF_MEM_EVENTS_H */
 
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
@ 2016-02-16 16:56   ` Arnaldo Carvalho de Melo
  2016-02-17  3:10     ` Andi Kleen
  2016-02-17 14:39     ` Jiri Olsa
  2016-02-20 11:34   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 2 replies; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-16 16:56 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
> Allow user to easily switch all events to user or
> kernel space with simple --all-user or --all-kernel
> options.
> 
> This will be handy within perf mem/c2c wrappers to
> switch easily monitoring modes.

Humm, some oddities:

  # perf record --all-user -e cycles -a
  # perf report --tui       # And then notice there are some kernel samples, zoom into kernel DSO
  Samples: 7  of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux]
  Overhead  Comman  Symbol
    84.05%  chrome  [k] page_fault
    15.73%  chrome  [k] entry_SYSCALL_64
     0.22%  chrome  [k] apic_timer_interrupt

Ditto when using --all-kernel, some userspace samples are there, also perhaps we
should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features
are used.

Need to investigate why there are kernel samples when --all-user is used and
the other way around as well.

Also if I use both it quietly accepts and shows just one of them, I guess we
should bail out in case someone tries both.

- Arnaldo 

> Link: http://lkml.kernel.org/n/tip-hdd2u0y1o8cwfpplrpzc1iqd@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/Documentation/perf-record.txt |  6 ++++++
>  tools/perf/builtin-record.c              |  4 ++++
>  tools/perf/perf.h                        |  2 ++
>  tools/perf/util/evsel.c                  | 10 ++++++++++
>  4 files changed, 22 insertions(+)
> 
> diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
> index fbceb631387c..19aa17532a16 100644
> --- a/tools/perf/Documentation/perf-record.txt
> +++ b/tools/perf/Documentation/perf-record.txt
> @@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo.
>  --buildid-all::
>  Record build-id of all DSOs regardless whether it's actually hit or not.
>  
> +--all-kernel::
> +Configure all used events to run in kernel space.
> +
> +--all-user::
> +Configure all used events to run in user space.
> +
>  SEE ALSO
>  --------
>  linkperf:perf-stat[1], linkperf:perf-list[1]
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index caa8235ed027..b64f31a4c993 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1151,6 +1151,10 @@ struct option __record_options[] = {
>  			"per thread proc mmap processing timeout in ms"),
>  	OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
>  		    "Record context switch events"),
> +	OPT_BOOLEAN(0, "all-kernel", &record.opts.all_kernel,
> +		    "Configure all used events to run in kernel space."),
> +	OPT_BOOLEAN(0, "all-user", &record.opts.all_user,
> +		    "Configure all used events to run in user space."),
>  	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
>  		   "clang binary to use for compiling BPF scriptlets"),
>  	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index 90129accffbe..5381a01c0610 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -58,6 +58,8 @@ struct record_opts {
>  	bool	     full_auxtrace;
>  	bool	     auxtrace_snapshot_mode;
>  	bool	     record_switch_events;
> +	bool	     all_kernel;
> +	bool	     all_user;
>  	unsigned int freq;
>  	unsigned int mmap_pages;
>  	unsigned int auxtrace_mmap_pages;
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 467808680ee4..6ae20d0056de 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
>  	if (evsel->precise_max)
>  		perf_event_attr__set_max_precise_ip(attr);
>  
> +	if (opts->all_user) {
> +		attr->exclude_kernel = 1;
> +		attr->exclude_user   = 0;
> +	}
> +
> +	if (opts->all_kernel) {
> +		attr->exclude_kernel = 0;
> +		attr->exclude_user   = 1;
> +	}
> +
>  	/*
>  	 * Apply event specific term settings,
>  	 * it overloads any global configuration.
> -- 
> 2.4.3

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-16 16:56   ` Arnaldo Carvalho de Melo
@ 2016-02-17  3:10     ` Andi Kleen
  2016-02-17 14:26       ` Arnaldo Carvalho de Melo
  2016-02-17 14:39     ` Jiri Olsa
  1 sibling, 1 reply; 45+ messages in thread
From: Andi Kleen @ 2016-02-17  3:10 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian

> Need to investigate why there are kernel samples when --all-user is used and
> the other way around as well.

This is a known issue due to skid. PEBS usually avoids it.

-Andi

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-17  3:10     ` Andi Kleen
@ 2016-02-17 14:26       ` Arnaldo Carvalho de Melo
  2016-02-17 15:31         ` Andi Kleen
  0 siblings, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-17 14:26 UTC (permalink / raw)
  To: Andi Kleen
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian

Em Tue, Feb 16, 2016 at 07:10:37PM -0800, Andi Kleen escreveu:
> > Need to investigate why there are kernel samples when --all-user is used and
> > the other way around as well.

> This is a known issue due to skid. PEBS usually avoids it.

Right, thanks for pointing this out, we have to detect that :p is not
being used and warn the user about this possibility, i.e. user asks for
just kernel samples, tool finds user samples, tell that using :p+ may
help.

Now, using plain:

 # perf record --all-user -a sleep 2

will make it use the default which is 'cycles' with the highest
precision available on the machine, and that leaves just a few samples
that supposedly have the MISC_KERNEL bit set in the perf_event_attr
header, those are not mapping to any mmap area known to the tool, I'm
investigating what this is.

I'll apply the patch as-is, we'll check later OPT_ magic to tell that
those options are mutually exclusive.

- Arnaldo

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-16 16:56   ` Arnaldo Carvalho de Melo
  2016-02-17  3:10     ` Andi Kleen
@ 2016-02-17 14:39     ` Jiri Olsa
  2016-02-17 14:55       ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-17 14:39 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

On Tue, Feb 16, 2016 at 01:56:01PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
> > Allow user to easily switch all events to user or
> > kernel space with simple --all-user or --all-kernel
> > options.
> > 
> > This will be handy within perf mem/c2c wrappers to
> > switch easily monitoring modes.
> 
> Humm, some oddities:
> 
>   # perf record --all-user -e cycles -a
>   # perf report --tui       # And then notice there are some kernel samples, zoom into kernel DSO
>   Samples: 7  of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux]
>   Overhead  Comman  Symbol
>     84.05%  chrome  [k] page_fault
>     15.73%  chrome  [k] entry_SYSCALL_64
>      0.22%  chrome  [k] apic_timer_interrupt
> 
> Ditto when using --all-kernel, some userspace samples are there, also perhaps we
> should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features
> are used.
> 
> Need to investigate why there are kernel samples when --all-user is used and
> the other way around as well.
> 
> Also if I use both it quietly accepts and shows just one of them, I guess we
> should bail out in case someone tries both.

right, that should be handled with warning and exit
I'll do it in next version

thanks,
jirka

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-17 14:39     ` Jiri Olsa
@ 2016-02-17 14:55       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-17 14:55 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

Em Wed, Feb 17, 2016 at 03:39:38PM +0100, Jiri Olsa escreveu:
> On Tue, Feb 16, 2016 at 01:56:01PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
> > > Allow user to easily switch all events to user or
> > > kernel space with simple --all-user or --all-kernel
> > > options.
> > > 
> > > This will be handy within perf mem/c2c wrappers to
> > > switch easily monitoring modes.
> > 
> > Humm, some oddities:
> > 
> >   # perf record --all-user -e cycles -a
> >   # perf report --tui       # And then notice there are some kernel samples, zoom into kernel DSO
> >   Samples: 7  of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux]
> >   Overhead  Comman  Symbol
> >     84.05%  chrome  [k] page_fault
> >     15.73%  chrome  [k] entry_SYSCALL_64
> >      0.22%  chrome  [k] apic_timer_interrupt
> > 
> > Ditto when using --all-kernel, some userspace samples are there, also perhaps we
> > should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features
> > are used.
> > 
> > Need to investigate why there are kernel samples when --all-user is used and
> > the other way around as well.
> > 
> > Also if I use both it quietly accepts and shows just one of them, I guess we
> > should bail out in case someone tries both.
> 
> right, that should be handled with warning and exit
> I'll do it in next version

Ok, so I'll wait for it then,

builtin-probe.c uses things like:

        set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); 
        set_option_flag(options, 'd', "del", PARSE_OPT_EXCLUSIVE);

We have:

#define OPT_BOOLEAN_FLAG(s, l, v, h, f)     { .type = OPTION_BOOLEAN,
.short_name = (s), .long_name = (l), .value = check_vtype(v, bool *),
.help = (h), .flags = (f) }


That allows setting that PARSE_OPT_EXCLUSIVE flag, but we don't have
_FLAG variants for all opt types, for instance there is no
OPT_CALLBACK_FLAG() that could be used in builtin-probe.c to avoid those
unconditional set_option_flag(EXCLUSIVE) :-\

- Arnaldo

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
  2016-02-17 14:26       ` Arnaldo Carvalho de Melo
@ 2016-02-17 15:31         ` Andi Kleen
  0 siblings, 0 replies; 45+ messages in thread
From: Andi Kleen @ 2016-02-17 15:31 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian

On Wed, Feb 17, 2016 at 11:26:16AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Tue, Feb 16, 2016 at 07:10:37PM -0800, Andi Kleen escreveu:
> > > Need to investigate why there are kernel samples when --all-user is used and
> > > the other way around as well.
> 
> > This is a known issue due to skid. PEBS usually avoids it.
> 
> Right, thanks for pointing this out, we have to detect that :p is not
> being used and warn the user about this possibility, i.e. user asks for
> just kernel samples, tool finds user samples, tell that using :p+ may
> help.

If you're really so worried about it the kernel driver could filter it.

-Andi

^ permalink raw reply	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf record: Add --all-user/--all-kernel options
  2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
  2016-02-16 16:56   ` Arnaldo Carvalho de Melo
@ 2016-02-20 11:34   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-20 11:34 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: dsahern, ak, linux-kernel, acme, namhyung, eranian, mingo,
	a.p.zijlstra, hpa, tglx, jolsa

Commit-ID:  85723885feb823b4fc352b727ece0b6d00306c4d
Gitweb:     http://git.kernel.org/tip/85723885feb823b4fc352b727ece0b6d00306c4d
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:31 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 18 Feb 2016 10:48:44 -0300

perf record: Add --all-user/--all-kernel options

Allow user to easily switch all events to user or kernel space with simple
--all-user or --all-kernel options.

This will be handy within perf mem/c2c wrappers to switch easily monitoring
modes.

Committer note:

Testing it:

  # perf record --all-kernel --all-user -a sleep 2
   Error: option `all-user' cannot be used with all-kernel
   Usage: perf record [<options>] [<command>]
      or: perf record [<options>] -- <command> [<options>]

        --all-user        Configure all used events to run in user space.
        --all-kernel      Configure all used events to run in kernel space.
  # perf record --all-user --all-kernel -a sleep 2
   Error: option `all-kernel' cannot be used with all-user
   Usage: perf record [<options>] [<command>]
      or: perf record [<options>] -- <command> [<options>]

        --all-kernel      Configure all used events to run in kernel space.
        --all-user        Configure all used events to run in user space.
  # perf record --all-user -a sleep 1
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 1.416 MB perf.data (162 samples) ]
  # perf report | grep '\[k\]'
  # perf record --all-kernel -a sleep 1
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 1.423 MB perf.data (296 samples) ]
  # perf report | grep '\[\.\]'
  #

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-2-git-send-email-jolsa@kernel.org
[ Made those options to be mutually exclusive ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Documentation/perf-record.txt |  6 ++++++
 tools/perf/builtin-record.c              |  6 ++++++
 tools/perf/perf.h                        |  2 ++
 tools/perf/util/evsel.c                  | 10 ++++++++++
 4 files changed, 24 insertions(+)

diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index fbceb63..19aa175 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo.
 --buildid-all::
 Record build-id of all DSOs regardless whether it's actually hit or not.
 
+--all-kernel::
+Configure all used events to run in kernel space.
+
+--all-user::
+Configure all used events to run in user space.
+
 SEE ALSO
 --------
 linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 0ee0d5c..cf3a28d 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1140,6 +1140,12 @@ struct option __record_options[] = {
 			"per thread proc mmap processing timeout in ms"),
 	OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
 		    "Record context switch events"),
+	OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
+			 "Configure all used events to run in kernel space.",
+			 PARSE_OPT_EXCLUSIVE),
+	OPT_BOOLEAN_FLAG(0, "all-user", &record.opts.all_user,
+			 "Configure all used events to run in user space.",
+			 PARSE_OPT_EXCLUSIVE),
 	OPT_STRING(0, "clang-path", &llvm_param.clang_path, "clang path",
 		   "clang binary to use for compiling BPF scriptlets"),
 	OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index 90129ac..5381a01 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -58,6 +58,8 @@ struct record_opts {
 	bool	     full_auxtrace;
 	bool	     auxtrace_snapshot_mode;
 	bool	     record_switch_events;
+	bool	     all_kernel;
+	bool	     all_user;
 	unsigned int freq;
 	unsigned int mmap_pages;
 	unsigned int auxtrace_mmap_pages;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 4678086..6ae20d0 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
 	if (evsel->precise_max)
 		perf_event_attr__set_max_precise_ip(attr);
 
+	if (opts->all_user) {
+		attr->exclude_kernel = 1;
+		attr->exclude_user   = 0;
+	}
+
+	if (opts->all_kernel) {
+		attr->exclude_kernel = 0;
+		attr->exclude_user   = 1;
+	}
+
 	/*
 	 * Apply event specific term settings,
 	 * it overloads any global configuration.

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH 04/23] perf tools: Add monitored events array
  2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
@ 2016-02-23 15:10   ` Arnaldo Carvalho de Melo
  2016-02-23 15:18     ` Jiri Olsa
  2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-23 15:10 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Mon, Feb 15, 2016 at 09:34:34AM +0100, Jiri Olsa escreveu:
> It will ease up configuration of memory events
> and addition of other memory events in following
> patches.
> 
> Link: http://lkml.kernel.org/n/tip-5n4yyd6dlrjhpd9rmaa2sycs@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>

Please check your .git/hooks, fixing it this time:


[acme@jouet linux]$ am /wb/1.patch 
Applying: perf tools: Add monitored events array
/home/acme/git/linux/.git/rebase-apply/patch:104: new blank line at EOF.
+
warning: 1 line adds whitespace errors.
tools/perf/util/mem-events.h:20: new blank line at EOF.
[acme@jouet linux]$

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 04/23] perf tools: Add monitored events array
  2016-02-23 15:10   ` Arnaldo Carvalho de Melo
@ 2016-02-23 15:18     ` Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-23 15:18 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

On Tue, Feb 23, 2016 at 12:10:35PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, Feb 15, 2016 at 09:34:34AM +0100, Jiri Olsa escreveu:
> > It will ease up configuration of memory events
> > and addition of other memory events in following
> > patches.
> > 
> > Link: http://lkml.kernel.org/n/tip-5n4yyd6dlrjhpd9rmaa2sycs@git.kernel.org
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> 
> Please check your .git/hooks, fixing it this time:

hum, I don't have any ;-) will check, thanks

jirka

> 
> 
> [acme@jouet linux]$ am /wb/1.patch 
> Applying: perf tools: Add monitored events array
> /home/acme/git/linux/.git/rebase-apply/patch:104: new blank line at EOF.
> +
> warning: 1 line adds whitespace errors.
> tools/perf/util/mem-events.h:20: new blank line at EOF.
> [acme@jouet linux]$

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 06/23] perf mem: Check for memory events support
  2016-02-15  8:34 ` [PATCH 06/23] perf mem: Check for memory events support Jiri Olsa
@ 2016-02-23 15:18   ` Arnaldo Carvalho de Melo
  2016-02-23 15:24     ` Arnaldo Carvalho de Melo
  2016-02-23 15:29     ` Jiri Olsa
  0 siblings, 2 replies; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-23 15:18 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
> Check if current kernel support available memory events
> and display the status within -e  list option:
> 
>   $ perf mem record -e list
>   [ok] ldlat-loads
>   [ok] ldlat-stores

Can't this be:

  $ perf mem record -e list
  ldlat-loads:  Available on this machine
  ldlat-stores: Available on this machine

- Arnaldo
 
> Link: http://lkml.kernel.org/n/tip-r8smhxjfe69q67jwt7mzs0e9@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/builtin-mem.c     | 14 +++++++++++++-
>  tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++---
>  tools/perf/util/mem-events.h |  3 +++
>  3 files changed, 48 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
> index b3f8a89ede40..e64e0aa7ba0e 100644
> --- a/tools/perf/builtin-mem.c
> +++ b/tools/perf/builtin-mem.c
> @@ -40,7 +40,8 @@ static int parse_record_events(const struct option *opt,
>  	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
>  		struct perf_mem_event *e = &perf_mem_events[j];
>  
> -		fprintf(stderr, "%-20s%s",
> +		fprintf(stderr, "%s%-20s%s",
> +			e->supported ? "[ok] " : "     ",
>  			e->tag, verbose ? "" : "\n");
>  		if (verbose)
>  			fprintf(stderr, " [%s]\n", e->name);
> @@ -92,6 +93,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
>  		if (!perf_mem_events[j].record)
>  			continue;
>  
> +		if (!perf_mem_events[j].supported) {
> +			pr_err("failed: event '%s' not supported\n",
> +			       perf_mem_events[j].name);
> +			return -1;
> +		}
> +
>  		rec_argv[i++] = "-e";
>  		rec_argv[i++] = perf_mem_events[j].name;
>  	};
> @@ -355,6 +362,11 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
>  		NULL
>  	};
>  
> +	if (perf_mem_events__init()) {
> +		pr_err("failed: memory events not supported\n");
> +		return -1;
> +	}
> +
>  	argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands,
>  					mem_usage, PARSE_OPT_STOP_AT_NON_OPTION);
>  
> diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
> index b1507c04b257..e21853fe1312 100644
> --- a/tools/perf/util/mem-events.c
> +++ b/tools/perf/util/mem-events.c
> @@ -2,15 +2,20 @@
>  #include <stdlib.h>
>  #include <string.h>
>  #include <errno.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +#include <api/fs/fs.h>
>  #include "mem-events.h"
>  #include "debug.h"
>  
> -#define E(t, n) { .tag = t, .name = n }
> +#define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
>  
>  struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
> -	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P"),
> -	E("ldlat-stores",	"cpu/mem-stores/P"),
> +	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P",	"mem-loads"),
> +	E("ldlat-stores",	"cpu/mem-stores/P",		"mem-stores"),
>  };
> +#undef E
>  
>  #undef E
>  
> @@ -49,3 +54,27 @@ int perf_mem_events__parse(const char *str)
>  	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
>  	return -1;
>  }
> +
> +int perf_mem_events__init(void)
> +{
> +	const char *mnt = sysfs__mount();
> +	bool found = false;
> +	int j;
> +
> +	if (!mnt)
> +		return -ENOENT;
> +
> +	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
> +		char path[PATH_MAX];
> +		struct perf_mem_event *e = &perf_mem_events[j];
> +		struct stat st;
> +
> +		scnprintf(path, PATH_MAX, "%s/devices/cpu/events/%s",
> +			  mnt, e->sysfs_name);
> +
> +		if (!stat(path, &st))
> +			e->supported = found = true;
> +	}
> +
> +	return found ? 0 : -ENOENT;
> +}
> diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
> index 0b5247468462..b9a786346c03 100644
> --- a/tools/perf/util/mem-events.h
> +++ b/tools/perf/util/mem-events.h
> @@ -5,8 +5,10 @@
>  
>  struct perf_mem_event {
>  	bool		record;
> +	bool		supported;
>  	const char	*tag;
>  	const char	*name;
> +	const char	*sysfs_name;
>  };
>  
>  enum {
> @@ -18,6 +20,7 @@ enum {
>  extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
>  
>  int perf_mem_events__parse(const char *str);
> +int perf_mem_events__init(void);
>  
>  #endif /* __PERF_MEM_EVENTS_H */
>  
> -- 
> 2.4.3

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 06/23] perf mem: Check for memory events support
  2016-02-23 15:18   ` Arnaldo Carvalho de Melo
@ 2016-02-23 15:24     ` Arnaldo Carvalho de Melo
  2016-02-23 15:42       ` Jiri Olsa
  2016-02-23 15:29     ` Jiri Olsa
  1 sibling, 1 reply; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-23 15:24 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
> > Check if current kernel support available memory events
> > and display the status within -e  list option:
> > 
> >   $ perf mem record -e list
> >   [ok] ldlat-loads
> >   [ok] ldlat-stores
> 
> Can't this be:
> 
>   $ perf mem record -e list
>   ldlat-loads:  Available on this machine
>   ldlat-stores: Available on this machine

Please check perf/core, I applied a good number of the patches in this
series.

- Arnaldo

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 06/23] perf mem: Check for memory events support
  2016-02-23 15:18   ` Arnaldo Carvalho de Melo
  2016-02-23 15:24     ` Arnaldo Carvalho de Melo
@ 2016-02-23 15:29     ` Jiri Olsa
  2016-02-23 15:34       ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 45+ messages in thread
From: Jiri Olsa @ 2016-02-23 15:29 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

On Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
> > Check if current kernel support available memory events
> > and display the status within -e  list option:
> > 
> >   $ perf mem record -e list
> >   [ok] ldlat-loads
> >   [ok] ldlat-stores
> 
> Can't this be:
> 
>   $ perf mem record -e list
>   ldlat-loads:  Available on this machine
>   ldlat-stores: Available on this machine

hum IMO that would be quite long list if DATALA events will
get in, so I wanted something short and punchy ;-)

how about plaing it into back as you suggested
with just 'available'

	$ perf mem record -e list
	ldlat-loads:  available
	ldlat-stores: available

jirka

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 06/23] perf mem: Check for memory events support
  2016-02-23 15:29     ` Jiri Olsa
@ 2016-02-23 15:34       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 45+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-23 15:34 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

Em Tue, Feb 23, 2016 at 04:29:57PM +0100, Jiri Olsa escreveu:
> On Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo wrote:
> > Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
> > > Check if current kernel support available memory events
> > > and display the status within -e  list option:
> > > 
> > >   $ perf mem record -e list
> > >   [ok] ldlat-loads
> > >   [ok] ldlat-stores

> > Can't this be:

> >   $ perf mem record -e list
> >   ldlat-loads:  Available on this machine
> >   ldlat-stores: Available on this machine
 
> hum IMO that would be quite long list if DATALA events will
> get in, so I wanted something short and punchy ;-)
 
> how about plaing it into back as you suggested
> with just 'available'
> 
> 	$ perf mem record -e list
> 	ldlat-loads:  available
> 	ldlat-stores: available

Fair enough, this is more in line with, say, 'perf test' output, i.e.:

  $ perf foo
  something: status/result

- Arnaldo

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 06/23] perf mem: Check for memory events support
  2016-02-23 15:24     ` Arnaldo Carvalho de Melo
@ 2016-02-23 15:42       ` Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: Jiri Olsa @ 2016-02-23 15:42 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: Jiri Olsa, lkml, David Ahern, Ingo Molnar, Namhyung Kim,
	Peter Zijlstra, Stephane Eranian, Andi Kleen

On Tue, Feb 23, 2016 at 12:24:52PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
> > > Check if current kernel support available memory events
> > > and display the status within -e  list option:
> > > 
> > >   $ perf mem record -e list
> > >   [ok] ldlat-loads
> > >   [ok] ldlat-stores
> > 
> > Can't this be:
> > 
> >   $ perf mem record -e list
> >   ldlat-loads:  Available on this machine
> >   ldlat-stores: Available on this machine
> 
> Please check perf/core, I applied a good number of the patches in this
> series.

great, I'll rebase the rest and make the change
for this one in next version

thanks,
jirka

^ permalink raw reply	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf tools: Make cl_address global
  2016-02-15  8:34 ` [PATCH 02/23] perf tools: Make cl_address global Jiri Olsa
@ 2016-02-25  5:42   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:42 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, jolsa, linux-kernel, mingo, a.p.zijlstra, namhyung,
	dsahern, ak, hpa, eranian, tglx

Commit-ID:  e95cf700b1b267d912ee779c3ab36e582111a52d
Gitweb:     http://git.kernel.org/tip/e95cf700b1b267d912ee779c3ab36e582111a52d
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:32 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:09:02 -0300

perf tools: Make cl_address global

It'll be used in following patches.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-3-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/sort.c | 6 ------
 tools/perf/util/sort.h | 5 +++++
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 6d0f858..5f94ee7 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1015,12 +1015,6 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 	return repsep_snprintf(bf, size, "%-*s", width, out);
 }
 
-static inline  u64 cl_address(u64 address)
-{
-	/* return the cacheline of the address */
-	return (address & ~(cacheline_size - 1));
-}
-
 static int64_t
 sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right)
 {
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 89a1273..46f159f 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -162,6 +162,11 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he)
 	return period * 100.0 / total_period;
 }
 
+static inline u64 cl_address(u64 address)
+{
+	/* return the cacheline of the address */
+	return (address & ~(cacheline_size - 1));
+}
 
 enum sort_mode {
 	SORT_MODE__NORMAL,

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf tools: Introduce cl_offset function
  2016-02-15  8:34 ` [PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa
@ 2016-02-25  5:42   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:42 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: a.p.zijlstra, jolsa, tglx, acme, eranian, dsahern, hpa,
	linux-kernel, ak, mingo, namhyung

Commit-ID:  d392711095f12942a61e2963f5ab0076ac651e73
Gitweb:     http://git.kernel.org/tip/d392711095f12942a61e2963f5ab0076ac651e73
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:33 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:09:22 -0300

perf tools: Introduce cl_offset function

It'll be used in following patches.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-4-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/sort.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 46f159f..5b9c624 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -168,6 +168,12 @@ static inline u64 cl_address(u64 address)
 	return (address & ~(cacheline_size - 1));
 }
 
+static inline u64 cl_offset(u64 address)
+{
+	/* return the cacheline of the address */
+	return (address & (cacheline_size - 1));
+}
+
 enum sort_mode {
 	SORT_MODE__NORMAL,
 	SORT_MODE__BRANCH,

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf tools: Add monitored events array
  2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
  2016-02-23 15:10   ` Arnaldo Carvalho de Melo
@ 2016-02-25  5:42   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:42 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: namhyung, acme, a.p.zijlstra, mingo, linux-kernel, ak, jolsa,
	tglx, dsahern, hpa, eranian

Commit-ID:  acbe613e0c03d59cab21aec3565cdb28c7df98c3
Gitweb:     http://git.kernel.org/tip/acbe613e0c03d59cab21aec3565cdb28c7df98c3
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:34 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:11:06 -0300

perf tools: Add monitored events array

It will ease up configuration of memory events and addition of other
memory events in following patches.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-5-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-mem.c     | 17 +++++++++--------
 tools/perf/util/Build        |  1 +
 tools/perf/util/mem-events.c | 10 ++++++++++
 tools/perf/util/mem-events.h | 19 +++++++++++++++++++
 4 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 3901700..36c56a4 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -6,6 +6,7 @@
 #include "util/tool.h"
 #include "util/session.h"
 #include "util/data.h"
+#include "util/mem-events.h"
 
 #define MEM_OPERATION_LOAD	0x1
 #define MEM_OPERATION_STORE	0x2
@@ -34,20 +35,20 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 	rec_argv[i++] = "record";
 
-	if (mem->operation & MEM_OPERATION_LOAD)
+	if (mem->operation & MEM_OPERATION_LOAD) {
+		perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
 		rec_argv[i++] = "-W";
+	}
 
 	rec_argv[i++] = "-d";
 
-	if (mem->operation & MEM_OPERATION_LOAD) {
-		rec_argv[i++] = "-e";
-		rec_argv[i++] = "cpu/mem-loads/pp";
-	}
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		if (!perf_mem_events[j].record)
+			continue;
 
-	if (mem->operation & MEM_OPERATION_STORE) {
 		rec_argv[i++] = "-e";
-		rec_argv[i++] = "cpu/mem-stores/pp";
-	}
+		rec_argv[i++] = perf_mem_events[j].name;
+	};
 
 	for (j = 1; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index a34752d..df2b690 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -82,6 +82,7 @@ libperf-y += parse-branch-options.o
 libperf-y += parse-regs-options.o
 libperf-y += term.o
 libperf-y += help-unknown-cmd.o
+libperf-y += mem-events.o
 
 libperf-$(CONFIG_LIBBPF) += bpf-loader.o
 libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
new file mode 100644
index 0000000..c6ba0a1
--- /dev/null
+++ b/tools/perf/util/mem-events.c
@@ -0,0 +1,10 @@
+#include "mem-events.h"
+
+#define E(n) { .name = n }
+
+struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
+	E("cpu/mem-loads,ldlat=30/P"),
+	E("cpu/mem-stores/P"),
+};
+
+#undef E
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
new file mode 100644
index 0000000..c97b214
--- /dev/null
+++ b/tools/perf/util/mem-events.h
@@ -0,0 +1,19 @@
+#ifndef __PERF_MEM_EVENTS_H
+#define __PERF_MEM_EVENTS_H
+
+#include <stdbool.h>
+
+struct perf_mem_event {
+	bool		record;
+	const char	*name;
+};
+
+enum {
+	PERF_MEM_EVENTS__LOAD,
+	PERF_MEM_EVENTS__STORE,
+	PERF_MEM_EVENTS__MAX,
+};
+
+extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
+
+#endif /* __PERF_MEM_EVENTS_H */

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf mem: Add -e record option
  2016-02-15  8:34 ` [PATCH 05/23] perf mem: Add -e record option Jiri Olsa
@ 2016-02-25  5:43   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:43 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, namhyung, jolsa, mingo, hpa, linux-kernel, ak, tglx,
	eranian, dsahern, a.p.zijlstra

Commit-ID:  ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2
Gitweb:     http://git.kernel.org/tip/ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:35 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:15:59 -0300

perf mem: Add -e record option

Adding -e option for perf mem record command, to be able to specify
memory event directly.

Get list of available events:

  $ perf mem record -e list
  ldlat-loads
  ldlat-stores

Monitor ldlat-loads:
  $ perf mem record -e ldlat-loads true

Committer notes:

Further testing:

  # perf mem record -e ldlat-loads true
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.020 MB perf.data (10 samples) ]
  # perf evlist
  cpu/mem-loads,ldlat=30/P
  #

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-mem.c     | 63 +++++++++++++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.h |  3 +++
 3 files changed, 106 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 36c56a4..b3f8a89 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -7,6 +7,7 @@
 #include "util/session.h"
 #include "util/data.h"
 #include "util/mem-events.h"
+#include "util/debug.h"
 
 #define MEM_OPERATION_LOAD	0x1
 #define MEM_OPERATION_STORE	0x2
@@ -22,11 +23,55 @@ struct perf_mem {
 	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
 };
 
+static int parse_record_events(const struct option *opt,
+			       const char *str, int unset __maybe_unused)
+{
+	struct perf_mem *mem = *(struct perf_mem **)opt->value;
+	int j;
+
+	if (strcmp(str, "list")) {
+		if (!perf_mem_events__parse(str)) {
+			mem->operation = 0;
+			return 0;
+		}
+		exit(-1);
+	}
+
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		struct perf_mem_event *e = &perf_mem_events[j];
+
+		fprintf(stderr, "%-20s%s",
+			e->tag, verbose ? "" : "\n");
+		if (verbose)
+			fprintf(stderr, " [%s]\n", e->name);
+	}
+	exit(0);
+}
+
+static const char * const __usage[] = {
+	"perf mem record [<options>] [<command>]",
+	"perf mem record [<options>] -- <command> [<options>]",
+	NULL
+};
+
+static const char * const *record_mem_usage = __usage;
+
 static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 {
 	int rec_argc, i = 0, j;
 	const char **rec_argv;
 	int ret;
+	struct option options[] = {
+	OPT_CALLBACK('e', "event", &mem, "event",
+		     "event selector. use 'perf mem record -e list' to list available events",
+		     parse_record_events),
+	OPT_INCR('v', "verbose", &verbose,
+		 "be more verbose (show counter open errors, etc)"),
+	OPT_END()
+	};
+
+	argc = parse_options(argc, argv, options, record_mem_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
 
 	rec_argc = argc + 7; /* max number of arguments */
 	rec_argv = calloc(rec_argc + 1, sizeof(char *));
@@ -35,10 +80,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 	rec_argv[i++] = "record";
 
-	if (mem->operation & MEM_OPERATION_LOAD) {
+	if (mem->operation & MEM_OPERATION_LOAD)
 		perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
+
+	if (perf_mem_events[PERF_MEM_EVENTS__LOAD].record)
 		rec_argv[i++] = "-W";
-	}
 
 	rec_argv[i++] = "-d";
 
@@ -50,9 +96,19 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		rec_argv[i++] = perf_mem_events[j].name;
 	};
 
-	for (j = 1; j < argc; j++, i++)
+	for (j = 0; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
 
+	if (verbose > 0) {
+		pr_debug("calling: record ");
+
+		while (rec_argv[j]) {
+			pr_debug("%s ", rec_argv[j]);
+			j++;
+		}
+		pr_debug("\n");
+	}
+
 	ret = cmd_record(i, rec_argv, NULL);
 	free(rec_argv);
 	return ret;
@@ -299,7 +355,6 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
 		NULL
 	};
 
-
 	argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands,
 					mem_usage, PARSE_OPT_STOP_AT_NON_OPTION);
 
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index c6ba0a1..b1507c0 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -1,10 +1,51 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
 #include "mem-events.h"
+#include "debug.h"
 
-#define E(n) { .name = n }
+#define E(t, n) { .tag = t, .name = n }
 
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
-	E("cpu/mem-loads,ldlat=30/P"),
-	E("cpu/mem-stores/P"),
+	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P"),
+	E("ldlat-stores",	"cpu/mem-stores/P"),
 };
 
 #undef E
+
+int perf_mem_events__parse(const char *str)
+{
+	char *tok, *saveptr = NULL;
+	bool found = false;
+	char *buf;
+	int j;
+
+	/* We need buffer that we know we can write to. */
+	buf = malloc(strlen(str) + 1);
+	if (!buf)
+		return -ENOMEM;
+
+	strcpy(buf, str);
+
+	tok = strtok_r((char *)buf, ",", &saveptr);
+
+	while (tok) {
+		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+			struct perf_mem_event *e = &perf_mem_events[j];
+
+			if (strstr(e->tag, tok))
+				e->record = found = true;
+		}
+
+		tok = strtok_r(NULL, ",", &saveptr);
+	}
+
+	free(buf);
+
+	if (found)
+		return 0;
+
+	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
+	return -1;
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index c97b214..2995bae 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -5,6 +5,7 @@
 
 struct perf_mem_event {
 	bool		record;
+	const char	*tag;
 	const char	*name;
 };
 
@@ -16,4 +17,6 @@ enum {
 
 extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
 
+int perf_mem_events__parse(const char *str);
+
 #endif /* __PERF_MEM_EVENTS_H */

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf tools: Use ARRAY_SIZE in mem sort display functions
  2016-02-15  8:34 ` [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions Jiri Olsa
@ 2016-02-25  5:43   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:43 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: ak, tglx, mingo, dsahern, hpa, namhyung, jolsa, a.p.zijlstra,
	acme, linux-kernel, eranian

Commit-ID:  b19a1b6a233ede3ffc379b49e3653d6ce80dd743
Gitweb:     http://git.kernel.org/tip/b19a1b6a233ede3ffc379b49e3653d6ce80dd743
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:42 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:19:10 -0300

perf tools: Use ARRAY_SIZE in mem sort display functions

There's no need to define extra macros for that.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-13-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/sort.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 5f94ee7..5388f79 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -838,7 +838,6 @@ static const char * const tlb_access[] = {
 	"Walker",
 	"Fault",
 };
-#define NUM_TLB_ACCESS (sizeof(tlb_access)/sizeof(const char *))
 
 static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -860,7 +859,7 @@ static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,
 	/* already taken care of */
 	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
 
-	for (i = 0; m && i < NUM_TLB_ACCESS; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(tlb_access); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {
@@ -915,7 +914,6 @@ static const char * const mem_lvl[] = {
 	"I/O",
 	"Uncached",
 };
-#define NUM_MEM_LVL (sizeof(mem_lvl)/sizeof(const char *))
 
 static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -937,7 +935,7 @@ static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
 	/* already taken care of */
 	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
 
-	for (i = 0; m && i < NUM_MEM_LVL; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {
@@ -983,7 +981,6 @@ static const char * const snoop_access[] = {
 	"Hit",
 	"HitM",
 };
-#define NUM_SNOOP_ACCESS (sizeof(snoop_access)/sizeof(const char *))
 
 static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
@@ -998,7 +995,7 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
 	if (he->mem_info)
 		m = he->mem_info->data_src.mem_snoop;
 
-	for (i = 0; m && i < NUM_SNOOP_ACCESS; i++, m >>= 1) {
+	for (i = 0; m && i < ARRAY_SIZE(snoop_access); i++, m >>= 1) {
 		if (!(m & 0x1))
 			continue;
 		if (l) {

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf script: Add data_src and weight column definitions
  2016-02-15  8:34 ` [PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa
@ 2016-02-25  5:43   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:43 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: eranian, a.p.zijlstra, dsahern, namhyung, linux-kernel, acme,
	jolsa, mingo, tglx, hpa, ak

Commit-ID:  94ddddfab521423d94d6066879b514b9431e5cae
Gitweb:     http://git.kernel.org/tip/94ddddfab521423d94d6066879b514b9431e5cae
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:51 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:20:02 -0300

perf script: Add data_src and weight column definitions

Adding data_src and weight column definitions, so it's displayed for
related sample types.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-22-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-script.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index c691214..b7f1e8e 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -58,6 +58,8 @@ enum perf_output_field {
 	PERF_OUTPUT_IREGS	    = 1U << 14,
 	PERF_OUTPUT_BRSTACK	    = 1U << 15,
 	PERF_OUTPUT_BRSTACKSYM	    = 1U << 16,
+	PERF_OUTPUT_DATA_SRC	    = 1U << 17,
+	PERF_OUTPUT_WEIGHT	    = 1U << 18,
 };
 
 struct output_option {
@@ -81,6 +83,8 @@ struct output_option {
 	{.str = "iregs", .field = PERF_OUTPUT_IREGS},
 	{.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
 	{.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
+	{.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
+	{.str = "weight",   .field = PERF_OUTPUT_WEIGHT},
 };
 
 /* default set to maintain compatibility with current format */
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
 					   PERF_OUTPUT_ADDR, allow_user_set))
 		return -EINVAL;
 
+	if (PRINT_FIELD(DATA_SRC) &&
+		perf_evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC",
+					PERF_OUTPUT_DATA_SRC))
+		return -EINVAL;
+
+	if (PRINT_FIELD(WEIGHT) &&
+		perf_evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT",
+					PERF_OUTPUT_WEIGHT))
+		return -EINVAL;
+
 	if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
 		pr_err("Display of symbols requested but neither sample IP nor "
 			   "sample address\nis selected. Hence, no addresses to convert "
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,
 	if (PRINT_FIELD(ADDR))
 		print_sample_addr(event, sample, thread, attr);
 
+	if (PRINT_FIELD(DATA_SRC))
+		printf("%16" PRIx64, sample->data_src);
+
+	if (PRINT_FIELD(WEIGHT))
+		printf("%16" PRIu64, sample->weight);
+
 	if (PRINT_FIELD(IP)) {
 		if (!symbol_conf.use_callchain)
 			printf(" ");

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [tip:perf/core] perf script: Display addr/data_src/weight columns for raw events
  2016-02-15  8:34 ` [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events Jiri Olsa
@ 2016-02-25  5:43   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 45+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  5:43 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, a.p.zijlstra, tglx, hpa, eranian, mingo, dsahern,
	namhyung, acme, jolsa, ak

Commit-ID:  ff7b191583c368612fde88bf3cff6e3f3b0d73d5
Gitweb:     http://git.kernel.org/tip/ff7b191583c368612fde88bf3cff6e3f3b0d73d5
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:52 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:20:21 -0300

perf script: Display addr/data_src/weight columns for raw events

Adding addr/data_src/weight columns for raw events.

Example:
  $ perf script
  ...
  true 11883 322960.489590: ...  ffff8801aa0b8400        68501042             246 ffffffff813b2cd
  true 11883 322960.489600: ...  ffff8800b90b38d8        68501042             251 ffffffff811d0b7
  true 11883 322960.489612: ...  ffff880196893130        6a100142              94 ffffffff8177fb8
  true 11883 322960.489637: ...  ffff880164277b40        68100842             101 ffffffff813b2cd
  true 11883 322960.489683: ...  ffff880035d3d818        68501042             201 ffffffff811d0b7
  true 11883 322960.489733: ...      7fb9616efcf0        68100242             199     7fb961aaba9
  true 11883 322960.489818: ...  ffffea000481c39c        6a100142             122 ffffffff811b634

                                 ^^^^^^^^^^^^^^^^        ^^^^^^^^             ^^^
                                             addr        data_src          weight

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-23-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-script.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index b7f1e8e..f4caf48 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -135,7 +135,8 @@ static struct {
 			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
 			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
 			      PERF_OUTPUT_SYM | PERF_OUTPUT_DSO |
-			      PERF_OUTPUT_PERIOD,
+			      PERF_OUTPUT_PERIOD |  PERF_OUTPUT_ADDR |
+			      PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT,
 
 		.invalid_fields = PERF_OUTPUT_TRACE,
 	},

^ permalink raw reply related	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2016-02-25  6:30 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
2016-02-16 16:56   ` Arnaldo Carvalho de Melo
2016-02-17  3:10     ` Andi Kleen
2016-02-17 14:26       ` Arnaldo Carvalho de Melo
2016-02-17 15:31         ` Andi Kleen
2016-02-17 14:39     ` Jiri Olsa
2016-02-17 14:55       ` Arnaldo Carvalho de Melo
2016-02-20 11:34   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 02/23] perf tools: Make cl_address global Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
2016-02-23 15:10   ` Arnaldo Carvalho de Melo
2016-02-23 15:18     ` Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 05/23] perf mem: Add -e record option Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 06/23] perf mem: Check for memory events support Jiri Olsa
2016-02-23 15:18   ` Arnaldo Carvalho de Melo
2016-02-23 15:24     ` Arnaldo Carvalho de Melo
2016-02-23 15:42       ` Jiri Olsa
2016-02-23 15:29     ` Jiri Olsa
2016-02-23 15:34       ` Arnaldo Carvalho de Melo
2016-02-15  8:34 ` [PATCH 07/23] perf mem: Introduce perf_mem_events__name function Jiri Olsa
2016-02-15  8:34 ` [PATCH 08/23] perf mem: Add -l/--ldlat option Jiri Olsa
2016-02-15  8:34 ` [PATCH 09/23] perf mem: Add -u/-k options Jiri Olsa
2016-02-15  8:34 ` [PATCH 10/23] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
2016-02-15  8:34 ` [PATCH 11/23] perf mem: Add Intel DATALA memory events Jiri Olsa
2016-02-15  8:34 ` [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 16/23] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
2016-02-15  8:34 ` [PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 19/23] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 20/23] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 23/23] perf script: Display data_src values Jiri Olsa

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.