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


Groups > linux.kernel > #1294201

[PATCH 05/43] perf cpu_map: Add cpu_map user level event

From Arnaldo Carvalho de Melo <acme@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 05/43] perf cpu_map: Add cpu_map user level event
Date 2015-12-17 21:00 +0100
Message-ID <qGMSv-3Qg-29@gated-at.bofh.it> (permalink)
References <qGMIN-3MF-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Jiri Olsa <jolsa@kernel.org>

Adding the cpu_map event to pass/store cpu maps as data in
a pipe/perf.data.

We store maps in 2 formats:
  - list of cpus
  - mask of cpus

The format that takes less space is selected transparently in the
following patch.

The interface is made generic, so we could add the cpumap event data
into another event in the following patches.

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-8-git-send-email-jolsa@kernel.org
[ cpu_map_data_cpus -> cpu_map_entries, cpu_map_data_mask -> cpu_map_mask ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/event.c   |  1 +
 tools/perf/util/event.h   | 28 ++++++++++++++++++++++++++
 tools/perf/util/session.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/tool.h    |  3 ++-
 4 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 938f006c758e..719c0781a82a 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -38,6 +38,7 @@ static const char *perf_event__names[] = {
 	[PERF_RECORD_AUXTRACE]			= "AUXTRACE",
 	[PERF_RECORD_AUXTRACE_ERROR]		= "AUXTRACE_ERROR",
 	[PERF_RECORD_THREAD_MAP]		= "THREAD_MAP",
+	[PERF_RECORD_CPU_MAP]			= "CPU_MAP",
 };
 
 const char *perf_event__name(unsigned int id)
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index b7ad896d1317..1c82a0ebda73 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -227,6 +227,7 @@ enum perf_user_event_type { /* above any possible kernel type */
 	PERF_RECORD_AUXTRACE			= 71,
 	PERF_RECORD_AUXTRACE_ERROR		= 72,
 	PERF_RECORD_THREAD_MAP			= 73,
+	PERF_RECORD_CPU_MAP			= 74,
 	PERF_RECORD_HEADER_MAX
 };
 
@@ -271,6 +272,32 @@ struct events_stats {
 	u32 nr_proc_map_timeout;
 };
 
+enum {
+	PERF_CPU_MAP__CPUS = 0,
+	PERF_CPU_MAP__MASK = 1,
+};
+
+struct cpu_map_entries {
+	u16	nr;
+	u16	cpu[];
+};
+
+struct cpu_map_mask {
+	u16	nr;
+	u16	long_size;
+	unsigned long mask[];
+};
+
+struct cpu_map_data {
+	u16	type;
+	char	data[];
+};
+
+struct cpu_map_event {
+	struct perf_event_header	header;
+	struct cpu_map_data		data;
+};
+
 struct attr_event {
 	struct perf_event_header header;
 	struct perf_event_attr attr;
@@ -391,6 +418,7 @@ union perf_event {
 	struct itrace_start_event	itrace_start;
 	struct context_switch_event	context_switch;
 	struct thread_map_event		thread_map;
+	struct cpu_map_event		cpu_map;
 };
 
 void perf_event__print_totals(void);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 36b07b22392d..4350f5e85bf5 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -306,6 +306,15 @@ int process_event_thread_map_stub(struct perf_tool *tool __maybe_unused,
 	return 0;
 }
 
+static
+int process_event_cpu_map_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)
@@ -358,6 +367,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool)
 		tool->auxtrace_error = process_event_auxtrace_error_stub;
 	if (tool->thread_map == NULL)
 		tool->thread_map = process_event_thread_map_stub;
+	if (tool->cpu_map == NULL)
+		tool->cpu_map = process_event_cpu_map_stub;
 }
 
 static void swap_sample_id_all(union perf_event *event, void *data)
@@ -639,6 +650,42 @@ static void perf_event__thread_map_swap(union perf_event *event,
 		event->thread_map.entries[i].pid = bswap_64(event->thread_map.entries[i].pid);
 }
 
+static void perf_event__cpu_map_swap(union perf_event *event,
+				     bool sample_id_all __maybe_unused)
+{
+	struct cpu_map_data *data = &event->cpu_map.data;
+	struct cpu_map_entries *cpus;
+	struct cpu_map_mask *mask;
+	unsigned i;
+
+	data->type = bswap_64(data->type);
+
+	switch (data->type) {
+	case PERF_CPU_MAP__CPUS:
+		cpus = (struct cpu_map_entries *)data->data;
+
+		cpus->nr = bswap_16(cpus->nr);
+
+		for (i = 0; i < cpus->nr; i++)
+			cpus->cpu[i] = bswap_16(cpus->cpu[i]);
+		break;
+	case PERF_CPU_MAP__MASK:
+		mask = (struct cpu_map_mask *) data->data;
+
+		mask->nr = bswap_16(mask->nr);
+		mask->long_size = bswap_16(mask->long_size);
+
+		switch (mask->long_size) {
+		case 4: mem_bswap_32(&mask->mask, mask->nr); break;
+		case 8: mem_bswap_64(&mask->mask, mask->nr); break;
+		default:
+			pr_err("cpu_map swap: unsupported long size\n");
+		}
+	default:
+		break;
+	}
+}
+
 typedef void (*perf_event__swap_op)(union perf_event *event,
 				    bool sample_id_all);
 
@@ -667,6 +714,7 @@ static perf_event__swap_op perf_event__swap_ops[] = {
 	[PERF_RECORD_AUXTRACE]		  = perf_event__auxtrace_swap,
 	[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_HEADER_MAX]	  = NULL,
 };
 
@@ -1205,6 +1253,8 @@ static s64 perf_session__process_user_event(struct perf_session *session,
 		return tool->auxtrace_error(tool, event, session);
 	case PERF_RECORD_THREAD_MAP:
 		return tool->thread_map(tool, event, session);
+	case PERF_RECORD_CPU_MAP:
+		return tool->cpu_map(tool, event, session);
 	default:
 		return -EINVAL;
 	}
diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
index 1af4774960c3..9e5925c78519 100644
--- a/tools/perf/util/tool.h
+++ b/tools/perf/util/tool.h
@@ -56,7 +56,8 @@ struct perf_tool {
 			id_index,
 			auxtrace_info,
 			auxtrace_error,
-			thread_map;
+			thread_map,
+			cpu_map;
 	event_op3	auxtrace;
 	bool		ordered_events;
 	bool		ordering_requires_timestamps;
-- 
2.1.0

--
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/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[GIT PULL 00/43] perf/core new feature: 'perf stat record/report' Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 08/43] perf cpu_map: Add perf_event__fprintf_cpu_map function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 06/43] perf cpu_map: Add cpu_map event synthesize function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 10/43] perf tools: Add stat config event synthesize function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 19/43] perf tools: Add event_update event unit type Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 09/43] perf tools: Add stat config user level event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 25/43] perf tools: Introduce stat perf.data header feature Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 24/43] perf report: Display newly added events in raw dump Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 07/43] perf cpu_map: Add cpu_map__new_event function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 40/43] perf stat report: Move csv_sep initialization before report command Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 05/43] perf cpu_map: Add cpu_map user level event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 18/43] perf tools: Add event_update user level event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 22/43] perf tools: Add event_update event cpus type Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 29/43] perf evlist: Export id_add_fd() Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 01/43] perf thread_map: Add thread_map user level event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 17/43] perf tools: Add stat events fprintf functions Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 39/43] perf stat report: Add support to initialize aggr_map from file Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 36/43] perf stat report: Add report command Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 03/43] perf thread_map: Add thread_map__new_event function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 16/43] perf tools: Add stat round event synthesize function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 28/43] perf stat record: Synthesize stat record data Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 35/43] perf stat record: Synthesize event update events Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 13/43] perf tools: Add stat event synthesize function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 26/43] perf stat record: Add record command Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 15/43] perf tools: Add stat round user level event Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 21/43] perf tools: Add event_update event name type Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 20/43] perf tools: Add event_update event scale type Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 33/43] perf stat record: Write stat round events on record Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 14/43] perf tools: Add stat event read function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:00 +0100
  [PATCH 02/43] perf thread_map: Add thread_map event sythesize function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:10 +0100
  [PATCH 04/43] perf thread_map: Add perf_event__fprintf_thread_map function Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-12-17 21:10 +0100
  Re: [GIT PULL 00/43] perf/core new feature: 'perf stat record/report' Ingo Molnar <mingo@kernel.org> - 2015-12-18 09:50 +0100
    Re: [GIT PULL 00/43] perf/core new feature: 'perf stat record/report' Ingo Molnar <mingo@kernel.org> - 2015-12-18 10:00 +0100
      Re: [GIT PULL 00/43] perf/core new feature: 'perf stat record/report' Jiri Olsa <jolsa@redhat.com> - 2015-12-18 11:20 +0100

csiph-web