Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1334248 > unrolled thread
| Started by | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| First post | 2016-02-15 09:40 +0100 |
| Last post | 2016-02-15 09:50 +0100 |
| Articles | 5 on this page of 25 — 5 participants |
Back to article view | Back to linux.kernel
[PATCH 00/23] perf tools: Several memory events updates Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 10/23] perf x86 intel: Add DATALA events into sysfs Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 11/23] perf mem: Add Intel DATALA memory events Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 09/23] perf mem: Add -u/-k options Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 06/23] perf mem: Check for memory events support Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-16 18:00 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Andi Kleen <ak@linux.intel.com> - 2016-02-17 04:20 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-17 15:30 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Andi Kleen <ak@linux.intel.com> - 2016-02-17 16:40 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa <jolsa@redhat.com> - 2016-02-17 15:40 +0100
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-17 16:00 +0100
[tip:perf/core] perf record: Add --all-user/--all-kernel options tip-bot for Jiri Olsa <tipbot@zytor.com> - 2016-02-20 12:40 +0100
[PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 23/23] perf script: Display data_src values Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 05/23] perf mem: Add -e record option Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:40 +0100
[PATCH 07/23] perf mem: Introduce perf_mem_events__name function Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:50 +0100
[PATCH 04/23] perf tools: Add monitored events array Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:50 +0100
[PATCH 02/23] perf tools: Make cl_address global Jiri Olsa <jolsa@kernel.org> - 2016-02-15 09:50 +0100
Page 2 of 2 — ← Prev page 1 [2]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-02-15 09:40 +0100 |
| Subject | [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function |
| Message-ID | <r2mRm-6Rc-57@gated-at.bofh.it> |
| In reply to | #1334248 |
Move meminfo's lvl display function into mem-events.c
object, so it could be reused later from script code.
Link: http://lkml.kernel.org/n/tip-ujrrar78msnlkbvrgujwc7z1@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/mem-events.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/mem-events.h | 1 +
tools/perf/util/sort.c | 50 +----------------------------------------
3 files changed, 55 insertions(+), 49 deletions(-)
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 68f6f8e4922a..f291f93ac11d 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -164,3 +164,56 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
if (miss)
strncat(out, " miss", sz - l);
}
+
+static const char * const mem_lvl[] = {
+ "N/A",
+ "HIT",
+ "MISS",
+ "L1",
+ "LFB",
+ "L2",
+ "L3",
+ "Local RAM",
+ "Remote RAM (1 hop)",
+ "Remote RAM (2 hops)",
+ "Remote Cache (1 hop)",
+ "Remote Cache (2 hops)",
+ "I/O",
+ "Uncached",
+};
+
+void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)
+{
+ size_t i, l = 0;
+ u64 m = PERF_MEM_LVL_NA;
+ u64 hit, miss;
+
+ if (mem_info)
+ m = mem_info->data_src.mem_lvl;
+
+ sz -= 1; /* -1 for null termination */
+ out[0] = '\0';
+
+ hit = m & PERF_MEM_LVL_HIT;
+ miss = m & PERF_MEM_LVL_MISS;
+
+ /* already taken care of */
+ m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
+
+ for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
+ if (!(m & 0x1))
+ continue;
+ if (l) {
+ strcat(out, " or ");
+ l += 4;
+ }
+ strncat(out, mem_lvl[i], sz - l);
+ l += strlen(mem_lvl[i]);
+ }
+ if (*out == '\0')
+ strcpy(out, "N/A");
+ if (hit)
+ strncat(out, " hit", sz - l);
+ if (miss)
+ strncat(out, " miss", sz - l);
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 1af23966e3fc..fc6d94fc96e8 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -46,5 +46,6 @@ char *perf_mem_events__name(int i);
struct mem_info;
void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
+void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);
#endif /* __PERF_MEM_EVENTS_H */
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index b7834a5a002d..c7b52f4987d8 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -863,60 +863,12 @@ sort__lvl_cmp(struct hist_entry *left, struct hist_entry *right)
return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl);
}
-static const char * const mem_lvl[] = {
- "N/A",
- "HIT",
- "MISS",
- "L1",
- "LFB",
- "L2",
- "L3",
- "Local RAM",
- "Remote RAM (1 hop)",
- "Remote RAM (2 hops)",
- "Remote Cache (1 hop)",
- "Remote Cache (2 hops)",
- "I/O",
- "Uncached",
-};
-
static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,
size_t size, unsigned int width)
{
char out[64];
- size_t sz = sizeof(out) - 1; /* -1 for null termination */
- size_t i, l = 0;
- u64 m = PERF_MEM_LVL_NA;
- u64 hit, miss;
-
- if (he->mem_info)
- m = he->mem_info->data_src.mem_lvl;
-
- out[0] = '\0';
-
- hit = m & PERF_MEM_LVL_HIT;
- miss = m & PERF_MEM_LVL_MISS;
-
- /* already taken care of */
- m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
-
- for (i = 0; m && i < ARRAY_SIZE(mem_lvl); i++, m >>= 1) {
- if (!(m & 0x1))
- continue;
- if (l) {
- strcat(out, " or ");
- l += 4;
- }
- strncat(out, mem_lvl[i], sz - l);
- l += strlen(mem_lvl[i]);
- }
- if (*out == '\0')
- strcpy(out, "N/A");
- if (hit)
- strncat(out, " hit", sz - l);
- if (miss)
- strncat(out, " miss", sz - l);
+ perf_mem__lvl_scnprintf(out, sizeof(out), he->mem_info);
return repsep_snprintf(bf, size, "%-*s", width, out);
}
--
2.4.3
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-02-15 09:40 +0100 |
| Subject | [PATCH 21/23] perf script: Add data_src and weight column definitions |
| Message-ID | <r2mRn-6Rc-63@gated-at.bofh.it> |
| In reply to | #1334248 |
Adding data_src and weight column definitions, so it's
displayed for related sample types.
Link: http://lkml.kernel.org/n/tip-d9d387o10v7ega0mbd4b2zpo@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-script.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index c691214d820f..b7f1e8e22dcf 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -58,6 +58,8 @@ enum perf_output_field {
PERF_OUTPUT_IREGS = 1U << 14,
PERF_OUTPUT_BRSTACK = 1U << 15,
PERF_OUTPUT_BRSTACKSYM = 1U << 16,
+ PERF_OUTPUT_DATA_SRC = 1U << 17,
+ PERF_OUTPUT_WEIGHT = 1U << 18,
};
struct output_option {
@@ -81,6 +83,8 @@ struct output_option {
{.str = "iregs", .field = PERF_OUTPUT_IREGS},
{.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
{.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
+ {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
+ {.str = "weight", .field = PERF_OUTPUT_WEIGHT},
};
/* default set to maintain compatibility with current format */
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
PERF_OUTPUT_ADDR, allow_user_set))
return -EINVAL;
+ if (PRINT_FIELD(DATA_SRC) &&
+ perf_evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC",
+ PERF_OUTPUT_DATA_SRC))
+ return -EINVAL;
+
+ if (PRINT_FIELD(WEIGHT) &&
+ perf_evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT",
+ PERF_OUTPUT_WEIGHT))
+ return -EINVAL;
+
if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
pr_err("Display of symbols requested but neither sample IP nor "
"sample address\nis selected. Hence, no addresses to convert "
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,
if (PRINT_FIELD(ADDR))
print_sample_addr(event, sample, thread, attr);
+ if (PRINT_FIELD(DATA_SRC))
+ printf("%16" PRIx64, sample->data_src);
+
+ if (PRINT_FIELD(WEIGHT))
+ printf("%16" PRIu64, sample->weight);
+
if (PRINT_FIELD(IP)) {
if (!symbol_conf.use_callchain)
printf(" ");
--
2.4.3
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-02-15 09:50 +0100 |
| Subject | [PATCH 07/23] perf mem: Introduce perf_mem_events__name function |
| Message-ID | <r2n10-6UV-3@gated-at.bofh.it> |
| In reply to | #1334248 |
Wrap perf_mem_events[].name into perf_mem_events__name
function so we could alter the events name if needed.
This will be handy when changing latency settings for
loads event in following patch.
Link: http://lkml.kernel.org/n/tip-76wibzfbjamxfu7vapizsszj@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-mem.c | 4 ++--
tools/perf/util/mem-events.c | 5 +++++
tools/perf/util/mem-events.h | 1 +
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index e64e0aa7ba0e..26b2f9e0b153 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -95,12 +95,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
if (!perf_mem_events[j].supported) {
pr_err("failed: event '%s' not supported\n",
- perf_mem_events[j].name);
+ perf_mem_events__name(j));
return -1;
}
rec_argv[i++] = "-e";
- rec_argv[i++] = perf_mem_events[j].name;
+ rec_argv[i++] = perf_mem_events__name(j);
};
for (j = 0; j < argc; j++, i++)
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index e21853fe1312..0f62e930de13 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -19,6 +19,11 @@ struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
#undef E
+char *perf_mem_events__name(int i)
+{
+ return (char *) perf_mem_events[i].name;
+}
+
int perf_mem_events__parse(const char *str)
{
char *tok, *saveptr = NULL;
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index b9a786346c03..23e3239dfa34 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -22,5 +22,6 @@ extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
int perf_mem_events__parse(const char *str);
int perf_mem_events__init(void);
+char *perf_mem_events__name(int i);
#endif /* __PERF_MEM_EVENTS_H */
--
2.4.3
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-02-15 09:50 +0100 |
| Subject | [PATCH 04/23] perf tools: Add monitored events array |
| Message-ID | <r2n11-6UV-23@gated-at.bofh.it> |
| In reply to | #1334248 |
It will ease up configuration of memory events
and addition of other memory events in following
patches.
Link: http://lkml.kernel.org/n/tip-5n4yyd6dlrjhpd9rmaa2sycs@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-mem.c | 17 +++++++++--------
tools/perf/util/Build | 1 +
tools/perf/util/mem-events.c | 10 ++++++++++
tools/perf/util/mem-events.h | 20 ++++++++++++++++++++
4 files changed, 40 insertions(+), 8 deletions(-)
create mode 100644 tools/perf/util/mem-events.c
create mode 100644 tools/perf/util/mem-events.h
diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 390170041696..36c56a4b778b 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -6,6 +6,7 @@
#include "util/tool.h"
#include "util/session.h"
#include "util/data.h"
+#include "util/mem-events.h"
#define MEM_OPERATION_LOAD 0x1
#define MEM_OPERATION_STORE 0x2
@@ -34,20 +35,20 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
rec_argv[i++] = "record";
- if (mem->operation & MEM_OPERATION_LOAD)
+ if (mem->operation & MEM_OPERATION_LOAD) {
+ perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
rec_argv[i++] = "-W";
+ }
rec_argv[i++] = "-d";
- if (mem->operation & MEM_OPERATION_LOAD) {
- rec_argv[i++] = "-e";
- rec_argv[i++] = "cpu/mem-loads/pp";
- }
+ for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+ if (!perf_mem_events[j].record)
+ continue;
- if (mem->operation & MEM_OPERATION_STORE) {
rec_argv[i++] = "-e";
- rec_argv[i++] = "cpu/mem-stores/pp";
- }
+ rec_argv[i++] = perf_mem_events[j].name;
+ };
for (j = 1; j < argc; j++, i++)
rec_argv[i] = argv[j];
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index a34752d28488..df2b690970ac 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -82,6 +82,7 @@ libperf-y += parse-branch-options.o
libperf-y += parse-regs-options.o
libperf-y += term.o
libperf-y += help-unknown-cmd.o
+libperf-y += mem-events.o
libperf-$(CONFIG_LIBBPF) += bpf-loader.o
libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
new file mode 100644
index 000000000000..c6ba0a19ec9a
--- /dev/null
+++ b/tools/perf/util/mem-events.c
@@ -0,0 +1,10 @@
+#include "mem-events.h"
+
+#define E(n) { .name = n }
+
+struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
+ E("cpu/mem-loads,ldlat=30/P"),
+ E("cpu/mem-stores/P"),
+};
+
+#undef E
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
new file mode 100644
index 000000000000..ee5fde222389
--- /dev/null
+++ b/tools/perf/util/mem-events.h
@@ -0,0 +1,20 @@
+#ifndef __PERF_MEM_EVENTS_H
+#define __PERF_MEM_EVENTS_H
+
+#include <stdbool.h>
+
+struct perf_mem_event {
+ bool record;
+ const char *name;
+};
+
+enum {
+ PERF_MEM_EVENTS__LOAD,
+ PERF_MEM_EVENTS__STORE,
+ PERF_MEM_EVENTS__MAX,
+};
+
+extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
+
+#endif /* __PERF_MEM_EVENTS_H */
+
--
2.4.3
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2016-02-15 09:50 +0100 |
| Subject | [PATCH 02/23] perf tools: Make cl_address global |
| Message-ID | <r2n11-6UV-27@gated-at.bofh.it> |
| In reply to | #1334248 |
It'll be used in following patches.
Link: http://lkml.kernel.org/n/tip-up22drulx98h0nskjtpngr5s@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/sort.c | 6 ------
tools/perf/util/sort.h | 5 +++++
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index de715756f281..3305149326bb 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1020,12 +1020,6 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,
return repsep_snprintf(bf, size, "%-*s", width, out);
}
-static inline u64 cl_address(u64 address)
-{
- /* return the cacheline of the address */
- return (address & ~(cacheline_size - 1));
-}
-
static int64_t
sort__dcacheline_cmp(struct hist_entry *left, struct hist_entry *right)
{
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 89a1273fd2da..46f159f9d947 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -162,6 +162,11 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he)
return period * 100.0 / total_period;
}
+static inline u64 cl_address(u64 address)
+{
+ /* return the cacheline of the address */
+ return (address & ~(cacheline_size - 1));
+}
enum sort_mode {
SORT_MODE__NORMAL,
--
2.4.3
[toc] | [prev] | [standalone]
Page 2 of 2 — ← Prev page 1 [2]
Back to top | Article view | linux.kernel
csiph-web