Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1255435 > unrolled thread
| Started by | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| First post | 2015-10-25 16:00 +0100 |
| Last post | 2015-10-27 15:50 +0100 |
| Articles | 20 on this page of 64 — 5 participants |
Back to article view | Back to linux.kernel
[PATCHv5 00/52] perf stat: Add scripting support Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 22/52] perf tools: Add event_update event scale type Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 04/52] perf tools: Add thread_map event sythesize function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 43/52] perf stat report: Process event update events Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 12/52] perf tools: Add stat config event synthesize function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 52/52] perf script: Add stat-cpi.py script Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 45/52] perf stat report: Allow to override aggr_mode Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 49/52] perf script: Add stat default handlers Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 39/52] perf stat report: Process cpu/threads maps Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 26/52] perf report: Display newly added events in raw dump Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 18/52] perf tools: Add stat round event synthesize function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 06/52] perf tools: Add perf_event__fprintf_thread_map function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 47/52] perf script: Process stat config event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 02/52] perf stat: Cache aggregated map entries in extra cpumap Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[tip:perf/core] perf stat: Cache aggregated map entries in extra cpumap tip-bot for Jiri Olsa <tipbot@zytor.com> - 2015-10-29 10:50 +0100
[PATCH 16/52] perf tools: Add stat event read function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 38/52] perf stat report: Add report command Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 34/52] perf stat record: Write stat events on record Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 44/52] perf stat report: Move csv_sep initialization before report command Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 05/52] perf tools: Add thread_map__new_event function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 08/52] perf tools: Add cpu_map event synthesize function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 14/52] perf tools: Add stat event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:00 +0100
[PATCH 27/52] perf tools: Introduce stat feature Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 17/52] perf tools: Add stat round event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 25/52] perf tools: Add perf_event__fprintf_event_update function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 11/52] perf tools: Add stat config event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
Re: [PATCH 11/52] perf tools: Add stat config event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 14:20 +0100
Re: [PATCH 11/52] perf tools: Add stat config event Jiri Olsa <jolsa@redhat.com> - 2015-10-27 14:40 +0100
Re: [PATCH 11/52] perf tools: Add stat config event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 14:50 +0100
Re: [PATCH 11/52] perf tools: Add stat config event Jiri Olsa <jolsa@redhat.com> - 2015-10-27 15:00 +0100
Re: [PATCH 11/52] perf tools: Add stat config event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 15:20 +0100
[PATCH 13/52] perf tools: Add stat config event read function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 28/52] perf tools: Move id_offset out of struct perf_evsel union Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[tip:perf/core] perf evsel: Move id_offset out of struct perf_evsel union member tip-bot for Jiri Olsa <tipbot@zytor.com> - 2015-10-29 10:50 +0100
[PATCH 15/52] perf tools: Add stat event synthesize function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 35/52] perf stat record: Write stat round events on record Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 24/52] perf tools: Add event_update event cpus type Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 21/52] perf tools: Add event_update event unit type Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 31/52] perf stat record: Synthesize stat record data Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
Re: [PATCH 31/52] perf stat record: Synthesize stat record data Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 15:50 +0100
Re: [PATCH 31/52] perf stat record: Synthesize stat record data Jiri Olsa <jolsa@redhat.com> - 2015-10-28 13:20 +0100
Re: [PATCH 31/52] perf stat record: Synthesize stat record data Jiri Olsa <jolsa@redhat.com> - 2015-10-28 14:10 +0100
Re: [PATCH 31/52] perf stat record: Synthesize stat record data Jiri Olsa <jolsa@redhat.com> - 2015-10-28 14:10 +0100
[PATCH 36/52] perf stat record: Do not allow record with multiple runs mode Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 19/52] perf tools: Add stat events fprintf functions Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 40/52] perf stat report: Process stat config event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 41/52] perf stat report: Add support to initialize aggr_map from file Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 33/52] perf stat record: Add pipe support for record command Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 30/52] perf stat record: Initialize record features Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 23/52] perf tools: Add event_update event name type Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 37/52] perf stat record: Synthesize event update events Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:10 +0100
[PATCH 09/52] perf tools: Add cpu_map__new_event function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:20 +0100
[PATCH 03/52] perf tools: Add thread_map event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:20 +0100
Re: [PATCH 03/52] perf tools: Add thread_map event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 18:50 +0100
Re: [PATCH 03/52] perf tools: Add thread_map event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 18:50 +0100
Re: [PATCH 03/52] perf tools: Add thread_map event Jiri Olsa <jolsa@redhat.com> - 2015-10-26 19:00 +0100
Re: [PATCH 03/52] perf tools: Add thread_map event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 19:00 +0100
Re: [PATCH 03/52] perf tools: Add thread_map event Jiri Olsa <jolsa@redhat.com> - 2015-10-26 18:50 +0100
[PATCH 07/52] perf tools: Add cpu_map event Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:20 +0100
[PATCH 01/52] perf cpu_map: Add cpu_map__empty_new function Jiri Olsa <jolsa@kernel.org> - 2015-10-25 16:20 +0100
[tip:perf/core] perf cpu_map: Add cpu_map__empty_new function tip-bot for Jiri Olsa <tipbot@zytor.com> - 2015-10-29 10:50 +0100
Re: [PATCHv5 00/52] perf stat: Add scripting support Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 18:40 +0100
RE: [PATCHv5 00/52] perf stat: Add scripting support "Liang, Kan" <kan.liang@intel.com> - 2015-10-27 15:30 +0100
Re: [PATCHv5 00/52] perf stat: Add scripting support Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 15:50 +0100
Page 2 of 4 — ← Prev page 1 [2] 3 4 Next page →
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:00 +0100 |
| Subject | [PATCH 08/52] perf tools: Add cpu_map event synthesize function |
| Message-ID | <qnuW9-4fF-115@gated-at.bofh.it> |
| In reply to | #1255435 |
Introduce perf_event__synthesize_cpu_map function to
synthesize struct cpu_map.
Added generic interface:
cpu_map_data__alloc
cpu_map_data__synthesize
to make the cpu_map synthesizing usable for other events.
Link: http://lkml.kernel.org/n/tip-miidn8vqsx3udu4ct8103v5f@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 ++
tools/perf/tests/cpumap.c | 71 ++++++++++++++++++++++
tools/perf/tests/tests.h | 1 +
tools/perf/util/event.c | 131 ++++++++++++++++++++++++++++++++++++++++
tools/perf/util/event.h | 8 +++
6 files changed, 216 insertions(+)
create mode 100644 tools/perf/tests/cpumap.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 50de2253cff6..1c0296fc95ea 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -33,6 +33,7 @@ perf-y += kmod-path.o
perf-y += thread-map.o
perf-y += llvm.o
perf-y += topology.o
+perf-y += cpumap.o
ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64))
perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index a59fd320da64..bdccd27868ba 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -170,6 +170,10 @@ static struct test generic_tests[] = {
.func = test__thread_map_synthesize,
},
{
+ .desc = "Test cpu map synthesize",
+ .func = test__cpu_map_synthesize,
+ },
+ {
.func = NULL,
},
};
diff --git a/tools/perf/tests/cpumap.c b/tools/perf/tests/cpumap.c
new file mode 100644
index 000000000000..dc923ec7688f
--- /dev/null
+++ b/tools/perf/tests/cpumap.c
@@ -0,0 +1,71 @@
+#include "tests.h"
+#include "cpumap.h"
+
+static int process_event_mask(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ struct cpu_map_event *map = &event->cpu_map;
+ struct cpu_map_data_mask *mask;
+ struct cpu_map_data *data;
+ int i;
+
+ data = &map->data;
+
+ TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK);
+
+ mask = (struct cpu_map_data_mask *) data->data;
+
+ TEST_ASSERT_VAL("wrong nr", mask->nr == 1);
+
+ for (i = 0; i < 20; i++) {
+ TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask));
+ }
+
+ return 0;
+}
+
+static int process_event_cpus(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ struct cpu_map_event *map = &event->cpu_map;
+ struct cpu_map_data_cpus *cpus;
+ struct cpu_map_data *data;
+
+ data = &map->data;
+
+ TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS);
+
+ cpus = (struct cpu_map_data_cpus *) data->data;
+
+ TEST_ASSERT_VAL("wrong nr", cpus->nr == 2);
+ TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1);
+ TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256);
+ return 0;
+}
+
+
+int test__cpu_map_synthesize(void)
+{
+ struct cpu_map *cpus;
+
+ /* This one is better stores in mask. */
+ cpus = cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19");
+
+ TEST_ASSERT_VAL("failed to synthesize map",
+ !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL));
+
+ cpu_map__put(cpus);
+
+ /* This one is better stores in cpu values. */
+ cpus = cpu_map__new("1,256");
+
+ TEST_ASSERT_VAL("failed to synthesize map",
+ !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL));
+
+ cpu_map__put(cpus);
+ return 0;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 2e280a5cd579..c7f3c3211bcf 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -68,6 +68,7 @@ int test__thread_map(void);
int test__llvm(void);
int test_session_topology(void);
int test__thread_map_synthesize(void);
+int test__cpu_map_synthesize(void);
#if defined(__arm__) || defined(__aarch64__)
#ifdef HAVE_DWARF_UNWIND_SUPPORT
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index c05f4b036069..a04bdabb7ae9 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -737,6 +737,137 @@ int perf_event__synthesize_thread_map2(struct perf_tool *tool,
return err;
}
+static void synthesize_cpus(struct cpu_map_data_cpus *cpus,
+ struct cpu_map *map)
+{
+ int i;
+
+ cpus->nr = map->nr;
+
+ for (i = 0; i < map->nr; i++)
+ cpus->cpu[i] = map->map[i];
+}
+
+static void synthesize_mask(struct cpu_map_data_mask *mask,
+ struct cpu_map *map, int max)
+{
+ int i;
+
+ mask->nr = BITS_TO_LONGS(max);
+ mask->long_size = sizeof(long);
+
+ for (i = 0; i < map->nr; i++)
+ set_bit(map->map[i], mask->mask);
+}
+
+static size_t cpus_size(struct cpu_map *map)
+{
+ return sizeof(struct cpu_map_data_cpus) + map->nr * sizeof(u16);
+}
+
+static size_t mask_size(struct cpu_map *map, int *max)
+{
+ int i;
+
+ *max = 0;
+
+ for (i = 0; i < map->nr; i++) {
+ /* bit possition of the cpu is + 1 */
+ int bit = map->map[i] + 1;
+
+ if (bit > *max)
+ *max = bit;
+ }
+
+ return sizeof(struct cpu_map_data_mask) + BITS_TO_LONGS(*max) * sizeof(long);
+}
+
+void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max)
+{
+ size_t size_cpus, size_mask;
+ bool is_dummy = cpu_map__empty(map);
+
+ /*
+ * Both array and mask data have variable size based
+ * on the number of cpus and their actual values.
+ * The size of the 'struct cpu_map_data' is:
+ *
+ * array = size of 'struct cpu_map_data_cpus' +
+ * number of cpus * sizeof(u64)
+ *
+ * mask = size of 'struct cpu_map_data_mask' +
+ * maximum cpu bit converted to size of longs
+ *
+ * and finaly + the size of 'struct cpu_map_data'.
+ */
+ size_cpus = cpus_size(map);
+ size_mask = mask_size(map, max);
+
+ if (is_dummy || (size_cpus < size_mask)) {
+ *size += size_cpus;
+ *type = PERF_CPU_MAP__CPUS;
+ } else {
+ *size += size_mask;
+ *type = PERF_CPU_MAP__MASK;
+ }
+
+ *size += sizeof(struct cpu_map_data);
+ return zalloc(*size);
+}
+
+void cpu_map_data__synthesize(struct cpu_map_data *data, struct cpu_map *map,
+ u16 type, int max)
+{
+ data->type = type;
+
+ switch (type) {
+ case PERF_CPU_MAP__CPUS:
+ synthesize_cpus((struct cpu_map_data_cpus *) data->data, map);
+ break;
+ case PERF_CPU_MAP__MASK:
+ synthesize_mask((struct cpu_map_data_mask *) data->data, map, max);
+ default:
+ break;
+ };
+}
+
+static struct cpu_map_event* cpu_map_event__new(struct cpu_map *map)
+{
+ size_t size = sizeof(struct cpu_map_event);
+ struct cpu_map_event *event;
+ int max;
+ u16 type;
+
+ event = cpu_map_data__alloc(map, &size, &type, &max);
+ if (!event)
+ return NULL;
+
+ event->header.type = PERF_RECORD_CPU_MAP;
+ event->header.size = size;
+ event->data.type = type;
+
+ cpu_map_data__synthesize(&event->data, map, type, max);
+ return event;
+}
+
+int perf_event__synthesize_cpu_map(struct perf_tool *tool,
+ struct cpu_map *map,
+ perf_event__handler_t process,
+ struct machine *machine)
+{
+ struct cpu_map_event *event;
+ int err;
+
+ event = cpu_map_event__new(map);
+ if (!event)
+ return -ENOMEM;
+
+ err = process(tool, (union perf_event *) event, NULL, machine);
+
+ free(event);
+ return err;
+}
+
size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
{
const char *s;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 4df6f9c60406..5f5560d039d7 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -425,6 +425,7 @@ void perf_event__print_totals(void);
struct perf_tool;
struct thread_map;
+struct cpu_map;
typedef int (*perf_event__handler_t)(struct perf_tool *tool,
union perf_event *event,
@@ -440,6 +441,10 @@ int perf_event__synthesize_thread_map2(struct perf_tool *tool,
struct thread_map *threads,
perf_event__handler_t process,
struct machine *machine);
+int perf_event__synthesize_cpu_map(struct perf_tool *tool,
+ struct cpu_map *cpus,
+ perf_event__handler_t process,
+ struct machine *machine);
int perf_event__synthesize_threads(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine, bool mmap_data,
@@ -550,4 +555,7 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp);
u64 kallsyms__get_function_start(const char *kallsyms_filename,
const char *symbol_name);
+void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max);
+void cpu_map_data__synthesize(struct cpu_map_data *data, struct cpu_map *map,
+ u16 type, int max);
#endif /* __PERF_RECORD_H */
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:00 +0100 |
| Subject | [PATCH 14/52] perf tools: Add stat event |
| Message-ID | <qnuW9-4fF-109@gated-at.bofh.it> |
| In reply to | #1255435 |
Adding stat event to store 'struct perf_counter_values' for
given event/cpu/thread.
Link: http://lkml.kernel.org/n/tip-56xpt7m6au4d8u39nffoqgx1@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/event.c | 1 +
tools/perf/util/event.h | 19 +++++++++++++++++++
tools/perf/util/session.c | 25 +++++++++++++++++++++++++
tools/perf/util/tool.h | 3 ++-
4 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 381e0b0bcc8d..dfff3db6077f 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -42,6 +42,7 @@ static const char *perf_event__names[] = {
[PERF_RECORD_THREAD_MAP] = "THREAD_MAP",
[PERF_RECORD_CPU_MAP] = "CPU_MAP",
[PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
+ [PERF_RECORD_STAT] = "STAT",
};
const char *perf_event__name(unsigned int id)
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index a9debe60c42b..91a05c8328d7 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -229,6 +229,7 @@ enum perf_user_event_type { /* above any possible kernel type */
PERF_RECORD_THREAD_MAP = 73,
PERF_RECORD_CPU_MAP = 74,
PERF_RECORD_STAT_CONFIG = 75,
+ PERF_RECORD_STAT = 76,
PERF_RECORD_HEADER_MAX
};
@@ -414,6 +415,23 @@ struct stat_config_event {
struct stat_config_term_event data[];
};
+struct stat_event {
+ struct perf_event_header header;
+
+ u64 id;
+ u32 cpu;
+ u32 thread;
+
+ union {
+ struct {
+ u64 val;
+ u64 ena;
+ u64 run;
+ };
+ u64 values[3];
+ };
+};
+
union perf_event {
struct perf_event_header header;
struct mmap_event mmap;
@@ -439,6 +457,7 @@ union perf_event {
struct thread_map_event thread_map;
struct cpu_map_event cpu_map;
struct stat_config_event stat_config;
+ struct stat_event stat;
};
void perf_event__print_totals(void);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index a550464925ea..d165674500e2 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -324,6 +324,15 @@ int process_event_stat_config_stub(struct perf_tool *tool __maybe_unused,
return 0;
}
+static int process_stat_stub(struct perf_tool *tool __maybe_unused,
+ union perf_event *event __maybe_unused,
+ struct perf_session *perf_session
+ __maybe_unused)
+{
+ dump_printf(": unhandled!\n");
+ return 0;
+}
+
void perf_tool__fill_defaults(struct perf_tool *tool)
{
if (tool->sample == NULL)
@@ -380,6 +389,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
tool->cpu_map = process_event_cpu_map_stub;
if (tool->stat_config == NULL)
tool->stat_config = process_event_stat_config_stub;
+ if (tool->stat == NULL)
+ tool->stat = process_stat_stub;
}
static void swap_sample_id_all(union perf_event *event, void *data)
@@ -707,6 +718,17 @@ static void perf_event__stat_config_swap(union perf_event *event,
mem_bswap_64(&event->stat_config.nr, size);
}
+static void perf_event__stat_swap(union perf_event *event,
+ bool sample_id_all __maybe_unused)
+{
+ event->stat.id = bswap_64(event->stat.id);
+ event->stat.thread = bswap_32(event->stat.thread);
+ event->stat.cpu = bswap_32(event->stat.cpu);
+ event->stat.val = bswap_64(event->stat.val);
+ event->stat.ena = bswap_64(event->stat.ena);
+ event->stat.run = bswap_64(event->stat.run);
+}
+
typedef void (*perf_event__swap_op)(union perf_event *event,
bool sample_id_all);
@@ -737,6 +759,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
[PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
[PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
[PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
+ [PERF_RECORD_STAT] = perf_event__stat_swap,
[PERF_RECORD_HEADER_MAX] = NULL,
};
@@ -1279,6 +1302,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
return tool->cpu_map(tool, event, session);
case PERF_RECORD_STAT_CONFIG:
return tool->stat_config(tool, event, session);
+ case PERF_RECORD_STAT:
+ return tool->stat(tool, event, session);
default:
return -EINVAL;
}
diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
index aa7ae73d76b4..f0b9da0c166a 100644
--- a/tools/perf/util/tool.h
+++ b/tools/perf/util/tool.h
@@ -58,7 +58,8 @@ struct perf_tool {
auxtrace_error,
thread_map,
cpu_map,
- stat_config;
+ stat_config,
+ stat;
event_op3 auxtrace;
bool ordered_events;
bool ordering_requires_timestamps;
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 27/52] perf tools: Introduce stat feature |
| Message-ID | <qnv5L-4yj-1@gated-at.bofh.it> |
| In reply to | #1255435 |
Introducing stat feature to mark perf.data as created by
perf stat record command. It contains no data.
It's needed for report tools (report/script) to differentiate
sampling data from stat data, because they need to be treated
in a different way.
In future it might be used to store version of the stat
storage system we used.
Link: http://lkml.kernel.org/n/tip-56xpt7m6au4d8u39nffoqgx1@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-record.c | 2 ++
tools/perf/util/header.c | 14 ++++++++++++++
tools/perf/util/header.h | 1 +
3 files changed, 17 insertions(+)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2740d7a82ae8..6f0421b3acaf 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -451,6 +451,8 @@ static void record__init_features(struct record *rec)
if (!rec->opts.full_auxtrace)
perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
+
+ perf_header__clear_feat(&session->header, HEADER_STAT);
}
static volatile int workload_exec_errno;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 00582be5f717..b2c4fe34d19f 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -868,6 +868,13 @@ static int write_auxtrace(int fd, struct perf_header *h,
return err;
}
+static int write_stat(int fd __maybe_unused,
+ struct perf_header *h __maybe_unused,
+ struct perf_evlist *evlist __maybe_unused)
+{
+ return 0;
+}
+
static void print_hostname(struct perf_header *ph, int fd __maybe_unused,
FILE *fp)
{
@@ -1159,6 +1166,12 @@ static void print_auxtrace(struct perf_header *ph __maybe_unused,
fprintf(fp, "# contains AUX area data (e.g. instruction trace)\n");
}
+static void print_stat(struct perf_header *ph __maybe_unused,
+ int fd __maybe_unused, FILE *fp)
+{
+ fprintf(fp, "# contains stat data\n");
+}
+
static void print_pmu_mappings(struct perf_header *ph, int fd __maybe_unused,
FILE *fp)
{
@@ -1948,6 +1961,7 @@ static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
FEAT_OPP(HEADER_PMU_MAPPINGS, pmu_mappings),
FEAT_OPP(HEADER_GROUP_DESC, group_desc),
FEAT_OPP(HEADER_AUXTRACE, auxtrace),
+ FEAT_OPA(HEADER_STAT, stat),
};
struct header_print_data {
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 710deecf8f80..cff9892452ee 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -31,6 +31,7 @@ enum {
HEADER_PMU_MAPPINGS,
HEADER_GROUP_DESC,
HEADER_AUXTRACE,
+ HEADER_STAT,
HEADER_LAST_FEATURE,
HEADER_FEAT_BITS = 256,
};
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 17/52] perf tools: Add stat round event |
| Message-ID | <qnv5L-4yj-3@gated-at.bofh.it> |
| In reply to | #1255435 |
Adding stat round event to be stored after each stat interval round,
so report tools (report/script) get notified and process interval
data.
Link: http://lkml.kernel.org/n/tip-nqhzuxrv12ulccx11k7x86mr@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/event.c | 1 +
tools/perf/util/event.h | 13 +++++++++++++
tools/perf/util/session.c | 21 +++++++++++++++++++++
tools/perf/util/tool.h | 3 ++-
4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index ebbfdc1c1d3b..164d13c88c0e 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -43,6 +43,7 @@ static const char *perf_event__names[] = {
[PERF_RECORD_CPU_MAP] = "CPU_MAP",
[PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
[PERF_RECORD_STAT] = "STAT",
+ [PERF_RECORD_STAT_ROUND] = "STAT_ROUND",
};
const char *perf_event__name(unsigned int id)
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 1799b06e3fac..7e8427dfb59e 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -230,6 +230,7 @@ enum perf_user_event_type { /* above any possible kernel type */
PERF_RECORD_CPU_MAP = 74,
PERF_RECORD_STAT_CONFIG = 75,
PERF_RECORD_STAT = 76,
+ PERF_RECORD_STAT_ROUND = 77,
PERF_RECORD_HEADER_MAX
};
@@ -432,6 +433,17 @@ struct stat_event {
};
};
+enum {
+ PERF_STAT_ROUND_TYPE__INTERVAL = 0,
+ PERF_STAT_ROUND_TYPE__FINAL = 1,
+};
+
+struct stat_round_event {
+ struct perf_event_header header;
+ u64 type;
+ u64 time;
+};
+
union perf_event {
struct perf_event_header header;
struct mmap_event mmap;
@@ -458,6 +470,7 @@ union perf_event {
struct cpu_map_event cpu_map;
struct stat_config_event stat_config;
struct stat_event stat;
+ struct stat_round_event stat_round;
};
void perf_event__print_totals(void);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index d165674500e2..c6c28194d65b 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -333,6 +333,15 @@ static int process_stat_stub(struct perf_tool *tool __maybe_unused,
return 0;
}
+static int process_stat_round_stub(struct perf_tool *tool __maybe_unused,
+ union perf_event *event __maybe_unused,
+ struct perf_session *perf_session
+ __maybe_unused)
+{
+ dump_printf(": unhandled!\n");
+ return 0;
+}
+
void perf_tool__fill_defaults(struct perf_tool *tool)
{
if (tool->sample == NULL)
@@ -391,6 +400,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
tool->stat_config = process_event_stat_config_stub;
if (tool->stat == NULL)
tool->stat = process_stat_stub;
+ if (tool->stat_round == NULL)
+ tool->stat_round = process_stat_round_stub;
}
static void swap_sample_id_all(union perf_event *event, void *data)
@@ -729,6 +740,13 @@ static void perf_event__stat_swap(union perf_event *event,
event->stat.run = bswap_64(event->stat.run);
}
+static void perf_event__stat_round_swap(union perf_event *event,
+ bool sample_id_all __maybe_unused)
+{
+ event->stat_round.type = bswap_64(event->stat_round.type);
+ event->stat_round.time = bswap_64(event->stat_round.time);
+}
+
typedef void (*perf_event__swap_op)(union perf_event *event,
bool sample_id_all);
@@ -760,6 +778,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
[PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
[PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
[PERF_RECORD_STAT] = perf_event__stat_swap,
+ [PERF_RECORD_STAT_ROUND] = perf_event__stat_round_swap,
[PERF_RECORD_HEADER_MAX] = NULL,
};
@@ -1304,6 +1323,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
return tool->stat_config(tool, event, session);
case PERF_RECORD_STAT:
return tool->stat(tool, event, session);
+ case PERF_RECORD_STAT_ROUND:
+ return tool->stat_round(tool, event, session);
default:
return -EINVAL;
}
diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
index f0b9da0c166a..d04d9e5f444a 100644
--- a/tools/perf/util/tool.h
+++ b/tools/perf/util/tool.h
@@ -59,7 +59,8 @@ struct perf_tool {
thread_map,
cpu_map,
stat_config,
- stat;
+ stat,
+ stat_round;
event_op3 auxtrace;
bool ordered_events;
bool ordering_requires_timestamps;
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 25/52] perf tools: Add perf_event__fprintf_event_update function |
| Message-ID | <qnv5L-4yj-5@gated-at.bofh.it> |
| In reply to | #1255435 |
To display 'event update' event for raw dump.
Link: http://lkml.kernel.org/n/tip-ch2nor544486ppvwscqg55ik@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/header.c | 38 ++++++++++++++++++++++++++++++++++++++
tools/perf/util/header.h | 1 +
2 files changed, 39 insertions(+)
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index e4cb510aa246..00582be5f717 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2793,6 +2793,44 @@ perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
return err;
}
+size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp)
+{
+ struct event_update_event *ev = &event->event_update;
+ struct event_update_event_scale *ev_scale;
+ struct event_update_event_cpus *ev_cpus;
+ struct cpu_map *map;
+ size_t ret;
+
+ ret = fprintf(fp, "\n... id: %" PRIu64 "\n", ev->id);
+
+ switch (ev->type) {
+ case PERF_EVENT_UPDATE__SCALE:
+ ev_scale = (struct event_update_event_scale *) ev->data;
+ ret += fprintf(fp, "... scale: %f\n", ev_scale->scale);
+ break;
+ case PERF_EVENT_UPDATE__UNIT:
+ ret += fprintf(fp, "... unit: %s\n", ev->data);
+ break;
+ case PERF_EVENT_UPDATE__NAME:
+ ret += fprintf(fp, "... name: %s\n", ev->data);
+ break;
+ case PERF_EVENT_UPDATE__CPUS:
+ ev_cpus = (struct event_update_event_cpus *) ev->data;
+ ret += fprintf(fp, "... ");
+
+ map = cpu_map__new_data(&ev_cpus->cpus);
+ if (map)
+ ret += cpu_map__fprintf(map, fp);
+ else
+ ret += fprintf(fp, "failed to get cpus\n");
+ break;
+ default:
+ ret += fprintf(fp, "... unknown type\n");
+ break;
+ }
+
+ return ret;
+}
int perf_event__synthesize_attrs(struct perf_tool *tool,
struct perf_session *session,
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index a1bc0c5706a3..710deecf8f80 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -122,6 +122,7 @@ int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
union perf_event *event,
struct perf_evlist **pevlist);
+size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
int perf_event__synthesize_tracing_data(struct perf_tool *tool,
int fd, struct perf_evlist *evlist,
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qnv5L-4yj-7@gated-at.bofh.it> |
| In reply to | #1255435 |
Adding stat config event to pass/store stat config data,
so report tools (report/script) know how to interpret
stat data.
The config data are stored in 'tag|value' way to allow
easy extension and backward compatibility.
Link: http://lkml.kernel.org/n/tip-1npdsfez8635vogthpqwtkd0@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/event.c | 1 +
tools/perf/util/event.h | 20 ++++++++++++++++++++
tools/perf/util/session.c | 24 ++++++++++++++++++++++++
tools/perf/util/tool.h | 3 ++-
4 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 36dc992b072f..1165cb1d891f 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -39,6 +39,7 @@ static const char *perf_event__names[] = {
[PERF_RECORD_AUXTRACE_ERROR] = "AUXTRACE_ERROR",
[PERF_RECORD_THREAD_MAP] = "THREAD_MAP",
[PERF_RECORD_CPU_MAP] = "CPU_MAP",
+ [PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
};
const char *perf_event__name(unsigned int id)
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index e46f95285350..0bc3393dd28c 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -228,6 +228,7 @@ enum perf_user_event_type { /* above any possible kernel type */
PERF_RECORD_AUXTRACE_ERROR = 72,
PERF_RECORD_THREAD_MAP = 73,
PERF_RECORD_CPU_MAP = 74,
+ PERF_RECORD_STAT_CONFIG = 75,
PERF_RECORD_HEADER_MAX
};
@@ -395,6 +396,24 @@ struct thread_map_event {
struct thread_map_data_event data[];
};
+enum {
+ PERF_STAT_CONFIG_TERM__AGGR_MODE = 0,
+ PERF_STAT_CONFIG_TERM__INTERVAL = 1,
+ PERF_STAT_CONFIG_TERM__SCALE = 2,
+ PERF_STAT_CONFIG_TERM__MAX = 3,
+};
+
+struct stat_config_term_event {
+ u64 tag;
+ u64 val;
+};
+
+struct stat_config_event {
+ struct perf_event_header header;
+ u64 nr;
+ struct stat_config_term_event data[];
+};
+
union perf_event {
struct perf_event_header header;
struct mmap_event mmap;
@@ -419,6 +438,7 @@ union perf_event {
struct context_switch_event context_switch;
struct thread_map_event thread_map;
struct cpu_map_event cpu_map;
+ struct stat_config_event stat_config;
};
void perf_event__print_totals(void);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 5126b18c671c..a550464925ea 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -315,6 +315,15 @@ int process_event_cpu_map_stub(struct perf_tool *tool __maybe_unused,
return 0;
}
+static
+int process_event_stat_config_stub(struct perf_tool *tool __maybe_unused,
+ union perf_event *event __maybe_unused,
+ struct perf_session *session __maybe_unused)
+{
+ dump_printf(": unhandled!\n");
+ return 0;
+}
+
void perf_tool__fill_defaults(struct perf_tool *tool)
{
if (tool->sample == NULL)
@@ -369,6 +378,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
tool->thread_map = process_event_thread_map_stub;
if (tool->cpu_map == NULL)
tool->cpu_map = process_event_cpu_map_stub;
+ if (tool->stat_config == NULL)
+ tool->stat_config = process_event_stat_config_stub;
}
static void swap_sample_id_all(union perf_event *event, void *data)
@@ -686,6 +697,16 @@ static void perf_event__cpu_map_swap(union perf_event *event,
}
}
+static void perf_event__stat_config_swap(union perf_event *event,
+ bool sample_id_all __maybe_unused)
+{
+ u64 size;
+
+ size = event->stat_config.nr * sizeof(event->stat_config.data[0]);
+ size += 1; /* nr item itself */
+ mem_bswap_64(&event->stat_config.nr, size);
+}
+
typedef void (*perf_event__swap_op)(union perf_event *event,
bool sample_id_all);
@@ -715,6 +736,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
[PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap,
[PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
[PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
+ [PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
[PERF_RECORD_HEADER_MAX] = NULL,
};
@@ -1255,6 +1277,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
return tool->thread_map(tool, event, session);
case PERF_RECORD_CPU_MAP:
return tool->cpu_map(tool, event, session);
+ case PERF_RECORD_STAT_CONFIG:
+ return tool->stat_config(tool, event, session);
default:
return -EINVAL;
}
diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
index 9e5925c78519..aa7ae73d76b4 100644
--- a/tools/perf/util/tool.h
+++ b/tools/perf/util/tool.h
@@ -57,7 +57,8 @@ struct perf_tool {
auxtrace_info,
auxtrace_error,
thread_map,
- cpu_map;
+ cpu_map,
+ stat_config;
event_op3 auxtrace;
bool ordered_events;
bool ordering_requires_timestamps;
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-27 14:20 +0100 |
| Subject | Re: [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qockq-5F1-15@gated-at.bofh.it> |
| In reply to | #1255473 |
Em Sun, Oct 25, 2015 at 03:51:27PM +0100, Jiri Olsa escreveu:
> Adding stat config event to pass/store stat config data,
> so report tools (report/script) know how to interpret
> stat data.
>
> The config data are stored in 'tag|value' way to allow
> easy extension and backward compatibility.
I wonder if this couldn't be renamed 'PERF_RECORD_CONFIG' and just go
on using one of those 2^64-1 tags for the 'stat config' needs, but then
this is just a matter of changing the name of this event, which won't
break anything when done.
Other stuff we may want to have stored like this include sysctl, sysfs
values, kernel command line options used, etc.
- Arnaldo
> Link: http://lkml.kernel.org/n/tip-1npdsfez8635vogthpqwtkd0@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
> tools/perf/util/event.c | 1 +
> tools/perf/util/event.h | 20 ++++++++++++++++++++
> tools/perf/util/session.c | 24 ++++++++++++++++++++++++
> tools/perf/util/tool.h | 3 ++-
> 4 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 36dc992b072f..1165cb1d891f 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -39,6 +39,7 @@ static const char *perf_event__names[] = {
> [PERF_RECORD_AUXTRACE_ERROR] = "AUXTRACE_ERROR",
> [PERF_RECORD_THREAD_MAP] = "THREAD_MAP",
> [PERF_RECORD_CPU_MAP] = "CPU_MAP",
> + [PERF_RECORD_STAT_CONFIG] = "STAT_CONFIG",
> };
>
> const char *perf_event__name(unsigned int id)
> diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
> index e46f95285350..0bc3393dd28c 100644
> --- a/tools/perf/util/event.h
> +++ b/tools/perf/util/event.h
> @@ -228,6 +228,7 @@ enum perf_user_event_type { /* above any possible kernel type */
> PERF_RECORD_AUXTRACE_ERROR = 72,
> PERF_RECORD_THREAD_MAP = 73,
> PERF_RECORD_CPU_MAP = 74,
> + PERF_RECORD_STAT_CONFIG = 75,
> PERF_RECORD_HEADER_MAX
> };
>
> @@ -395,6 +396,24 @@ struct thread_map_event {
> struct thread_map_data_event data[];
> };
>
> +enum {
> + PERF_STAT_CONFIG_TERM__AGGR_MODE = 0,
> + PERF_STAT_CONFIG_TERM__INTERVAL = 1,
> + PERF_STAT_CONFIG_TERM__SCALE = 2,
> + PERF_STAT_CONFIG_TERM__MAX = 3,
> +};
> +
> +struct stat_config_term_event {
> + u64 tag;
> + u64 val;
> +};
> +
> +struct stat_config_event {
> + struct perf_event_header header;
> + u64 nr;
> + struct stat_config_term_event data[];
> +};
> +
> union perf_event {
> struct perf_event_header header;
> struct mmap_event mmap;
> @@ -419,6 +438,7 @@ union perf_event {
> struct context_switch_event context_switch;
> struct thread_map_event thread_map;
> struct cpu_map_event cpu_map;
> + struct stat_config_event stat_config;
> };
>
> void perf_event__print_totals(void);
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 5126b18c671c..a550464925ea 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -315,6 +315,15 @@ int process_event_cpu_map_stub(struct perf_tool *tool __maybe_unused,
> return 0;
> }
>
> +static
> +int process_event_stat_config_stub(struct perf_tool *tool __maybe_unused,
> + union perf_event *event __maybe_unused,
> + struct perf_session *session __maybe_unused)
> +{
> + dump_printf(": unhandled!\n");
> + return 0;
> +}
> +
> void perf_tool__fill_defaults(struct perf_tool *tool)
> {
> if (tool->sample == NULL)
> @@ -369,6 +378,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
> tool->thread_map = process_event_thread_map_stub;
> if (tool->cpu_map == NULL)
> tool->cpu_map = process_event_cpu_map_stub;
> + if (tool->stat_config == NULL)
> + tool->stat_config = process_event_stat_config_stub;
> }
>
> static void swap_sample_id_all(union perf_event *event, void *data)
> @@ -686,6 +697,16 @@ static void perf_event__cpu_map_swap(union perf_event *event,
> }
> }
>
> +static void perf_event__stat_config_swap(union perf_event *event,
> + bool sample_id_all __maybe_unused)
> +{
> + u64 size;
> +
> + size = event->stat_config.nr * sizeof(event->stat_config.data[0]);
> + size += 1; /* nr item itself */
> + mem_bswap_64(&event->stat_config.nr, size);
> +}
> +
> typedef void (*perf_event__swap_op)(union perf_event *event,
> bool sample_id_all);
>
> @@ -715,6 +736,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
> [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap,
> [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
> [PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
> + [PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
> [PERF_RECORD_HEADER_MAX] = NULL,
> };
>
> @@ -1255,6 +1277,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
> return tool->thread_map(tool, event, session);
> case PERF_RECORD_CPU_MAP:
> return tool->cpu_map(tool, event, session);
> + case PERF_RECORD_STAT_CONFIG:
> + return tool->stat_config(tool, event, session);
> default:
> return -EINVAL;
> }
> diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
> index 9e5925c78519..aa7ae73d76b4 100644
> --- a/tools/perf/util/tool.h
> +++ b/tools/perf/util/tool.h
> @@ -57,7 +57,8 @@ struct perf_tool {
> auxtrace_info,
> auxtrace_error,
> thread_map,
> - cpu_map;
> + cpu_map,
> + stat_config;
> event_op3 auxtrace;
> bool ordered_events;
> bool ordering_requires_timestamps;
> --
> 2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@redhat.com> |
|---|---|
| Date | 2015-10-27 14:40 +0100 |
| Subject | Re: [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qocDL-5L7-3@gated-at.bofh.it> |
| In reply to | #1256746 |
On Tue, Oct 27, 2015 at 10:16:05AM -0300, Arnaldo Carvalho de Melo wrote: > Em Sun, Oct 25, 2015 at 03:51:27PM +0100, Jiri Olsa escreveu: > > Adding stat config event to pass/store stat config data, > > so report tools (report/script) know how to interpret > > stat data. > > > > The config data are stored in 'tag|value' way to allow > > easy extension and backward compatibility. > > I wonder if this couldn't be renamed 'PERF_RECORD_CONFIG' and just go > on using one of those 2^64-1 tags for the 'stat config' needs, but then > this is just a matter of changing the name of this event, which won't > break anything when done. we use this event to update 'struct perf_stat_config', so it's kind of stat specific > > Other stuff we may want to have stored like this include sysctl, sysfs > values, kernel command line options used, etc. I think we could easily add record specific event for this once it's needed.. there's plenty of free numbers in user events area ;-) jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-27 14:50 +0100 |
| Subject | Re: [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qocNs-5Og-7@gated-at.bofh.it> |
| In reply to | #1256754 |
Em Tue, Oct 27, 2015 at 02:30:43PM +0100, Jiri Olsa escreveu: > On Tue, Oct 27, 2015 at 10:16:05AM -0300, Arnaldo Carvalho de Melo wrote: > > Em Sun, Oct 25, 2015 at 03:51:27PM +0100, Jiri Olsa escreveu: > > > Adding stat config event to pass/store stat config data, > > > so report tools (report/script) know how to interpret > > > stat data. > > > > > > The config data are stored in 'tag|value' way to allow > > > easy extension and backward compatibility. > > > > I wonder if this couldn't be renamed 'PERF_RECORD_CONFIG' and just go > > on using one of those 2^64-1 tags for the 'stat config' needs, but then > > this is just a matter of changing the name of this event, which won't > > break anything when done. > > we use this event to update 'struct perf_stat_config', > so it's kind of stat specific What makes it specific? Isn't this just tag/value? If it was generic all it would take would be for us to register a range of values (or several) to be handled by the stat config reading routine. > > Other stuff we may want to have stored like this include sysctl, sysfs > > values, kernel command line options used, etc. > > I think we could easily add record specific event for this > once it's needed.. there's plenty of free numbers in user > events area ;-) Shhh, don't ask PeterZ about it ;-) But seriously, what makes this specific? Do you envision the stat code needing 2^64-1 tags? Anyway, we can revisit this when code needing to store tag/value appears. - Arnaldo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@redhat.com> |
|---|---|
| Date | 2015-10-27 15:00 +0100 |
| Subject | Re: [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qocX8-5RG-9@gated-at.bofh.it> |
| In reply to | #1256756 |
On Tue, Oct 27, 2015 at 10:44:40AM -0300, Arnaldo Carvalho de Melo wrote: > Em Tue, Oct 27, 2015 at 02:30:43PM +0100, Jiri Olsa escreveu: > > On Tue, Oct 27, 2015 at 10:16:05AM -0300, Arnaldo Carvalho de Melo wrote: > > > Em Sun, Oct 25, 2015 at 03:51:27PM +0100, Jiri Olsa escreveu: > > > > Adding stat config event to pass/store stat config data, > > > > so report tools (report/script) know how to interpret > > > > stat data. > > > > > > > > The config data are stored in 'tag|value' way to allow > > > > easy extension and backward compatibility. > > > > > > I wonder if this couldn't be renamed 'PERF_RECORD_CONFIG' and just go > > > on using one of those 2^64-1 tags for the 'stat config' needs, but then > > > this is just a matter of changing the name of this event, which won't > > > break anything when done. > > > > we use this event to update 'struct perf_stat_config', > > so it's kind of stat specific > > What makes it specific? Isn't this just tag/value? If it was generic all > it would take would be for us to register a range of values (or several) > to be handled by the stat config reading routine. > > > > Other stuff we may want to have stored like this include sysctl, sysfs > > > values, kernel command line options used, etc. > > > > I think we could easily add record specific event for this > > once it's needed.. there's plenty of free numbers in user > > events area ;-) > > Shhh, don't ask PeterZ about it ;-) > > But seriously, what makes this specific? Do you envision the stat code > needing 2^64-1 tags? nope ;-) it's just the read function perf_event__read_stat_config takes the 'struct perf_stat_config *' and updates it based on the event data. we would need to change the code to be more generic.. but as you said, it's future ;-) jirka -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-27 15:20 +0100 |
| Subject | Re: [PATCH 11/52] perf tools: Add stat config event |
| Message-ID | <qodgt-6dy-3@gated-at.bofh.it> |
| In reply to | #1256757 |
Em Tue, Oct 27, 2015 at 02:51:54PM +0100, Jiri Olsa escreveu: > On Tue, Oct 27, 2015 at 10:44:40AM -0300, Arnaldo Carvalho de Melo wrote: > > > I think we could easily add record specific event for this > > > once it's needed.. there's plenty of free numbers in user > > > events area ;-) > > Shhh, don't ask PeterZ about it ;-) > > But seriously, what makes this specific? Do you envision the stat code > > needing 2^64-1 tags? > nope ;-) > it's just the read function perf_event__read_stat_config takes the > 'struct perf_stat_config *' and updates it based on the event data. > we would need to change the code to be more generic.. but as you said, > it's future ;-) Right, I applied the patch, I was just curious if I was missing some detail that would prevent us from using this as a generic tag/value perf.data storing facility. - Arnaldo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 13/52] perf tools: Add stat config event read function |
| Message-ID | <qnv5L-4yj-9@gated-at.bofh.it> |
| In reply to | #1255435 |
Introducing perf_event__read_stat_config function to read
struct perf_stat_config object data from stat config event.
Link: http://lkml.kernel.org/n/tip-62ae08zz97jp2qkhygp8uet5@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/stat.c | 6 ++++++
tools/perf/util/event.c | 24 ++++++++++++++++++++++++
tools/perf/util/event.h | 2 ++
3 files changed, 32 insertions(+)
diff --git a/tools/perf/tests/stat.c b/tools/perf/tests/stat.c
index 5e6a2441998c..2049c5a3e4a2 100644
--- a/tools/perf/tests/stat.c
+++ b/tools/perf/tests/stat.c
@@ -24,6 +24,7 @@ static int process_event(struct perf_tool *tool __maybe_unused,
struct machine *machine __maybe_unused)
{
struct stat_config_event *config = &event->stat_config;
+ struct perf_stat_config stat_config;
#define HAS(term, val) \
has_term(config, PERF_STAT_CONFIG_TERM__##term, val)
@@ -35,6 +36,11 @@ static int process_event(struct perf_tool *tool __maybe_unused,
#undef HAS
+ perf_event__read_stat_config(&stat_config, config);
+
+ TEST_ASSERT_VAL("wrong aggr_mode", stat_config.aggr_mode == AGGR_CORE);
+ TEST_ASSERT_VAL("wrong scale", stat_config.scale == 1);
+ TEST_ASSERT_VAL("wrong interval", stat_config.interval == 1);
return 0;
}
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index a9f596cf6ad9..381e0b0bcc8d 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -909,6 +909,30 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
return err;
}
+void perf_event__read_stat_config(struct perf_stat_config *config,
+ struct stat_config_event *event)
+{
+ unsigned i;
+
+ for (i = 0; i < event->nr; i++) {
+
+ switch (event->data[i].tag) {
+#define CASE(__term, __val) \
+ case PERF_STAT_CONFIG_TERM__##__term: \
+ config->__val = event->data[i].val; \
+ break;
+
+ CASE(AGGR_MODE, aggr_mode)
+ CASE(SCALE, scale)
+ CASE(INTERVAL, interval)
+#undef CASE
+ default:
+ pr_warning("unknown stat config term %" PRIu64 "\n",
+ event->data[i].tag);
+ }
+ }
+}
+
size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
{
const char *s;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 5f246a7cf5ab..a9debe60c42b 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -477,6 +477,8 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
struct perf_stat_config *config,
perf_event__handler_t process,
struct machine *machine);
+void perf_event__read_stat_config(struct perf_stat_config *config,
+ struct stat_config_event *event);
int perf_event__synthesize_modules(struct perf_tool *tool,
perf_event__handler_t process,
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 28/52] perf tools: Move id_offset out of struct perf_evsel union |
| Message-ID | <qnv5L-4yj-13@gated-at.bofh.it> |
| In reply to | #1255435 |
Because following stat patches use id_offset together
with priv pointer.
Link: http://lkml.kernel.org/n/tip-ts3nkj35lx54whb649by02py@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/evsel.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 02a5fed8d924..0e22c0b7dab5 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -90,9 +90,9 @@ struct perf_evsel {
double scale;
const char *unit;
struct event_format *tp_format;
+ off_t id_offset;
union {
void *priv;
- off_t id_offset;
u64 db_id;
};
struct cgroup_sel *cgrp;
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Jiri Olsa <tipbot@zytor.com> |
|---|---|
| Date | 2015-10-29 10:50 +0100 |
| Subject | [tip:perf/core] perf evsel: Move id_offset out of struct perf_evsel union member |
| Message-ID | <qoS0j-6Ul-39@gated-at.bofh.it> |
| In reply to | #1255475 |
Commit-ID: af3399817428d8adc2c87c91df23fde77dbcdb35
Gitweb: http://git.kernel.org/tip/af3399817428d8adc2c87c91df23fde77dbcdb35
Author: Jiri Olsa <jolsa@kernel.org>
AuthorDate: Sun, 25 Oct 2015 15:51:44 +0100
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 27 Oct 2015 15:04:29 -0300
perf evsel: Move id_offset out of struct perf_evsel union member
Because the 'perf stat record' patches will use the id_offset member
together with the priv pointer.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Kan Liang <kan.liang@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445784728-21732-29-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/evsel.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 02a5fed..0e22c0b 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -90,9 +90,9 @@ struct perf_evsel {
double scale;
const char *unit;
struct event_format *tp_format;
+ off_t id_offset;
union {
void *priv;
- off_t id_offset;
u64 db_id;
};
struct cgroup_sel *cgrp;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 15/52] perf tools: Add stat event synthesize function |
| Message-ID | <qnv5M-4yj-17@gated-at.bofh.it> |
| In reply to | #1255435 |
Introduce perf_event__synthesize_stat function to
synthesize 'struct stat_event'.
Link: http://lkml.kernel.org/n/tip-0jr9x4vwk0nxbs2ueclj7jfy@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/builtin-test.c | 4 ++++
tools/perf/tests/stat.c | 41 ++++++++++++++++++++++++++++++++++++-----
tools/perf/tests/tests.h | 1 +
tools/perf/util/event.c | 22 ++++++++++++++++++++++
tools/perf/util/event.h | 7 ++++++-
5 files changed, 69 insertions(+), 6 deletions(-)
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 1a9064f54da5..87d6244f15f9 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -178,6 +178,10 @@ static struct test generic_tests[] = {
.func = test__synthesize_stat_config,
},
{
+ .desc = "Test stat synthesize",
+ .func = test__synthesize_stat,
+ },
+ {
.func = NULL,
},
};
diff --git a/tools/perf/tests/stat.c b/tools/perf/tests/stat.c
index 2049c5a3e4a2..805ff30bb1d5 100644
--- a/tools/perf/tests/stat.c
+++ b/tools/perf/tests/stat.c
@@ -2,6 +2,7 @@
#include "event.h"
#include "tests.h"
#include "stat.h"
+#include "counts.h"
#include "debug.h"
static bool has_term(struct stat_config_event *config,
@@ -18,10 +19,10 @@ static bool has_term(struct stat_config_event *config,
return false;
}
-static int process_event(struct perf_tool *tool __maybe_unused,
- union perf_event *event,
- struct perf_sample *sample __maybe_unused,
- struct machine *machine __maybe_unused)
+static int process_stat_config_event(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
{
struct stat_config_event *config = &event->stat_config;
struct perf_stat_config stat_config;
@@ -53,7 +54,37 @@ int test__synthesize_stat_config(void)
};
TEST_ASSERT_VAL("failed to synthesize stat_config",
- !perf_event__synthesize_stat_config(NULL, &stat_config, process_event, NULL));
+ !perf_event__synthesize_stat_config(NULL, &stat_config, process_stat_config_event, NULL));
+
+ return 0;
+}
+
+static int process_stat_event(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ struct stat_event *stat = &event->stat;
+
+ TEST_ASSERT_VAL("wrong cpu", stat->cpu == 1);
+ TEST_ASSERT_VAL("wrong thread", stat->thread == 2);
+ TEST_ASSERT_VAL("wrong id", stat->id == 3);
+ TEST_ASSERT_VAL("wrong val", stat->val == 100);
+ TEST_ASSERT_VAL("wrong run", stat->ena == 200);
+ TEST_ASSERT_VAL("wrong ena", stat->run == 300);
+ return 0;
+}
+
+int test__synthesize_stat(void)
+{
+ struct perf_counts_values count;
+
+ count.val = 100;
+ count.ena = 200;
+ count.run = 300;
+
+ TEST_ASSERT_VAL("failed to synthesize stat_config",
+ !perf_event__synthesize_stat(NULL, 1, 2, 3, &count, process_stat_event, NULL));
return 0;
}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 227ad216197e..edf460e5cd64 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -70,6 +70,7 @@ int test_session_topology(void);
int test__thread_map_synthesize(void);
int test__cpu_map_synthesize(void);
int test__synthesize_stat_config(void);
+int test__synthesize_stat(void);
#if defined(__arm__) || defined(__aarch64__)
#ifdef HAVE_DWARF_UNWIND_SUPPORT
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index dfff3db6077f..ebbfdc1c1d3b 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -910,6 +910,28 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
return err;
}
+int perf_event__synthesize_stat(struct perf_tool *tool,
+ u32 cpu, u32 thread, u64 id,
+ struct perf_counts_values *count,
+ perf_event__handler_t process,
+ struct machine *machine)
+{
+ struct stat_event event;
+
+ event.header.type = PERF_RECORD_STAT;
+ event.header.size = sizeof(event);
+ event.header.misc = 0;
+
+ event.id = id;
+ event.cpu = cpu;
+ event.thread = thread;
+ event.val = count->val;
+ event.ena = count->ena;
+ event.run = count->run;
+
+ return process(tool, (union perf_event *) &event, NULL, machine);
+}
+
void perf_event__read_stat_config(struct perf_stat_config *config,
struct stat_config_event *event)
{
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 91a05c8328d7..1799b06e3fac 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -466,6 +466,7 @@ struct perf_tool;
struct thread_map;
struct cpu_map;
struct perf_stat_config;
+struct perf_counts_values;
typedef int (*perf_event__handler_t)(struct perf_tool *tool,
union perf_event *event,
@@ -498,7 +499,11 @@ int perf_event__synthesize_stat_config(struct perf_tool *tool,
struct machine *machine);
void perf_event__read_stat_config(struct perf_stat_config *config,
struct stat_config_event *event);
-
+int perf_event__synthesize_stat(struct perf_tool *tool,
+ u32 cpu, u32 thread, u64 id,
+ struct perf_counts_values *count,
+ perf_event__handler_t process,
+ struct machine *machine);
int perf_event__synthesize_modules(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine);
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 35/52] perf stat record: Write stat round events on record |
| Message-ID | <qnv5L-4yj-11@gated-at.bofh.it> |
| In reply to | #1255435 |
Writing stat round events on 'perf stat record' for
each interval round. In non interval mode we store
round event after the last stat event.
Link: http://lkml.kernel.org/n/tip-a43rs4c6szofeuo2gjlcpm0h@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 6b8b7c27ce4a..9ab268086ae7 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -207,6 +207,16 @@ static int process_synthesized_event(struct perf_tool *tool __maybe_unused,
return 0;
}
+static int write_stat_round_event(u64 time, u64 type)
+{
+ return perf_event__synthesize_stat_round(NULL, time, type,
+ process_synthesized_event,
+ NULL);
+}
+
+#define WRITE_STAT_ROUND_EVENT(time, interval) \
+ write_stat_round_event(time, PERF_STAT_ROUND_TYPE__ ## interval)
+
#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
static int
@@ -282,6 +292,11 @@ static void process_interval(void)
clock_gettime(CLOCK_MONOTONIC, &ts);
diff_timespec(&rs, &ts, &ref_time);
+ if (STAT_RECORD) {
+ if (WRITE_STAT_ROUND_EVENT(rs.tv_sec * NSECS_PER_SEC + rs.tv_nsec, INTERVAL))
+ pr_err("failed to write stat round event\n");
+ }
+
print_counters(&rs, 0, NULL);
}
@@ -1639,6 +1654,11 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
if (STAT_RECORD) {
int fd = perf_data_file__fd(&perf_stat.file);
+ if (!interval) {
+ if (WRITE_STAT_ROUND_EVENT(walltime_nsecs_stats.max, FINAL))
+ pr_err("failed to write stat round event\n");
+ }
+
if (!perf_stat.file.is_pipe) {
perf_stat.session->header.data_size += perf_stat.bytes_written;
perf_session__write_header(perf_stat.session, evsel_list, fd, true);
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 24/52] perf tools: Add event_update event cpus type |
| Message-ID | <qnv5M-4yj-19@gated-at.bofh.it> |
| In reply to | #1255435 |
Adding cpumask 'event update' event, that stores/transfer
cpumask for event.
Link: http://lkml.kernel.org/n/tip-wm844j3ht4isjn2elinc09rk@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/event_update.c | 29 ++++++++++++++++++++++++++++
tools/perf/util/event.h | 5 +++++
tools/perf/util/header.c | 42 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/header.h | 3 +++
4 files changed, 79 insertions(+)
diff --git a/tools/perf/tests/event_update.c b/tools/perf/tests/event_update.c
index 7b7515dde130..f05314abdab5 100644
--- a/tools/perf/tests/event_update.c
+++ b/tools/perf/tests/event_update.c
@@ -53,6 +53,29 @@ static int process_event_name(struct perf_tool *tool,
return 0;
}
+static int process_event_cpus(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ struct event_update_event *ev = (struct event_update_event*) event;
+ struct event_update_event_cpus *ev_data;
+ struct cpu_map *map;
+
+ ev_data = (struct event_update_event_cpus*) ev->data;
+
+ map = cpu_map__new_data(&ev_data->cpus);
+
+ TEST_ASSERT_VAL("wrong id", ev->id == 123);
+ TEST_ASSERT_VAL("wrong type", ev->type == PERF_EVENT_UPDATE__CPUS);
+ TEST_ASSERT_VAL("wrong cpus", map->nr == 3);
+ TEST_ASSERT_VAL("wrong cpus", map->map[0] == 1);
+ TEST_ASSERT_VAL("wrong cpus", map->map[1] == 2);
+ TEST_ASSERT_VAL("wrong cpus", map->map[2] == 3);
+ cpu_map__put(map);
+ return 0;
+}
+
int test__event_update(void)
{
struct perf_evlist *evlist;
@@ -84,5 +107,11 @@ int test__event_update(void)
TEST_ASSERT_VAL("failed to synthesize attr update name",
!perf_event__synthesize_event_update_name(&tmp.tool, evsel, process_event_name));
+ evsel->own_cpus = cpu_map__new("1,2,3");
+
+ TEST_ASSERT_VAL("failed to synthesize attr update cpus",
+ !perf_event__synthesize_event_update_cpus(&tmp.tool, evsel, process_event_cpus));
+
+ cpu_map__put(evsel->own_cpus);
return 0;
}
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index fe8781de2528..063230fc91d8 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -312,6 +312,11 @@ enum {
PERF_EVENT_UPDATE__UNIT = 0,
PERF_EVENT_UPDATE__SCALE = 1,
PERF_EVENT_UPDATE__NAME = 2,
+ PERF_EVENT_UPDATE__CPUS = 3,
+};
+
+struct event_update_event_cpus {
+ struct cpu_map_data cpus;
};
struct event_update_event_scale {
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 1e7fe3546c33..e4cb510aa246 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2762,6 +2762,38 @@ perf_event__synthesize_event_update_name(struct perf_tool *tool,
return err;
}
+int
+perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
+ struct perf_evsel *evsel,
+ perf_event__handler_t process)
+{
+ size_t size = sizeof(struct event_update_event);
+ struct event_update_event *ev;
+ int max, err;
+ u16 type;
+
+ if (!evsel->own_cpus)
+ return 0;
+
+ ev = cpu_map_data__alloc(evsel->own_cpus, &size, &type, &max);
+ if (!ev)
+ return -ENOMEM;
+
+ ev->header.type = PERF_RECORD_EVENT_UPDATE;
+ ev->header.size = (u16)size;
+ ev->type = PERF_EVENT_UPDATE__CPUS;
+ ev->id = evsel->id[0];
+
+ cpu_map_data__synthesize((struct cpu_map_data *) ev->data,
+ evsel->own_cpus,
+ type, max);
+
+ err = process(tool, (union perf_event*) ev, NULL, NULL);
+ free(ev);
+ return err;
+}
+
+
int perf_event__synthesize_attrs(struct perf_tool *tool,
struct perf_session *session,
perf_event__handler_t process)
@@ -2827,8 +2859,10 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
{
struct event_update_event *ev = &event->event_update;
struct event_update_event_scale *ev_scale;
+ struct event_update_event_cpus *ev_cpus;
struct perf_evlist *evlist;
struct perf_evsel *evsel;
+ struct cpu_map *map;
if (!pevlist || *pevlist == NULL)
return -EINVAL;
@@ -2849,6 +2883,14 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
case PERF_EVENT_UPDATE__SCALE:
ev_scale = (struct event_update_event_scale *) ev->data;
evsel->scale = ev_scale->scale;
+ case PERF_EVENT_UPDATE__CPUS:
+ ev_cpus = (struct event_update_event_cpus *) ev->data;
+
+ map = cpu_map__new_data(&ev_cpus->cpus);
+ if (map)
+ evsel->own_cpus = map;
+ else
+ pr_err("failed to get event_update cpus\n");
default:
break;
}
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 51cf566a0835..a1bc0c5706a3 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -114,6 +114,9 @@ int perf_event__synthesize_event_update_scale(struct perf_tool *tool,
int perf_event__synthesize_event_update_name(struct perf_tool *tool,
struct perf_evsel *evsel,
perf_event__handler_t process);
+int perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
+ struct perf_evsel *evsel,
+ perf_event__handler_t process);
int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
struct perf_evlist **pevlist);
int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 21/52] perf tools: Add event_update event unit type |
| Message-ID | <qnv5M-4yj-21@gated-at.bofh.it> |
| In reply to | #1255435 |
Adding unit type 'event update' event, that stores/transfer
events unit name. The unit name is part of the perf stat
output data.
Link: http://lkml.kernel.org/n/tip-5s6ape0vz2sfxgzu16eu8y7r@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 ++++
tools/perf/tests/event_update.c | 42 +++++++++++++++++++++++++++++++++++++++
tools/perf/tests/tests.h | 1 +
tools/perf/util/event.h | 4 ++++
tools/perf/util/header.c | 44 +++++++++++++++++++++++++++++++++++++++++
tools/perf/util/header.h | 3 +++
7 files changed, 99 insertions(+)
create mode 100644 tools/perf/tests/event_update.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index ea4ef8fdd463..522dc2fa6dae 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -35,6 +35,7 @@ perf-y += llvm.o
perf-y += topology.o
perf-y += cpumap.o
perf-y += stat.o
+perf-y += event_update.o
ifeq ($(ARCH),$(filter $(ARCH),x86 arm arm64))
perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index e18f5b818a02..dca022d1f342 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -186,6 +186,10 @@ static struct test generic_tests[] = {
.func = test__synthesize_stat_round,
},
{
+ .desc = "Test attr update synthesize",
+ .func = test__event_update,
+ },
+ {
.func = NULL,
},
};
diff --git a/tools/perf/tests/event_update.c b/tools/perf/tests/event_update.c
new file mode 100644
index 000000000000..4ed9e35c4459
--- /dev/null
+++ b/tools/perf/tests/event_update.c
@@ -0,0 +1,42 @@
+#include <linux/compiler.h>
+#include "evlist.h"
+#include "evsel.h"
+#include "machine.h"
+#include "tests.h"
+#include "debug.h"
+
+static int process_event_unit(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ struct event_update_event *ev = (struct event_update_event*) event;
+
+ TEST_ASSERT_VAL("wrong id", ev->id == 123);
+ TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__UNIT);
+ TEST_ASSERT_VAL("wrong unit", !strcmp(ev->data, "KRAVA"));
+ return 0;
+}
+
+int test__event_update(void)
+{
+ struct perf_evlist *evlist;
+ struct perf_evsel *evsel;
+
+ evlist = perf_evlist__new_default();
+ TEST_ASSERT_VAL("failed to get evlist", evlist);
+
+ evsel = perf_evlist__first(evlist);
+
+ TEST_ASSERT_VAL("failed to allos ids",
+ !perf_evsel__alloc_id(evsel, 1, 1));
+
+ perf_evlist__id_add(evlist, evsel, 0, 0, 123);
+
+ evsel->unit = strdup("KRAVA");
+
+ TEST_ASSERT_VAL("failed to synthesize attr update unit",
+ !perf_event__synthesize_event_update_unit(NULL, evsel, process_event_unit));
+
+ return 0;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 261716924ad9..4e1ec66caec0 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -72,6 +72,7 @@ int test__cpu_map_synthesize(void);
int test__synthesize_stat_config(void);
int test__synthesize_stat(void);
int test__synthesize_stat_round(void);
+int test__event_update(void);
#if defined(__arm__) || defined(__aarch64__)
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 45819fc960ab..ee932d9329f9 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -308,6 +308,10 @@ struct attr_event {
u64 id[];
};
+enum {
+ PERF_EVENT_UPDATE__UNIT = 0,
+};
+
struct event_update_event {
struct perf_event_header header;
u64 type;
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 532184570e97..6b96e7320794 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -2686,6 +2686,43 @@ int perf_event__synthesize_attr(struct perf_tool *tool,
return err;
}
+static struct event_update_event*
+event_update_event__alloc(size_t size, u64 type, u64 id)
+{
+ struct event_update_event *ev;
+
+ size += sizeof(*ev);
+ size = PERF_ALIGN(size, sizeof(u64));
+
+ ev = zalloc(size);
+ if (ev) {
+ ev->header.type = PERF_RECORD_EVENT_UPDATE;
+ ev->header.size = (u16)size;
+ ev->type = type;
+ ev->id = id;
+ }
+ return ev;
+}
+
+int
+perf_event__synthesize_event_update_unit(struct perf_tool *tool,
+ struct perf_evsel *evsel,
+ perf_event__handler_t process)
+{
+ struct event_update_event *ev;
+ size_t size = strlen(evsel->unit);
+ int err;
+
+ ev = event_update_event__alloc(size + 1, PERF_EVENT_UPDATE__UNIT, evsel->id[0]);
+ if (ev == NULL)
+ return -ENOMEM;
+
+ strncpy(ev->data, evsel->unit, size);
+ err = process(tool, (union perf_event*) ev, NULL, NULL);
+ free(ev);
+ return err;
+}
+
int perf_event__synthesize_attrs(struct perf_tool *tool,
struct perf_session *session,
perf_event__handler_t process)
@@ -2762,6 +2799,13 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
if (evsel == NULL)
return -EINVAL;
+ switch (ev->type) {
+ case PERF_EVENT_UPDATE__UNIT:
+ evsel->unit = strdup(ev->data);
+ default:
+ break;
+ }
+
return 0;
}
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 1e843c67a4ff..6aa2b9242fc1 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -105,6 +105,9 @@ int perf_event__synthesize_attr(struct perf_tool *tool,
int perf_event__synthesize_attrs(struct perf_tool *tool,
struct perf_session *session,
perf_event__handler_t process);
+int perf_event__synthesize_event_update_unit(struct perf_tool *tool,
+ struct perf_evsel *evsel,
+ perf_event__handler_t process);
int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
struct perf_evlist **pevlist);
int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-10-25 16:10 +0100 |
| Subject | [PATCH 31/52] perf stat record: Synthesize stat record data |
| Message-ID | <qnv5M-4yj-25@gated-at.bofh.it> |
| In reply to | #1255435 |
Synthesizing needed stat record data for report/script:
- cpu/thread maps
- stat config
Link: http://lkml.kernel.org/n/tip-wni1s2i2sq17g4vomjyda2yf@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 3f470345e4fa..ac4e1f47bd3c 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -193,6 +193,20 @@ static inline int nsec_counter(struct perf_evsel *evsel)
return 0;
}
+static int process_synthesized_event(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_sample *sample __maybe_unused,
+ struct machine *machine __maybe_unused)
+{
+ if (perf_data_file__write(&perf_stat.file, event, event->header.size) < 0) {
+ pr_err("failed to write perf data, error: %m\n");
+ return -1;
+ }
+
+ perf_stat.bytes_written += event->header.size;
+ return 0;
+}
+
/*
* Read out the results of a single counter:
* do not aggregate counts across CPUs in system-wide mode
@@ -279,6 +293,35 @@ static void workload_exec_failed_signal(int signo __maybe_unused, siginfo_t *inf
workload_exec_errno = info->si_value.sival_int;
}
+static int perf_stat_synthesize_config(void)
+{
+ int err;
+
+ err = perf_event__synthesize_thread_map2(NULL, evsel_list->threads,
+ process_synthesized_event,
+ NULL);
+ if (err < 0) {
+ pr_err("Couldn't synthesize thread map.\n");
+ return err;
+ }
+
+ err = perf_event__synthesize_cpu_map(NULL, evsel_list->cpus,
+ process_synthesized_event, NULL);
+ if (err < 0) {
+ pr_err("Couldn't synthesize thread map.\n");
+ return err;
+ }
+
+ err = perf_event__synthesize_stat_config(NULL, &stat_config,
+ process_synthesized_event, NULL);
+ if (err < 0) {
+ pr_err("Couldn't synthesize config.\n");
+ return err;
+ }
+
+ return 0;
+}
+
static int __run_perf_stat(int argc, const char **argv)
{
int interval = stat_config.interval;
@@ -359,6 +402,10 @@ static int __run_perf_stat(int argc, const char **argv)
fd, false);
if (err < 0)
return err;
+
+ err = perf_stat_synthesize_config();
+ if (err < 0)
+ return err;
}
/*
--
2.4.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-27 15:50 +0100 |
| Subject | Re: [PATCH 31/52] perf stat record: Synthesize stat record data |
| Message-ID | <qodJw-6ns-19@gated-at.bofh.it> |
| In reply to | #1255481 |
Em Sun, Oct 25, 2015 at 03:51:47PM +0100, Jiri Olsa escreveu:
> Synthesizing needed stat record data for report/script:
> - cpu/thread maps
> - stat config
After this it gets a bit better, but then I expected that to specify an
event I would be able to use:
[root@zoo linux]# perf stat record -e cycles usleep 1
Error: unknown switch `e'
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
-o, --output <file> output file name
But I need to do it as:
[root@zoo linux]# perf stat -e cycles record usleep 1
Performance counter stats for 'usleep 1':
948417 cycles
0.000749965 seconds time elapsed
[root@zoo linux]#
--------------------------------------------------
This is confusing...
Anyway, now the perf.data file doesn't produce that many confusing
messages, just one, and the error reporting continues needing a
newline, oops just noticed another problem:
[root@zoo linux]# perf stat record usleep 1
Performance counter stats for 'usleep 1':
0.520959 task-clock (msec) # 0.504 CPUs utilized
1 context-switches # 0.002 M/sec
0 cpu-migrations # 0.000 K/sec
51 page-faults # 0.098 M/sec
929738 cycles # 1.785 GHz
625885 stalled-cycles-frontend # 67.32% frontend cycles idle
<not supported> stalled-cycles-backend
634514 instructions # 0.68 insns per cycle
# 0.99 stalled cycles per insn
128859 branches # 247.350 M/sec
7602 branch-misses # 5.90% of all branches
0.001034675 seconds time elapsed
[root@zoo linux]# perf evlist
non matching sample_type[root@zoo linux]#
But, if I specify an event:
[root@zoo linux]# perf stat -e cycles record usleep 1
Performance counter stats for 'usleep 1':
876987 cycles
0.001285050 seconds time elapsed
[root@zoo linux]# perf evlist
cycles
[root@zoo linux]# perf evlist -v
cycles: size: 112, read_format: TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING, disabled: 1, inherit: 1, enable_on_exec: 1, exclude_guest: 1
[root@zoo linux]#
-------------------------
It then works as expected, lists the event collected, no confusing message
about 'sample_type' stuff is emitted.
Ditto for 'perf report'
[root@zoo linux]# perf report --stdio
Warning:
Kernel address maps (/proc/{kallsyms,modules}) were restricted.
Check /proc/sys/kernel/kptr_restrict before running 'perf record'.
As no suitable kallsyms nor vmlinux was found, kernel samples
can't be resolved.
Samples in kernel modules can't be resolved as well.
Error:
The perf.data file has no samples!
# To display the perf.data header info, please use --header/--header-only options.
#
[root@zoo linux]#
------------------------------------------------
I.e. when I explicitely state what events should be collected, it behaves
nicely, modulo this message about kernel address maps being restricted in
'report', so it looks like just some fix is needed to make it work like that
when no events are specified.
So, I'm creating a perf/stat branch and putting what I processed so far, with
the changelog edits and changes in some function/struct names I
partially mentioned, please try to continue from there, ok?
- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
Page 2 of 4 — ← Prev page 1 [2] 3 4 Next page →
Back to top | Article view | linux.kernel
csiph-web