Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1341663 > unrolled thread

[PATCHv2 00/15] perf tools: Several memory events updates

Started byJiri Olsa <jolsa@kernel.org>
First post2016-02-24 09:50 +0100
Last post2016-02-24 20:20 +0100
Articles 13 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCHv2 00/15] perf tools: Several memory events updates Jiri Olsa <jolsa@kernel.org> - 2016-02-24 09:50 +0100
    [PATCH 01/15] perf mem: Check for memory events support Jiri Olsa <jolsa@kernel.org> - 2016-02-24 09:50 +0100
      [tip:perf/core] perf mem record: Check for memory events support tip-bot for Jiri Olsa <tipbot@zytor.com> - 2016-02-25 08:40 +0100
    [PATCH 13/15] perf script: Display data_src values Jiri Olsa <jolsa@kernel.org> - 2016-02-24 09:50 +0100
      Re: [PATCH 13/15] perf script: Display data_src values Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-24 14:40 +0100
        Re: [PATCH 13/15] perf script: Display data_src values Jiri Olsa <jolsa@redhat.com> - 2016-02-24 20:20 +0100
      [tip:perf/core] perf script: Display data_src values tip-bot for Jiri Olsa <tipbot@zytor.com> - 2016-02-25 08:50 +0100
    [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa <jolsa@kernel.org> - 2016-02-24 09:50 +0100
      [tip:perf/core] perf tools: Introduce perf_mem__snp_scnprintf  function tip-bot for Jiri Olsa <tipbot@zytor.com> - 2016-02-25 08:40 +0100
    [PATCH 15/15] perf mem: Add Intel DATALA memory events Jiri Olsa <jolsa@kernel.org> - 2016-02-24 09:50 +0100
    [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa <jolsa@kernel.org> - 2016-02-24 10:00 +0100
      Re: [PATCH 04/15] perf mem: Add -u/-k options Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-24 14:20 +0100
        Re: [PATCH 04/15] perf mem: Add -u/-k options Jiri Olsa <jolsa@redhat.com> - 2016-02-24 20:20 +0100

#1341663 — [PATCHv2 00/15] perf tools: Several memory events updates

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 09:50 +0100
Subject[PATCHv2 00/15] perf tools: Several memory events updates
Message-ID<r5DiV-1S4-3@gated-at.bofh.it>
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(-)

[toc] | [next] | [standalone]


#1341666 — [PATCH 01/15] perf mem: Check for memory events support

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 09:50 +0100
Subject[PATCH 01/15] perf mem: Check for memory events support
Message-ID<r5DiW-1S4-35@gated-at.bofh.it>
In reply to#1341663
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

[toc] | [prev] | [next] | [standalone]


#1342901 — [tip:perf/core] perf mem record: Check for memory events support

Fromtip-bot for Jiri Olsa <tipbot@zytor.com>
Date2016-02-25 08:40 +0100
Subject[tip:perf/core] perf mem record: Check for memory events support
Message-ID<r5YGL-qv-45@gated-at.bofh.it>
In reply to#1341666
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 */

[toc] | [prev] | [next] | [standalone]


#1341668 — [PATCH 13/15] perf script: Display data_src values

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 09:50 +0100
Subject[PATCH 13/15] perf script: Display data_src values
Message-ID<r5DiW-1S4-39@gated-at.bofh.it>
In reply to#1341663
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

[toc] | [prev] | [next] | [standalone]


#1341995 — Re: [PATCH 13/15] perf script: Display data_src values

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-02-24 14:40 +0100
SubjectRe: [PATCH 13/15] perf script: Display data_src values
Message-ID<r5HPC-5eb-59@gated-at.bofh.it>
In reply to#1341668
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

[toc] | [prev] | [next] | [standalone]


#1342358 — Re: [PATCH 13/15] perf script: Display data_src values

FromJiri Olsa <jolsa@redhat.com>
Date2016-02-24 20:20 +0100
SubjectRe: [PATCH 13/15] perf script: Display data_src values
Message-ID<r5N8B-zJ-1@gated-at.bofh.it>
In reply to#1341995
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

[toc] | [prev] | [next] | [standalone]


#1342907 — [tip:perf/core] perf script: Display data_src values

Fromtip-bot for Jiri Olsa <tipbot@zytor.com>
Date2016-02-25 08:50 +0100
Subject[tip:perf/core] perf script: Display data_src values
Message-ID<r5YQq-um-9@gated-at.bofh.it>
In reply to#1341668
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 */

[toc] | [prev] | [next] | [standalone]


#1341669 — [PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 09:50 +0100
Subject[PATCH 07/15] perf tools: Introduce perf_mem__snp_scnprintf function
Message-ID<r5DiX-1S4-43@gated-at.bofh.it>
In reply to#1341663
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

[toc] | [prev] | [next] | [standalone]


#1342891 — [tip:perf/core] perf tools: Introduce perf_mem__snp_scnprintf function

Fromtip-bot for Jiri Olsa <tipbot@zytor.com>
Date2016-02-25 08:40 +0100
Subject[tip:perf/core] perf tools: Introduce perf_mem__snp_scnprintf function
Message-ID<r5YGK-qv-7@gated-at.bofh.it>
In reply to#1341669
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);
 }
 

[toc] | [prev] | [next] | [standalone]


#1341670 — [PATCH 15/15] perf mem: Add Intel DATALA memory events

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 09:50 +0100
Subject[PATCH 15/15] perf mem: Add Intel DATALA memory events
Message-ID<r5DiX-1S4-41@gated-at.bofh.it>
In reply to#1341663
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

[toc] | [prev] | [next] | [standalone]


#1341671 — [PATCH 04/15] perf mem: Add -u/-k options

FromJiri Olsa <jolsa@kernel.org>
Date2016-02-24 10:00 +0100
Subject[PATCH 04/15] perf mem: Add -u/-k options
Message-ID<r5DsC-1VT-7@gated-at.bofh.it>
In reply to#1341663
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

[toc] | [prev] | [next] | [standalone]


#1341951 — Re: [PATCH 04/15] perf mem: Add -u/-k options

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-02-24 14:20 +0100
SubjectRe: [PATCH 04/15] perf mem: Add -u/-k options
Message-ID<r5Hwe-543-7@gated-at.bofh.it>
In reply to#1341671
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

[toc] | [prev] | [next] | [standalone]


#1342363 — Re: [PATCH 04/15] perf mem: Add -u/-k options

FromJiri Olsa <jolsa@redhat.com>
Date2016-02-24 20:20 +0100
SubjectRe: [PATCH 04/15] perf mem: Add -u/-k options
Message-ID<r5N8C-zJ-19@gated-at.bofh.it>
In reply to#1341951
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web