All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 00/15] perf tools: Several memory events updates
@ 2016-02-24  8:46 Jiri Olsa
  2016-02-24  8:46 ` [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa
                   ` (14 more replies)
  0 siblings, 15 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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

v2 changes:
  - changed the output of perf mem record -e list [Arnaldo]
  - rebased, some of the patches got already pulled in

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

thanks,
jirka


---
Jiri Olsa (15):
      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 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: Display data_src values
      perf x86 intel: Add DATALA events into sysfs
      perf mem: Add Intel DATALA memory events

 arch/x86/events/intel/core.c |  39 ++++++++++++++++++++
 tools/perf/builtin-mem.c     |  34 ++++++++++++++---
 tools/perf/builtin-script.c  |  20 +++++++++-
 tools/perf/util/mem-events.c | 244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 tools/perf/util/mem-events.h |  33 +++++++++++++++++
 tools/perf/util/sort.c       | 139 +++------------------------------------------------------------------
 6 files changed, 366 insertions(+), 143 deletions(-)

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

* [PATCH 01/15] perf mem: Check for memory events support
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:36   ` [tip:perf/core] perf mem record: " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 02/15] perf mem: Introduce perf_mem_events__name function Jiri Olsa
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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
  ldlat-loads  : available
  ldlat-stores : available

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

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index b3f8a89ede40..f1fa7b8d1f69 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -40,10 +40,11 @@ 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",
-			e->tag, verbose ? "" : "\n");
-		if (verbose)
-			fprintf(stderr, " [%s]\n", e->name);
+		fprintf(stderr, "%-13s%-*s%s\n",
+			e->tag,
+			verbose ? 25 : 0,
+			verbose ? e->name : "",
+			e->supported ? ": available" : "");
 	}
 	exit(0);
 }
@@ -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 2995bae6ac33..75c1660bda62 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,5 +20,6 @@ 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] 36+ messages in thread

* [PATCH 02/15] perf mem: Introduce perf_mem_events__name function
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
  2016-02-24  8:46 ` [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:36   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 03/15] perf mem: Add -l/--ldlat option Jiri Olsa
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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     | 6 +++---
 tools/perf/util/mem-events.c | 5 +++++
 tools/perf/util/mem-events.h | 1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index f1fa7b8d1f69..88aeac9aa1da 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -43,7 +43,7 @@ static int parse_record_events(const struct option *opt,
 		fprintf(stderr, "%-13s%-*s%s\n",
 			e->tag,
 			verbose ? 25 : 0,
-			verbose ? e->name : "",
+			verbose ? perf_mem_events__name(j) : "",
 			e->supported ? ": available" : "");
 	}
 	exit(0);
@@ -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 75c1660bda62..2a91b959de62 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -22,4 +22,5 @@ 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] 36+ messages in thread

* [PATCH 03/15] perf mem: Add -l/--ldlat option
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
  2016-02-24  8:46 ` [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa
  2016-02-24  8:46 ` [PATCH 02/15] perf mem: Introduce perf_mem_events__name function Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-24 13:14   ` Arnaldo Carvalho de Melo
  2016-02-24  8:46 ` [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 88aeac9aa1da..9da09e058f4b 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 2a91b959de62..4ab437291589 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] 36+ messages in thread

* [PATCH 04/15] perf mem: Add -u/-k options
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (2 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 03/15] perf mem: Add -l/--ldlat option Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-24 13:17   ` Arnaldo Carvalho de Melo
  2016-02-24  8:46 ` [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 9da09e058f4b..8a31b3f634d9 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] 36+ messages in thread

* [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (3 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-24 13:18   ` Arnaldo Carvalho de Melo
  2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 06/15] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
                   ` (9 subsequent siblings)
  14 siblings, 2 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 3772a3a8a6ee..08c35dd7e335 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;
 
@@ -98,3 +99,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 4ab437291589..b5067361a11c 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -24,4 +24,7 @@ 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 5388f7940474..160df202c34f 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";
@@ -829,53 +830,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] 36+ messages in thread

* [PATCH 06/15] perf tools: Introduce perf_mem__lvl_scnprintf function
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (4 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 08c35dd7e335..d6eb00d0ca73 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -145,3 +145,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 b5067361a11c..b1b1399deec1 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -27,4 +27,5 @@ 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 160df202c34f..d894759c47f0 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -858,60 +858,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] 36+ messages in thread

* [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (5 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 06/15] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 08/15] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 d6eb00d0ca73..aacd16a670c8 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -198,3 +198,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 b1b1399deec1..6f8ea2f8107b 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -28,4 +28,5 @@ 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 d894759c47f0..2007c3b683f3 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -886,41 +886,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] 36+ messages in thread

* [PATCH 08/15] perf tools: Introduce perf_mem__lck_scnprintf function
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (6 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 09/15] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 aacd16a670c8..3b16128234b7 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -232,3 +232,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 6f8ea2f8107b..06750f640586 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -29,4 +29,6 @@ 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 2007c3b683f3..4175b2944ff9 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -795,19 +795,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] 36+ messages in thread

* [PATCH 09/15] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (7 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 08/15] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 10/15] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 3b16128234b7..7a4fb7e8159d 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -110,7 +110,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;
@@ -135,15 +135,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 06750f640586..c6fb8a741fbb 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -26,7 +26,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] 36+ messages in thread

* [PATCH 10/15] perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (8 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 09/15] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 11/15] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 7a4fb7e8159d..cd8241fea081 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -164,7 +164,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;
@@ -189,15 +189,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 c6fb8a741fbb..9b7a273aeeee 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -27,7 +27,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] 36+ messages in thread

* [PATCH 11/15] perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (9 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 10/15] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 12/15] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 cd8241fea081..331cbec5100c 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -209,7 +209,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;
@@ -227,12 +227,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 9b7a273aeeee..9289db6a6d5b 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -28,7 +28,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] 36+ messages in thread

* [PATCH 12/15] perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (10 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 11/15] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 13/15] perf script: Display data_src values Jiri Olsa
                   ` (2 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 331cbec5100c..acc46ac26f73 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -236,18 +236,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 9289db6a6d5b..4c0263125f77 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -29,6 +29,6 @@ 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] 36+ messages in thread

* [PATCH 13/15] perf script: Display data_src values
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (11 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 12/15] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-24 13:34   ` Arnaldo Carvalho de Melo
  2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-02-24  8:46 ` [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
  2016-02-24  8:46 ` [PATCH 15/15] perf mem: Add Intel DATALA memory events Jiri Olsa
  14 siblings, 2 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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 acc46ac26f73..a15e5020884d 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -253,3 +253,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 4c0263125f77..7f69bf9d789d 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -31,4 +31,6 @@ 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] 36+ messages in thread

* [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (12 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 13/15] perf script: Display data_src values Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  2016-02-24 15:59   ` Andi Kleen
  2016-02-24  8:46 ` [PATCH 15/15] perf mem: Add Intel DATALA memory events Jiri Olsa
  14 siblings, 1 reply; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index a7ec685657a5..199f645aedc1 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.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] 36+ messages in thread

* [PATCH 15/15] perf mem: Add Intel DATALA memory events
  2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
                   ` (13 preceding siblings ...)
  2016-02-24  8:46 ` [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
@ 2016-02-24  8:46 ` Jiri Olsa
  14 siblings, 0 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24  8:46 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
  ldlat-loads      : available
  ldlat-stores     : available
  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/builtin-mem.c     |  4 ++--
 tools/perf/util/mem-events.c | 19 +++++++++++++++++++
 tools/perf/util/mem-events.h | 19 +++++++++++++++++++
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 8a31b3f634d9..03c33c0b761b 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -40,9 +40,9 @@ 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, "%-13s%-*s%s\n",
+		fprintf(stderr, "%-17s%-*s%s\n",
 			e->tag,
-			verbose ? 25 : 0,
+			verbose ? 27 : 0,
 			verbose ? perf_mem_events__name(j) : "",
 			e->supported ? ": available" : "");
 	}
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index a15e5020884d..31e079a1ab7b 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -17,6 +17,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 7f69bf9d789d..939786ffab2a 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] 36+ messages in thread

* Re: [PATCH 03/15] perf mem: Add -l/--ldlat option
  2016-02-24  8:46 ` [PATCH 03/15] perf mem: Add -l/--ldlat option Jiri Olsa
@ 2016-02-24 13:14   ` Arnaldo Carvalho de Melo
  2016-02-24 19:16     ` Jiri Olsa
  0 siblings, 1 reply; 36+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-24 13:14 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Wed, Feb 24, 2016 at 09:46:44AM +0100, Jiri Olsa escreveu:
> 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

Please update the docs, also I think it is ok to leave it just as
--ldlat, not using the one letter -l, we can do that if this becomes
that frequently used.

- Arnaldo
 
> 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 88aeac9aa1da..9da09e058f4b 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 2a91b959de62..4ab437291589 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	[flat|nested] 36+ messages in thread

* Re: [PATCH 04/15] perf mem: Add -u/-k options
  2016-02-24  8:46 ` [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa
@ 2016-02-24 13:17   ` Arnaldo Carvalho de Melo
  2016-02-24 19:17     ` Jiri Olsa
  0 siblings, 1 reply; 36+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-24 13:17 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Wed, Feb 24, 2016 at 09:46:45AM +0100, Jiri Olsa escreveu:
> Add -u/-k (--all-user/--all-kernel) options to use
> the perf record --all-user/--all-kernel options.

Missing documentation update. -u/-k usage is ok, should be the same
accross all tools, have to check that... Actually make that -U and -K,
'perf top' needs fixing in making -U mean --hide_kernel_symbols , will do.

- Arnaldo
 
> 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 9da09e058f4b..8a31b3f634d9 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	[flat|nested] 36+ messages in thread

* Re: [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function
  2016-02-24  8:46 ` [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
@ 2016-02-24 13:18   ` Arnaldo Carvalho de Melo
  2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 0 replies; 36+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-24 13:18 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Wed, Feb 24, 2016 at 09:46:46AM +0100, Jiri Olsa escreveu:
> 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(-)

Applied, with minimal adjusts due to other patch not being applied.

- Arnaldo
 
> diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
> index 3772a3a8a6ee..08c35dd7e335 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;
>  
> @@ -98,3 +99,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 4ab437291589..b5067361a11c 100644
> --- a/tools/perf/util/mem-events.h
> +++ b/tools/perf/util/mem-events.h
> @@ -24,4 +24,7 @@ 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 5388f7940474..160df202c34f 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";
> @@ -829,53 +830,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	[flat|nested] 36+ messages in thread

* Re: [PATCH 13/15] perf script: Display data_src values
  2016-02-24  8:46 ` [PATCH 13/15] perf script: Display data_src values Jiri Olsa
@ 2016-02-24 13:34   ` Arnaldo Carvalho de Melo
  2016-02-24 19:18     ` Jiri Olsa
  2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 1 reply; 36+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-02-24 13:34 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Stephane Eranian, Andi Kleen

Em Wed, Feb 24, 2016 at 09:46:54AM +0100, Jiri Olsa escreveu:
> Adding support to display data_src values,
> for events with data_src data in sample.

While testing patches in this series I noticed this:

[root@jouet ~]# perf mem record -a
  Error: unknown switch `a'

 Usage: perf mem record [<options>] [<command>]
    or: perf mem record [<options>] -- <command> [<options>]

    -e, --event <event>   event selector. use 'perf mem record -e list' to list available events
    -v, --verbose         be more verbose (show counter open errors, etc)

[root@jouet ~]# perf mem record -- -a
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 3.149 MB perf.data (173 samples) ]

[root@jouet ~]#



Can't we imply the -- after 'record', i.e pass everything after 'record'
to the underlying 'perf record' call?

- Arnaldo

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

* Re: [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs
  2016-02-24  8:46 ` [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
@ 2016-02-24 15:59   ` Andi Kleen
  2016-02-24 18:54     ` Jiri Olsa
  0 siblings, 1 reply; 36+ messages in thread
From: Andi Kleen @ 2016-02-24 15:59 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, lkml, David Ahern, Ingo Molnar,
	Namhyung Kim, Peter Zijlstra, Stephane Eranian, sukadev

On Wed, Feb 24, 2016 at 09:46:55AM +0100, Jiri Olsa wrote:
> 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/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
> 
> diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
> index a7ec685657a5..199f645aedc1 100644
> --- a/arch/x86/events/intel/core.c
> +++ b/arch/x86/events/intel/core.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-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");

I don't think these are well enough defined for generic events. For example what does
hit-lfb mean generally? Snooping is also a fairly nebulous concept that can change
between micro architectures.

Instead of adding more and more badly defined and not really portable 
generic events I think it would be better to apply the patches that enable
the full Intel/POWER/other JSON event lists.

They have been posted multiple times by Sukadev and just need to be reviewed,
and would be a far better solution to this.

That would also make them "easy to use".

This would have the advantage that we actually have documentation 
what they actually mean in the SDM, and they map to the
documentation, and people can understand them without needing
to reverse engineer perf.

Also these events can have bugs (see e.g. the Haswell Server spec updates)
and if you can't look them up it can be hard to use.

-Andi

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

* Re: [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs
  2016-02-24 15:59   ` Andi Kleen
@ 2016-02-24 18:54     ` Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24 18:54 UTC (permalink / raw)
  To: Andi Kleen
  Cc: Jiri Olsa, Arnaldo Carvalho de Melo, lkml, David Ahern,
	Ingo Molnar, Namhyung Kim, Peter Zijlstra, Stephane Eranian,
	sukadev

On Wed, Feb 24, 2016 at 07:59:05AM -0800, Andi Kleen wrote:
> On Wed, Feb 24, 2016 at 09:46:55AM +0100, Jiri Olsa wrote:
> > 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/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 39 insertions(+)
> > 
> > diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
> > index a7ec685657a5..199f645aedc1 100644
> > --- a/arch/x86/events/intel/core.c
> > +++ b/arch/x86/events/intel/core.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-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");
> 
> I don't think these are well enough defined for generic events. For example what does
> hit-lfb mean generally? Snooping is also a fairly nebulous concept that can change
> between micro architectures.
> 
> Instead of adding more and more badly defined and not really portable 
> generic events I think it would be better to apply the patches that enable
> the full Intel/POWER/other JSON event lists.
> 
> They have been posted multiple times by Sukadev and just need to be reviewed,
> and would be a far better solution to this.
> 
> That would also make them "easy to use".
> 
> This would have the advantage that we actually have documentation 
> what they actually mean in the SDM, and they map to the
> documentation, and people can understand them without needing
> to reverse engineer perf.
> 
> Also these events can have bugs (see e.g. the Haswell Server spec updates)
> and if you can't look them up it can be hard to use.

right, I'll keep that only in my queue.. we discussed with Peter
and he said he'll try to check on JSON patchset state ;-)

thanks,
jirka

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

* Re: [PATCH 03/15] perf mem: Add -l/--ldlat option
  2016-02-24 13:14   ` Arnaldo Carvalho de Melo
@ 2016-02-24 19:16     ` Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24 19:16 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 Wed, Feb 24, 2016 at 10:14:27AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Feb 24, 2016 at 09:46:44AM +0100, Jiri Olsa escreveu:
> > 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
> 
> Please update the docs, also I think it is ok to leave it just as
> --ldlat, not using the one letter -l, we can do that if this becomes
> that frequently used.

ook, will do

thanks,
jirka

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

* Re: [PATCH 04/15] perf mem: Add -u/-k options
  2016-02-24 13:17   ` Arnaldo Carvalho de Melo
@ 2016-02-24 19:17     ` Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24 19:17 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 Wed, Feb 24, 2016 at 10:17:08AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Feb 24, 2016 at 09:46:45AM +0100, Jiri Olsa escreveu:
> > Add -u/-k (--all-user/--all-kernel) options to use
> > the perf record --all-user/--all-kernel options.
> 
> Missing documentation update. -u/-k usage is ok, should be the same
> accross all tools, have to check that... Actually make that -U and -K,
> 'perf top' needs fixing in making -U mean --hide_kernel_symbols , will do.

ok, so doc update and switch it into -U and -K

thanks,
jirka

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

* Re: [PATCH 13/15] perf script: Display data_src values
  2016-02-24 13:34   ` Arnaldo Carvalho de Melo
@ 2016-02-24 19:18     ` Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: Jiri Olsa @ 2016-02-24 19: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 Wed, Feb 24, 2016 at 10:34:28AM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Feb 24, 2016 at 09:46:54AM +0100, Jiri Olsa escreveu:
> > Adding support to display data_src values,
> > for events with data_src data in sample.
> 
> While testing patches in this series I noticed this:
> 
> [root@jouet ~]# perf mem record -a
>   Error: unknown switch `a'
> 
>  Usage: perf mem record [<options>] [<command>]
>     or: perf mem record [<options>] -- <command> [<options>]
> 
>     -e, --event <event>   event selector. use 'perf mem record -e list' to list available events
>     -v, --verbose         be more verbose (show counter open errors, etc)
> 
> [root@jouet ~]# perf mem record -- -a
> ^C[ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 3.149 MB perf.data (173 samples) ]
> 
> [root@jouet ~]#
> 
> 
> 
> Can't we imply the -- after 'record', i.e pass everything after 'record'
> to the underlying 'perf record' call?

I'll check on that, and try to have it in next version

jirka

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

* [tip:perf/core] perf mem record: Check for memory events support
  2016-02-24  8:46 ` [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa
@ 2016-02-25  7:36   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:36 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: mingo, eranian, ak, dsahern, hpa, linux-kernel, tglx, acme,
	a.p.zijlstra, jolsa, namhyung

Commit-ID:  54fbad54ebcde9db9c7459e9e379f2350c25e1f1
Gitweb:     http://git.kernel.org/tip/54fbad54ebcde9db9c7459e9e379f2350c25e1f1
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:42 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:10:59 -0300

perf mem record: Check for memory events support

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

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

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/1456303616-26926-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-mem.c     | 20 ++++++++++++++++----
 tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.h |  3 +++
 3 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index b3f8a89..f1fa7b8 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -40,10 +40,11 @@ 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",
-			e->tag, verbose ? "" : "\n");
-		if (verbose)
-			fprintf(stderr, " [%s]\n", e->name);
+		fprintf(stderr, "%-13s%-*s%s\n",
+			e->tag,
+			verbose ? 25 : 0,
+			verbose ? e->name : "",
+			e->supported ? ": available" : "");
 	}
 	exit(0);
 }
@@ -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 b1507c0..e21853f 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 2995bae..75c1660 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,5 +20,6 @@ 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 */

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

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

Commit-ID:  2ba7ac5814a6952aad647ce31696b893772cbe83
Gitweb:     http://git.kernel.org/tip/2ba7ac5814a6952aad647ce31696b893772cbe83
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:43 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:11:52 -0300

perf mem: Introduce perf_mem_events__name function

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

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

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/1456303616-26926-3-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-mem.c     | 6 +++---
 tools/perf/util/mem-events.c | 5 +++++
 tools/perf/util/mem-events.h | 1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index f1fa7b8..88aeac9 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -43,7 +43,7 @@ static int parse_record_events(const struct option *opt,
 		fprintf(stderr, "%-13s%-*s%s\n",
 			e->tag,
 			verbose ? 25 : 0,
-			verbose ? e->name : "",
+			verbose ? perf_mem_events__name(j) : "",
 			e->supported ? ": available" : "");
 	}
 	exit(0);
@@ -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 e21853f..2330db5 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 75c1660..2a91b95 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -22,4 +22,5 @@ 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 */

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

* [tip:perf/core] perf tools: Introduce perf_mem__tlb_scnprintf function
  2016-02-24  8:46 ` [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
  2016-02-24 13:18   ` Arnaldo Carvalho de Melo
@ 2016-02-25  7:37   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:37 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, mingo, eranian, tglx, ak, linux-kernel, dsahern, acme,
	a.p.zijlstra, jolsa, namhyung

Commit-ID:  0c877d759d3a62a01d75dc6de4a923a686bb285a
Gitweb:     http://git.kernel.org/tip/0c877d759d3a62a01d75dc6de4a923a686bb285a
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:46 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:20:08 -0300

perf tools: Introduce perf_mem__tlb_scnprintf function

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

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/1456303616-26926-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 2330db5..4be3eb7 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"
 
 #define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }
 
@@ -83,3 +84,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 2a91b95..d8fb8e1 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -23,4 +23,7 @@ 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 5388f79..160df20 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";
@@ -829,53 +830,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);
 }
 

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

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

Commit-ID:  071e9a1e12dceaec6f9d3ffe6e77ee68364166d6
Gitweb:     http://git.kernel.org/tip/071e9a1e12dceaec6f9d3ffe6e77ee68364166d6
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:47 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:20:28 -0300

perf tools: Introduce perf_mem__lvl_scnprintf function

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

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/1456303616-26926-7-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 4be3eb7..bddb121 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -130,3 +130,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 d8fb8e1..bd0d7f7 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -26,4 +26,5 @@ 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 160df20..d894759 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -858,60 +858,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);
 }
 

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

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

Commit-ID:  2c07af13dcd4d971578041b50598f1269b33e68a
Gitweb:     http://git.kernel.org/tip/2c07af13dcd4d971578041b50598f1269b33e68a
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:48 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:20:45 -0300

perf tools: Introduce perf_mem__snp_scnprintf function

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

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/1456303616-26926-8-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 bddb121..d03edc2 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -183,3 +183,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 bd0d7f7..6efdd6f 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -27,4 +27,5 @@ 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 d894759..2007c3b 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -886,41 +886,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);
 }
 

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

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

Commit-ID:  69a77275926ccd0c08fde103de52b59f18370f5a
Gitweb:     http://git.kernel.org/tip/69a77275926ccd0c08fde103de52b59f18370f5a
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:49 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:29:52 -0300

perf tools: Introduce perf_mem__lck_scnprintf function

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

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/1456303616-26926-9-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 d03edc2..9844e3e 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -217,3 +217,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 6efdd6f..99678b5 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -28,4 +28,6 @@ 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 2007c3b..4175b29 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -795,19 +795,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);
 }
 

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

* [tip:perf/core] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 ` [PATCH 09/15] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
@ 2016-02-25  7:38   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:38 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, namhyung, dsahern, tglx, acme, a.p.zijlstra, hpa,
	mingo, eranian, jolsa, ak

Commit-ID:  b1a5fbea3d69511e445b8d9efe6dc605edb508c8
Gitweb:     http://git.kernel.org/tip/b1a5fbea3d69511e445b8d9efe6dc605edb508c8
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:50 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:30:03 -0300

perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes

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

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/1456303616-26926-10-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 9844e3e..b58d32e 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -95,7 +95,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;
@@ -120,15 +120,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 99678b5..4141df6 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -25,7 +25,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);

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

* [tip:perf/core] perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 ` [PATCH 10/15] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
@ 2016-02-25  7:38   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:38 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: eranian, hpa, linux-kernel, namhyung, acme, dsahern, mingo,
	a.p.zijlstra, jolsa, ak, tglx

Commit-ID:  969075630e3abd1c740ac4f3183949cbf54b410d
Gitweb:     http://git.kernel.org/tip/969075630e3abd1c740ac4f3183949cbf54b410d
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:51 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:30:14 -0300

perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes

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

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/1456303616-26926-11-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 b58d32e..249250f 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -149,7 +149,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;
@@ -174,15 +174,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 4141df6..0467f67 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -26,7 +26,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);
 

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

* [tip:perf/core] perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 ` [PATCH 11/15] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
@ 2016-02-25  7:39   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, mingo, acme, eranian, ak, namhyung, dsahern, jolsa,
	a.p.zijlstra, linux-kernel, hpa

Commit-ID:  149d75076778d3b14e13b79d683b4f4fdd4fdb01
Gitweb:     http://git.kernel.org/tip/149d75076778d3b14e13b79d683b4f4fdd4fdb01
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:52 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:30:22 -0300

perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes

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

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/1456303616-26926-12-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 249250f..de981dd 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -194,7 +194,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;
@@ -212,12 +212,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 0467f67..84c79a4 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -27,7 +27,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 */

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

* [tip:perf/core] perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
  2016-02-24  8:46 ` [PATCH 12/15] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
@ 2016-02-25  7:39   ` tip-bot for Jiri Olsa
  0 siblings, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: dsahern, hpa, jolsa, mingo, namhyung, linux-kernel, a.p.zijlstra,
	eranian, acme, tglx, ak

Commit-ID:  8b0819c8a3c97279b815581b606407c0387cc26f
Gitweb:     http://git.kernel.org/tip/8b0819c8a3c97279b815581b606407c0387cc26f
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:53 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:31:03 -0300

perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes

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

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/1456303616-26926-13-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 de981dd..eadb83d 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -221,18 +221,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 84c79a4..87c44ff 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -28,6 +28,6 @@ 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 */

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

* [tip:perf/core] perf script: Display data_src values
  2016-02-24  8:46 ` [PATCH 13/15] perf script: Display data_src values Jiri Olsa
  2016-02-24 13:34   ` Arnaldo Carvalho de Melo
@ 2016-02-25  7:39   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 36+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-02-25  7:39 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: eranian, namhyung, tglx, dsahern, hpa, linux-kernel,
	a.p.zijlstra, acme, mingo, jolsa, ak

Commit-ID:  c19ac91245a2f8d26aafd7f23256f3b76314d5d4
Gitweb:     http://git.kernel.org/tip/c19ac91245a2f8d26aafd7f23256f3b76314d5d4
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Wed, 24 Feb 2016 09:46:54 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 24 Feb 2016 10:32:11 -0300

perf script: Display data_src values

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

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/1456303616-26926-14-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 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 f4caf48..8ff5ff0 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 eadb83d..75465f8 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -238,3 +238,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 87c44ff..5d6d930 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -30,4 +30,6 @@ 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 */

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

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

Thread overview: 36+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-24  8:46 [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa
2016-02-24  8:46 ` [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa
2016-02-25  7:36   ` [tip:perf/core] perf mem record: " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 02/15] perf mem: Introduce perf_mem_events__name function Jiri Olsa
2016-02-25  7:36   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 03/15] perf mem: Add -l/--ldlat option Jiri Olsa
2016-02-24 13:14   ` Arnaldo Carvalho de Melo
2016-02-24 19:16     ` Jiri Olsa
2016-02-24  8:46 ` [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa
2016-02-24 13:17   ` Arnaldo Carvalho de Melo
2016-02-24 19:17     ` Jiri Olsa
2016-02-24  8:46 ` [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
2016-02-24 13:18   ` Arnaldo Carvalho de Melo
2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 06/15] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
2016-02-25  7:37   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 08/15] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 09/15] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 10/15] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
2016-02-25  7:38   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 11/15] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 12/15] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 13/15] perf script: Display data_src values Jiri Olsa
2016-02-24 13:34   ` Arnaldo Carvalho de Melo
2016-02-24 19:18     ` Jiri Olsa
2016-02-25  7:39   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-24  8:46 ` [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
2016-02-24 15:59   ` Andi Kleen
2016-02-24 18:54     ` Jiri Olsa
2016-02-24  8:46 ` [PATCH 15/15] perf mem: Add Intel DATALA memory events 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.