Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1341663 > unrolled thread
| Started by | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| First post | 2016-02-24 09:50 +0100 |
| Last post | 2016-02-24 20:20 +0100 |
| Articles | 13 — 4 participants |
Back to article view | Back to linux.kernel
[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
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | tip-bot for Jiri Olsa <tipbot@zytor.com> |
|---|---|
| Date | 2016-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]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-02-24 14:40 +0100 |
| Subject | Re: [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]
| From | Jiri Olsa <jolsa@redhat.com> |
|---|---|
| Date | 2016-02-24 20:20 +0100 |
| Subject | Re: [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]
| From | tip-bot for Jiri Olsa <tipbot@zytor.com> |
|---|---|
| Date | 2016-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]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | tip-bot for Jiri Olsa <tipbot@zytor.com> |
|---|---|
| Date | 2016-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]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-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]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-02-24 14:20 +0100 |
| Subject | Re: [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]
| From | Jiri Olsa <jolsa@redhat.com> |
|---|---|
| Date | 2016-02-24 20:20 +0100 |
| Subject | Re: [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