public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	David Ahern <dsahern@gmail.com>, Ingo Molnar <mingo@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 19/47] perf tools: Add stat config event synthesize function
Date: Tue, 21 Jul 2015 14:31:39 +0200	[thread overview]
Message-ID: <1437481927-29538-20-git-send-email-jolsa@kernel.org> (raw)
In-Reply-To: <1437481927-29538-1-git-send-email-jolsa@kernel.org>

Introduce perf_event__synthesize_stat_config function to
sythesize 'struct perf_stat_config'.

Storing stat config in form of tag-value pairs in a believe
it'll sort out future version issues.

Link: http://lkml.kernel.org/n/tip-zof1adf5flwp38xdzxzn4p2z@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/stat.c         | 53 +++++++++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h        |  1 +
 tools/perf/util/event.c         | 39 ++++++++++++++++++++++++++++++
 tools/perf/util/event.h         |  5 ++++
 6 files changed, 103 insertions(+)
 create mode 100644 tools/perf/tests/stat.c

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 05faf02ed1ee..5c3b9da9c1c3 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -33,6 +33,7 @@ perf-y += parse-no-sample-id-all.o
 perf-y += kmod-path.o
 perf-y += thread-map.o
 perf-y += cpumap.o
+perf-y += stat.o
 
 perf-$(CONFIG_X86) += perf-time-to-tsc.o
 
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index d4cfc0592f6b..203164ad9c82 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -183,6 +183,10 @@ static struct test {
 		.func = test__cpu_map_synthesize,
 	},
 	{
+		.desc = "Test stat config synthesize",
+		.func = test__synthesize_stat_config,
+	},
+	{
 		.func = NULL,
 	},
 };
diff --git a/tools/perf/tests/stat.c b/tools/perf/tests/stat.c
new file mode 100644
index 000000000000..5e6a2441998c
--- /dev/null
+++ b/tools/perf/tests/stat.c
@@ -0,0 +1,53 @@
+#include <linux/compiler.h>
+#include "event.h"
+#include "tests.h"
+#include "stat.h"
+#include "debug.h"
+
+static bool has_term(struct stat_config_event *config,
+		     u64 tag, u64 val)
+{
+	unsigned i;
+
+	for (i = 0; i < config->nr; i++) {
+		if ((config->data[i].tag == tag) &&
+		    (config->data[i].val == val))
+			return true;
+	}
+
+	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)
+{
+	struct stat_config_event *config = &event->stat_config;
+
+#define HAS(term, val) \
+	has_term(config, PERF_STAT_CONFIG_TERM__##term, val)
+
+	TEST_ASSERT_VAL("wrong nr",        config->nr == PERF_STAT_CONFIG_TERM__MAX);
+	TEST_ASSERT_VAL("wrong aggr_mode", HAS(AGGR_MODE, AGGR_CORE));
+	TEST_ASSERT_VAL("wrong scale",     HAS(SCALE, 1));
+	TEST_ASSERT_VAL("wrong interval",  HAS(INTERVAL, 1));
+
+#undef HAS
+
+	return 0;
+}
+
+int test__synthesize_stat_config(void)
+{
+	struct perf_stat_config stat_config = {
+		.aggr_mode	= AGGR_CORE,
+		.scale		= 1,
+		.interval	= 1,
+	};
+
+	TEST_ASSERT_VAL("failed to synthesize stat_config",
+		!perf_event__synthesize_stat_config(NULL, &stat_config, process_event, NULL));
+
+	return 0;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index c251d5a21e0c..dfb6db7d8a4d 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -64,6 +64,7 @@ int test__kmod_path__parse(void);
 int test__thread_map(void);
 int test__thread_map_synthesize(void);
 int test__cpu_map_synthesize(void);
+int test__synthesize_stat_config(void);
 
 #if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index e2c6c2df57fb..aa166ebf9fc0 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -10,6 +10,7 @@
 #include "thread.h"
 #include "thread_map.h"
 #include "symbol/kallsyms.h"
+#include "asm/bug.h"
 
 static const char *perf_event__names[] = {
 	[0]					= "TOTAL",
@@ -764,6 +765,44 @@ int perf_event__synthesize_cpu_map(struct perf_tool *tool,
 	return err;
 }
 
+int perf_event__synthesize_stat_config(struct perf_tool *tool,
+				       struct perf_stat_config *config,
+				       perf_event__handler_t process,
+				       struct machine *machine)
+{
+	struct stat_config_event *event;
+	int size, i = 0, err;
+
+	size  = sizeof(*event);
+	size += (PERF_STAT_CONFIG_TERM__MAX * sizeof(event->data[0]));
+
+	event = zalloc(size);
+	if (!event)
+		return -ENOMEM;
+
+	event->header.type = PERF_RECORD_STAT_CONFIG;
+	event->header.size = size;
+	event->nr          = PERF_STAT_CONFIG_TERM__MAX;
+
+#define ADD(__term, __val)					\
+	event->data[i].tag = PERF_STAT_CONFIG_TERM__##__term;	\
+	event->data[i].val = __val;				\
+	i++;
+
+	ADD(AGGR_MODE,	config->aggr_mode);
+	ADD(INTERVAL,	config->interval);
+	ADD(SCALE,	config->scale);
+
+	WARN_ONCE(i != PERF_STAT_CONFIG_TERM__MAX,
+		  "stat config terms unbalanced\n");
+#undef ADD
+
+	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 a67f4e8e0633..23dba7bb8973 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -417,6 +417,7 @@ void perf_event__print_totals(void);
 struct perf_tool;
 struct thread_map;
 struct cpu_map;
+struct perf_stat_config;
 
 typedef int (*perf_event__handler_t)(struct perf_tool *tool,
 				     union perf_event *event,
@@ -443,6 +444,10 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
 				       perf_event__handler_t process,
 				       struct machine *machine);
+int perf_event__synthesize_stat_config(struct perf_tool *tool,
+				       struct perf_stat_config *config,
+				       perf_event__handler_t process,
+				       struct machine *machine);
 
 int perf_event__synthesize_modules(struct perf_tool *tool,
 				   perf_event__handler_t process,
-- 
2.4.3


  parent reply	other threads:[~2015-07-21 12:41 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-21 12:31 [RFC 00/47] perf stat: Add scripting support Jiri Olsa
2015-07-21 12:31 ` [PATCH 01/47] perf test: Check for refcnt in thread_map test Jiri Olsa
2015-07-21 17:26   ` Arnaldo Carvalho de Melo
2015-07-29  8:10   ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 02/47] perf stat: Introduce struct perf_stat_config Jiri Olsa
2015-07-21 17:24   ` Arnaldo Carvalho de Melo
2015-07-21 17:37     ` Arnaldo Carvalho de Melo
2015-07-22  8:38       ` Jiri Olsa
2015-08-07  7:17   ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 03/47] perf stat: Move scale into " Jiri Olsa
2015-08-07  7:17   ` [tip:perf/core] perf stat: Move 'scale' " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 04/47] perf stat: Move output " Jiri Olsa
2015-08-07  7:17   ` [tip:perf/core] perf stat: Move 'output' " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 05/47] perf stat: Move interval " Jiri Olsa
2015-08-07  7:18   ` [tip:perf/core] perf stat: Move 'interval' " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 06/47] perf stat: Pass struct perf_stat_config into process_counter Jiri Olsa
2015-08-07  7:18   ` [tip:perf/core] perf stat: Pass 'struct perf_stat_config' into process_counter() tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 07/47] perf stat: Move counter processing code into stat object Jiri Olsa
2015-08-07  7:18   ` [tip:perf/core] " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 08/47] perf tools: Use bool instead of target argument in perf_evlist__propagate_maps Jiri Olsa
2015-07-29  8:10   ` [tip:perf/core] perf evlist: Use bool instead of target argument in propagate_maps() tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 09/47] perf tools: Tolerate NULL maps in perf_evlist__propagate_maps Jiri Olsa
2015-07-21 17:31   ` Arnaldo Carvalho de Melo
2015-07-29  8:11   ` [tip:perf/core] perf evlist: Tolerate NULL maps in propagate_maps tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 10/47] perf tools: Force perf_evlist__set_maps to propagate maps through events Jiri Olsa
2015-07-21 17:25   ` Arnaldo Carvalho de Melo
2015-07-29  8:10   ` [tip:perf/core] perf evlist: " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 11/47] perf tools: Use argv style storage for cmdline feature data Jiri Olsa
2015-07-21 17:29   ` Arnaldo Carvalho de Melo
2015-07-29  8:11   ` [tip:perf/core] perf header: " tip-bot for Jiri Olsa
2015-07-21 12:31 ` [PATCH 12/47] perf tools: Add thread_map event Jiri Olsa
2015-07-21 12:31 ` [PATCH 13/47] perf tools: Add thread_map event sythesize function Jiri Olsa
2015-07-21 12:31 ` [PATCH 14/47] perf tools: Add thread_map__new_event function Jiri Olsa
2015-07-21 12:31 ` [PATCH 15/47] perf tools: Add cpu_map event Jiri Olsa
2015-07-21 12:31 ` [PATCH 16/47] perf tools: Add cpu_map event synthesize function Jiri Olsa
2015-07-21 12:31 ` [PATCH 17/47] perf tools: Add cpu_map__new_event function Jiri Olsa
2015-07-21 12:31 ` [PATCH 18/47] perf tools: Add stat config event Jiri Olsa
2015-07-21 12:31 ` Jiri Olsa [this message]
2015-07-21 12:31 ` [PATCH 20/47] perf tools: Add stat config event read function Jiri Olsa
2015-07-21 12:31 ` [PATCH 21/47] perf tools: Add stat event Jiri Olsa
2015-07-21 12:31 ` [PATCH 22/47] perf tools: Add stat event synthesize function Jiri Olsa
2015-07-21 12:31 ` [PATCH 23/47] perf tools: Add stat event read function Jiri Olsa
2015-07-21 12:31 ` [PATCH 24/47] perf tools: Add stat round event Jiri Olsa
2015-07-21 12:31 ` [PATCH 25/47] perf tools: Add stat round event synthesize function Jiri Olsa
2015-07-21 12:31 ` [PATCH 26/47] perf tools: Introduce stat feature Jiri Olsa
2015-07-21 12:31 ` [PATCH 27/47] perf tools: Move id_offset out of struct perf_evsel union Jiri Olsa
2015-07-21 12:31 ` [PATCH 28/47] perf stat record: Add record command Jiri Olsa
2015-07-21 12:31 ` [PATCH 29/47] perf stat record: Initialize record features Jiri Olsa
2015-07-21 12:31 ` [PATCH 30/47] perf stat record: Synthesize stat record data Jiri Olsa
2015-07-21 12:31 ` [PATCH 31/47] perf stat record: Store events IDs in perf data file Jiri Olsa
2015-07-21 12:31 ` [PATCH 32/47] perf stat record: Add pipe support for record command Jiri Olsa
2015-07-21 12:31 ` [PATCH 33/47] perf stat record: Write stat events on record Jiri Olsa
2015-07-21 12:31 ` [PATCH 34/47] perf stat record: Write stat round " Jiri Olsa
2015-07-21 12:31 ` [PATCH 35/47] perf stat report: Add report command Jiri Olsa
2015-07-21 12:31 ` [PATCH 36/47] perf stat report: Process cpu/threads maps Jiri Olsa
2015-07-21 12:31 ` [PATCH 37/47] perf stat report: Process stat config event Jiri Olsa
2015-07-21 12:31 ` [PATCH 38/47] perf stat report: Process stat and stat round events Jiri Olsa
2015-07-21 12:31 ` [PATCH 39/47] perf stat report: Move csv_sep initialization before report command Jiri Olsa
2015-07-21 12:32 ` [PATCH 40/47] perf script: Check output fields only for samples Jiri Olsa
2015-07-21 12:32 ` [PATCH 41/47] perf script: Process cpu/threads maps Jiri Olsa
2015-07-21 12:32 ` [PATCH 42/47] perf script: Process stat config event Jiri Olsa
2015-07-21 12:32 ` [PATCH 43/47] perf script: Add process_stat/process_stat_interval scripting interface Jiri Olsa
2015-07-21 12:32 ` [PATCH 44/47] perf script: Add stat default handlers Jiri Olsa
2015-07-21 12:32 ` [PATCH 45/47] perf script: Display stat events by default Jiri Olsa
2015-07-21 12:32 ` [PATCH 46/47] perf script: Add python support for stat events Jiri Olsa
2015-07-21 12:32 ` [PATCH 47/47] perf script: Add stat-cpi.py script Jiri Olsa
2015-07-21 14:43 ` [RFC 00/47] perf stat: Add scripting support Andi Kleen
2015-07-26 13:51   ` Jiri Olsa
2015-07-27 12:46     ` Liang, Kan
2015-08-06 19:27 ` Arnaldo Carvalho de Melo
2015-08-07  7:45   ` Jiri Olsa
2015-08-07 13:10     ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1437481927-29538-20-git-send-email-jolsa@kernel.org \
    --to=jolsa@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=dsahern@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox