All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Clark Williams <williams@redhat.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Kan Liang <kan.liang@linux.intel.com>,
	Andi Kleen <ak@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 56/85] perf stat: Support per-die aggregation
Date: Tue, 11 Jun 2019 15:58:42 -0300	[thread overview]
Message-ID: <20190611185911.11645-57-acme@kernel.org> (raw)
In-Reply-To: <20190611185911.11645-1-acme@kernel.org>

From: Kan Liang <kan.liang@linux.intel.com>

It is useful to aggregate counts per die. E.g. Uncore becomes die-scope
on Xeon Cascade Lake-AP.

Introduce a new option "--per-die" to support per-die aggregation.

The global id for each core has been changed to socket + die id + core
id. The global id for each die is socket + die id.

Add die information for per-core aggregation. The output of per-core
aggregation will be changed from "S0-C0" to "S0-D0-C0". Any scripts
which rely on the output format of per-core aggregation probably be
broken.

For 'perf stat record/report', there is no die information when
processing the old perf.data. The per-die result will be the same as
per-socket.

Committer notes:

Renamed 'die' variable to 'die_id' to fix the build in some systems:

    CC       /tmp/build/perf/builtin-script.o
  cc1: warnings being treated as errors
  builtin-stat.c: In function 'perf_env__get_die':
  builtin-stat.c:963: error: declaration of 'die' shadows a global declaration
  util/util.h:19: error: shadowed declaration is here
  mv: cannot stat `/tmp/build/perf/.builtin-stat.o.tmp': No such file or directory

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/n/tip-bsnhx7vgsuu6ei307mw60mbj@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Documentation/perf-stat.txt | 10 +++
 tools/perf/builtin-stat.c              | 87 ++++++++++++++++++++++++--
 tools/perf/util/cpumap.c               | 57 ++++++++++++++---
 tools/perf/util/cpumap.h               |  9 ++-
 tools/perf/util/stat-display.c         | 29 +++++++--
 tools/perf/util/stat-shadow.c          |  1 +
 tools/perf/util/stat.c                 |  1 +
 tools/perf/util/stat.h                 |  1 +
 8 files changed, 177 insertions(+), 18 deletions(-)

diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 1e312c2672e4..930c51c01201 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -200,6 +200,13 @@ use --per-socket in addition to -a. (system-wide).  The output includes the
 socket number and the number of online processors on that socket. This is
 useful to gauge the amount of aggregation.
 
+--per-die::
+Aggregate counts per processor die for system-wide mode measurements.  This
+is a useful mode to detect imbalance between dies.  To enable this mode,
+use --per-die in addition to -a. (system-wide).  The output includes the
+die number and the number of online processors on that die. This is
+useful to gauge the amount of aggregation.
+
 --per-core::
 Aggregate counts per physical processor for system-wide mode measurements.  This
 is a useful mode to detect imbalance between physical cores.  To enable this mode,
@@ -239,6 +246,9 @@ Input file name.
 --per-socket::
 Aggregate counts per processor socket for system-wide mode measurements.
 
+--per-die::
+Aggregate counts per processor die for system-wide mode measurements.
+
 --per-core::
 Aggregate counts per physical processor for system-wide mode measurements.
 
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 24b8e690fb69..272df8426f0a 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -777,6 +777,8 @@ static struct option stat_options[] = {
 		    "stop workload and print counts after a timeout period in ms (>= 10ms)"),
 	OPT_SET_UINT(0, "per-socket", &stat_config.aggr_mode,
 		     "aggregate counts per processor socket", AGGR_SOCKET),
+	OPT_SET_UINT(0, "per-die", &stat_config.aggr_mode,
+		     "aggregate counts per processor die", AGGR_DIE),
 	OPT_SET_UINT(0, "per-core", &stat_config.aggr_mode,
 		     "aggregate counts per physical processor core", AGGR_CORE),
 	OPT_SET_UINT(0, "per-thread", &stat_config.aggr_mode,
@@ -801,6 +803,12 @@ static int perf_stat__get_socket(struct perf_stat_config *config __maybe_unused,
 	return cpu_map__get_socket(map, cpu, NULL);
 }
 
+static int perf_stat__get_die(struct perf_stat_config *config __maybe_unused,
+			      struct cpu_map *map, int cpu)
+{
+	return cpu_map__get_die(map, cpu, NULL);
+}
+
 static int perf_stat__get_core(struct perf_stat_config *config __maybe_unused,
 			       struct cpu_map *map, int cpu)
 {
@@ -841,6 +849,12 @@ static int perf_stat__get_socket_cached(struct perf_stat_config *config,
 	return perf_stat__get_aggr(config, perf_stat__get_socket, map, idx);
 }
 
+static int perf_stat__get_die_cached(struct perf_stat_config *config,
+					struct cpu_map *map, int idx)
+{
+	return perf_stat__get_aggr(config, perf_stat__get_die, map, idx);
+}
+
 static int perf_stat__get_core_cached(struct perf_stat_config *config,
 				      struct cpu_map *map, int idx)
 {
@@ -871,6 +885,13 @@ static int perf_stat_init_aggr_mode(void)
 		}
 		stat_config.aggr_get_id = perf_stat__get_socket_cached;
 		break;
+	case AGGR_DIE:
+		if (cpu_map__build_die_map(evsel_list->cpus, &stat_config.aggr_map)) {
+			perror("cannot build die map");
+			return -1;
+		}
+		stat_config.aggr_get_id = perf_stat__get_die_cached;
+		break;
 	case AGGR_CORE:
 		if (cpu_map__build_core_map(evsel_list->cpus, &stat_config.aggr_map)) {
 			perror("cannot build core map");
@@ -936,21 +957,55 @@ static int perf_env__get_socket(struct cpu_map *map, int idx, void *data)
 	return cpu == -1 ? -1 : env->cpu[cpu].socket_id;
 }
 
+static int perf_env__get_die(struct cpu_map *map, int idx, void *data)
+{
+	struct perf_env *env = data;
+	int die_id = -1, cpu = perf_env__get_cpu(env, map, idx);
+
+	if (cpu != -1) {
+		/*
+		 * Encode socket in bit range 15:8
+		 * die_id is relative to socket,
+		 * we need a global id. So we combine
+		 * socket + die id
+		 */
+		if (WARN_ONCE(env->cpu[cpu].socket_id >> 8, "The socket id number is too big.\n"))
+			return -1;
+
+		if (WARN_ONCE(env->cpu[cpu].die_id >> 8, "The die id number is too big.\n"))
+			return -1;
+
+		die_id = (env->cpu[cpu].socket_id << 8) | (env->cpu[cpu].die_id & 0xff);
+	}
+
+	return die_id;
+}
+
 static int perf_env__get_core(struct cpu_map *map, int idx, void *data)
 {
 	struct perf_env *env = data;
 	int core = -1, cpu = perf_env__get_cpu(env, map, idx);
 
 	if (cpu != -1) {
-		int socket_id = env->cpu[cpu].socket_id;
-
 		/*
-		 * Encode socket in upper 16 bits
-		 * core_id is relative to socket, and
+		 * Encode socket in bit range 31:24
+		 * encode die id in bit range 23:16
+		 * core_id is relative to socket and die,
 		 * we need a global id. So we combine
-		 * socket + core id.
+		 * socket + die id + core id
 		 */
-		core = (socket_id << 16) | (env->cpu[cpu].core_id & 0xffff);
+		if (WARN_ONCE(env->cpu[cpu].socket_id >> 8, "The socket id number is too big.\n"))
+			return -1;
+
+		if (WARN_ONCE(env->cpu[cpu].die_id >> 8, "The die id number is too big.\n"))
+			return -1;
+
+		if (WARN_ONCE(env->cpu[cpu].core_id >> 16, "The core id number is too big.\n"))
+			return -1;
+
+		core = (env->cpu[cpu].socket_id << 24) |
+		       (env->cpu[cpu].die_id << 16) |
+		       (env->cpu[cpu].core_id & 0xffff);
 	}
 
 	return core;
@@ -962,6 +1017,12 @@ static int perf_env__build_socket_map(struct perf_env *env, struct cpu_map *cpus
 	return cpu_map__build_map(cpus, sockp, perf_env__get_socket, env);
 }
 
+static int perf_env__build_die_map(struct perf_env *env, struct cpu_map *cpus,
+				   struct cpu_map **diep)
+{
+	return cpu_map__build_map(cpus, diep, perf_env__get_die, env);
+}
+
 static int perf_env__build_core_map(struct perf_env *env, struct cpu_map *cpus,
 				    struct cpu_map **corep)
 {
@@ -973,6 +1034,11 @@ static int perf_stat__get_socket_file(struct perf_stat_config *config __maybe_un
 {
 	return perf_env__get_socket(map, idx, &perf_stat.session->header.env);
 }
+static int perf_stat__get_die_file(struct perf_stat_config *config __maybe_unused,
+				   struct cpu_map *map, int idx)
+{
+	return perf_env__get_die(map, idx, &perf_stat.session->header.env);
+}
 
 static int perf_stat__get_core_file(struct perf_stat_config *config __maybe_unused,
 				    struct cpu_map *map, int idx)
@@ -992,6 +1058,13 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
 		}
 		stat_config.aggr_get_id = perf_stat__get_socket_file;
 		break;
+	case AGGR_DIE:
+		if (perf_env__build_die_map(env, evsel_list->cpus, &stat_config.aggr_map)) {
+			perror("cannot build die map");
+			return -1;
+		}
+		stat_config.aggr_get_id = perf_stat__get_die_file;
+		break;
 	case AGGR_CORE:
 		if (perf_env__build_core_map(env, evsel_list->cpus, &stat_config.aggr_map)) {
 			perror("cannot build core map");
@@ -1542,6 +1615,8 @@ static int __cmd_report(int argc, const char **argv)
 	OPT_STRING('i', "input", &input_name, "file", "input file name"),
 	OPT_SET_UINT(0, "per-socket", &perf_stat.aggr_mode,
 		     "aggregate counts per processor socket", AGGR_SOCKET),
+	OPT_SET_UINT(0, "per-die", &perf_stat.aggr_mode,
+		     "aggregate counts per processor die", AGGR_DIE),
 	OPT_SET_UINT(0, "per-core", &perf_stat.aggr_mode,
 		     "aggregate counts per physical processor core", AGGR_CORE),
 	OPT_SET_UINT('A', "no-aggr", &perf_stat.aggr_mode,
diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
index 7db1365c667e..c11a459ca582 100644
--- a/tools/perf/util/cpumap.c
+++ b/tools/perf/util/cpumap.c
@@ -380,6 +380,39 @@ int cpu_map__get_die_id(int cpu)
 	return ret ?: value;
 }
 
+int cpu_map__get_die(struct cpu_map *map, int idx, void *data)
+{
+	int cpu, die_id, s;
+
+	if (idx > map->nr)
+		return -1;
+
+	cpu = map->map[idx];
+
+	die_id = cpu_map__get_die_id(cpu);
+	/* There is no die_id on legacy system. */
+	if (die_id == -1)
+		die_id = 0;
+
+	s = cpu_map__get_socket(map, idx, data);
+	if (s == -1)
+		return -1;
+
+	/*
+	 * Encode socket in bit range 15:8
+	 * die_id is relative to socket, and
+	 * we need a global id. So we combine
+	 * socket + die id
+	 */
+	if (WARN_ONCE(die_id >> 8, "The die id number is too big.\n"))
+		return -1;
+
+	if (WARN_ONCE(s >> 8, "The socket id number is too big.\n"))
+		return -1;
+
+	return (s << 8) | (die_id & 0xff);
+}
+
 int cpu_map__get_core_id(int cpu)
 {
 	int value, ret = cpu__get_topology_int(cpu, "core_id", &value);
@@ -388,7 +421,7 @@ int cpu_map__get_core_id(int cpu)
 
 int cpu_map__get_core(struct cpu_map *map, int idx, void *data)
 {
-	int cpu, s;
+	int cpu, s_die;
 
 	if (idx > map->nr)
 		return -1;
@@ -397,17 +430,22 @@ int cpu_map__get_core(struct cpu_map *map, int idx, void *data)
 
 	cpu = cpu_map__get_core_id(cpu);
 
-	s = cpu_map__get_socket(map, idx, data);
-	if (s == -1)
+	/* s_die is the combination of socket + die id */
+	s_die = cpu_map__get_die(map, idx, data);
+	if (s_die == -1)
 		return -1;
 
 	/*
-	 * encode socket in upper 16 bits
-	 * core_id is relative to socket, and
+	 * encode socket in bit range 31:24
+	 * encode die id in bit range 23:16
+	 * core_id is relative to socket and die,
 	 * we need a global id. So we combine
-	 * socket+ core id
+	 * socket + die id + core id
 	 */
-	return (s << 16) | (cpu & 0xffff);
+	if (WARN_ONCE(cpu >> 16, "The core id number is too big.\n"))
+		return -1;
+
+	return (s_die << 16) | (cpu & 0xffff);
 }
 
 int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp)
@@ -415,6 +453,11 @@ int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp)
 	return cpu_map__build_map(cpus, sockp, cpu_map__get_socket, NULL);
 }
 
+int cpu_map__build_die_map(struct cpu_map *cpus, struct cpu_map **diep)
+{
+	return cpu_map__build_map(cpus, diep, cpu_map__get_die, NULL);
+}
+
 int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep)
 {
 	return cpu_map__build_map(cpus, corep, cpu_map__get_core, NULL);
diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h
index 6762ff9e7ad5..1265f0e33920 100644
--- a/tools/perf/util/cpumap.h
+++ b/tools/perf/util/cpumap.h
@@ -26,9 +26,11 @@ size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
 int cpu_map__get_socket_id(int cpu);
 int cpu_map__get_socket(struct cpu_map *map, int idx, void *data);
 int cpu_map__get_die_id(int cpu);
+int cpu_map__get_die(struct cpu_map *map, int idx, void *data);
 int cpu_map__get_core_id(int cpu);
 int cpu_map__get_core(struct cpu_map *map, int idx, void *data);
 int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp);
+int cpu_map__build_die_map(struct cpu_map *cpus, struct cpu_map **diep);
 int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep);
 const struct cpu_map *cpu_map__online(void); /* thread unsafe */
 
@@ -44,7 +46,12 @@ static inline int cpu_map__socket(struct cpu_map *sock, int s)
 
 static inline int cpu_map__id_to_socket(int id)
 {
-	return id >> 16;
+	return id >> 24;
+}
+
+static inline int cpu_map__id_to_die(int id)
+{
+	return (id >> 16) & 0xff;
 }
 
 static inline int cpu_map__id_to_cpu(int id)
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 4c53bae5644b..a6b9de3e83fc 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -69,8 +69,9 @@ static void aggr_printout(struct perf_stat_config *config,
 {
 	switch (config->aggr_mode) {
 	case AGGR_CORE:
-		fprintf(config->output, "S%d-C%*d%s%*d%s",
+		fprintf(config->output, "S%d-D%d-C%*d%s%*d%s",
 			cpu_map__id_to_socket(id),
+			cpu_map__id_to_die(id),
 			config->csv_output ? 0 : -8,
 			cpu_map__id_to_cpu(id),
 			config->csv_sep,
@@ -78,6 +79,16 @@ static void aggr_printout(struct perf_stat_config *config,
 			nr,
 			config->csv_sep);
 		break;
+	case AGGR_DIE:
+		fprintf(config->output, "S%d-D%*d%s%*d%s",
+			cpu_map__id_to_socket(id << 16),
+			config->csv_output ? 0 : -8,
+			cpu_map__id_to_die(id << 16),
+			config->csv_sep,
+			config->csv_output ? 0 : 4,
+			nr,
+			config->csv_sep);
+		break;
 	case AGGR_SOCKET:
 		fprintf(config->output, "S%*d%s%*d%s",
 			config->csv_output ? 0 : -5,
@@ -89,8 +100,9 @@ static void aggr_printout(struct perf_stat_config *config,
 			break;
 	case AGGR_NONE:
 		if (evsel->percore) {
-			fprintf(config->output, "S%d-C%*d%s",
+			fprintf(config->output, "S%d-D%d-C%*d%s",
 				cpu_map__id_to_socket(id),
+				cpu_map__id_to_die(id),
 				config->csv_output ? 0 : -5,
 				cpu_map__id_to_cpu(id), config->csv_sep);
 		} else {
@@ -407,6 +419,7 @@ static void printout(struct perf_stat_config *config, int id, int nr,
 			[AGGR_THREAD] = 1,
 			[AGGR_NONE] = 1,
 			[AGGR_SOCKET] = 2,
+			[AGGR_DIE] = 2,
 			[AGGR_CORE] = 2,
 		};
 
@@ -879,7 +892,8 @@ static void print_no_aggr_metric(struct perf_stat_config *config,
 }
 
 static int aggr_header_lens[] = {
-	[AGGR_CORE] = 18,
+	[AGGR_CORE] = 24,
+	[AGGR_DIE] = 18,
 	[AGGR_SOCKET] = 12,
 	[AGGR_NONE] = 6,
 	[AGGR_THREAD] = 24,
@@ -888,6 +902,7 @@ static int aggr_header_lens[] = {
 
 static const char *aggr_header_csv[] = {
 	[AGGR_CORE] 	= 	"core,cpus,",
+	[AGGR_DIE] 	= 	"die,cpus",
 	[AGGR_SOCKET] 	= 	"socket,cpus",
 	[AGGR_NONE] 	= 	"cpu,",
 	[AGGR_THREAD] 	= 	"comm-pid,",
@@ -954,8 +969,13 @@ static void print_interval(struct perf_stat_config *config,
 			if (!metric_only)
 				fprintf(output, "             counts %*s events\n", unit_width, "unit");
 			break;
+		case AGGR_DIE:
+			fprintf(output, "#           time die          cpus");
+			if (!metric_only)
+				fprintf(output, "             counts %*s events\n", unit_width, "unit");
+			break;
 		case AGGR_CORE:
-			fprintf(output, "#           time core         cpus");
+			fprintf(output, "#           time core            cpus");
 			if (!metric_only)
 				fprintf(output, "             counts %*s events\n", unit_width, "unit");
 			break;
@@ -1165,6 +1185,7 @@ perf_evlist__print_counters(struct perf_evlist *evlist,
 
 	switch (config->aggr_mode) {
 	case AGGR_CORE:
+	case AGGR_DIE:
 	case AGGR_SOCKET:
 		print_aggr(config, evlist, prefix);
 		break;
diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
index 83d8094be4fe..027b09aaa4cf 100644
--- a/tools/perf/util/stat-shadow.c
+++ b/tools/perf/util/stat-shadow.c
@@ -12,6 +12,7 @@
 /*
  * AGGR_GLOBAL: Use CPU 0
  * AGGR_SOCKET: Use first CPU of socket
+ * AGGR_DIE: Use first CPU of die
  * AGGR_CORE: Use first CPU of core
  * AGGR_NONE: Use matching CPU
  * AGGR_THREAD: Not supported?
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index c3115d939b0b..d91fe754b6d2 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -272,6 +272,7 @@ process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel
 	switch (config->aggr_mode) {
 	case AGGR_THREAD:
 	case AGGR_CORE:
+	case AGGR_DIE:
 	case AGGR_SOCKET:
 	case AGGR_NONE:
 		if (!evsel->snapshot)
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index 2f9c9159a364..7032dd1eeac2 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -44,6 +44,7 @@ enum aggr_mode {
 	AGGR_NONE,
 	AGGR_GLOBAL,
 	AGGR_SOCKET,
+	AGGR_DIE,
 	AGGR_CORE,
 	AGGR_THREAD,
 	AGGR_UNSET,
-- 
2.20.1

  parent reply	other threads:[~2019-06-11 18:58 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-11 18:57 [GIT PULL] perf/core improvements and fixes Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 01/85] perf data: Add description of header HEADER_BPF_PROG_INFO and HEADER_BPF_BTF Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 02/85] perf data: Document memory topology header: HEADER_MEM_TOPOLOGY Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 03/85] perf data: Document clockid header: HEADER_CLOCKID Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 04/85] perf data: Document directory format header: HEADER_DIR_FORMAT Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 05/85] perf symbols: Remove unused variable 'err' Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 06/85] perf record: Allow mixing --user-regs with --call-graph=dwarf Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 07/85] perf intel-pt: Factor out intel_pt_update_sample_time Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 08/85] perf intel-pt: Accumulate cycle count from CYC packets Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 09/85] perf tools: Add IPC information to perf_sample Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 10/85] perf intel-pt: Add support for samples to contain IPC ratio Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 11/85] perf script: Add output of " Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 12/85] perf intel-pt: Record when decoding PSB+ packets Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 13/85] perf intel-pt: Re-factor TIP cases in intel_pt_walk_to_ip Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 14/85] perf intel-pt: Accumulate cycle count from TSC/TMA/MTC packets Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 15/85] perf intel-pt: Document IPC usage Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 16/85] perf thread-stack: Accumulate IPC information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 17/85] perf db-export: Add brief documentation Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 18/85] perf db-export: Export IPC information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 19/85] perf scripts python: export-to-sqlite.py: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 20/85] perf scripts python: export-to-postgresql.py: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 21/85] perf scripts python: exported-sql-viewer.py: Add IPC information to the Branch reports Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 22/85] perf scripts python: exported-sql-viewer.py: Add CallGraphModelParams Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 23/85] perf scripts python: exported-sql-viewer.py: Add IPC information to Call Graph Graph Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 24/85] perf scripts python: exported-sql-viewer.py: Add IPC information to Call Tree Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 25/85] perf scripts python: exported-sql-viewer.py: Select find text when find bar is activated Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 26/85] perf augmented_raw_syscalls: Tell which args are filenames and how many bytes to copy Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 27/85] perf augmented_raw_syscalls: Move the probe_read_str to a separate function Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 28/85] perf augmented_raw_syscalls: Change helper to consider just the augmented_filename part Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 29/85] perf augmented_raw_syscalls: Move reading filename to the loop Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 30/85] perf jvmti: Address gcc string overflow warning for strncpy() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 31/85] perf trace: Consume the augmented_raw_syscalls payload Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 32/85] perf trace: Associate more argument names with the filename beautifier Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 33/85] perf trace: Exit when failing to build eBPF program Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 34/85] perf config: Bail out when a handler returns failure for a key-value pair Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 35/85] perf record: Add support to collect callchains from kernel or user space only Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 36/85] perf evsel: Remove superfluous nthreads system_wide setup in alloc_fd() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 37/85] perf cs-etm: Configure contextID tracing in CPU-wide mode Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 38/85] perf cs-etm: Configure timestamp generation " Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 39/85] perf cs-etm: Configure SWITCH_EVENTS " Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 40/85] perf cs-etm: Add handling of itrace start events Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 41/85] perf cs-etm: Add handling of switch-CPU-wide events Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 42/85] perf cs-etm: Refactor error path in cs_etm_decoder__new() Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 43/85] perf cs-etm: Move packet queue out of decoder structure Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 44/85] perf cs-etm: Fix indentation in function cs_etm__process_decoder_queue() Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 45/85] perf cs-etm: Introduce the concept of trace ID queues Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 46/85] perf cs-etm: Get rid of unused cpu in struct cs_etm_queue Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 47/85] perf cs-etm: Move thread to traceid_queue Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 48/85] perf cs-etm: Move tid/pid " Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 49/85] perf cs-etm: Use traceID aware memory callback API Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 50/85] perf cs-etm: Add support for multiple traceID queues Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 51/85] perf cs-etm: Linking PE contextID with perf thread mechanic Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 52/85] perf cs-etm: Add notion of time to decoding code Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 53/85] perf cs-etm: Add support for CPU-wide trace scenarios Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 54/85] perf cpumap: Retrieve die id information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 55/85] perf header: Add die information in CPU topology Arnaldo Carvalho de Melo
2019-06-11 18:58 ` Arnaldo Carvalho de Melo [this message]
2019-06-11 18:58 ` [PATCH 57/85] perf header: Rename "sibling cores" to "sibling sockets" Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 58/85] perf tools: Apply new CPU topology sysfs attributes Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 59/85] perf data: Fix perf.data documentation for HEADER_CPU_TOPOLOGY Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 60/85] perf cs-etm: Properly set the value of 'old' and 'head' in snapshot mode Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 61/85] perf cs-etm: Remove duplicate GENMASK() define, use linux/bits.h instead Arnaldo Carvalho de Melo
2019-06-11 18:58   ` Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 62/85] perf config: Update default value for llvm.clang-bpf-cmd-template Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 63/85] perf auxtrace: Add perf time interval to itrace_synth_ops Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 64/85] perf script: Set perf time interval in itrace_synth_ops Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 65/85] perf report: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 66/85] perf intel-pt: Add lookahead callback Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 67/85] perf intel-pt: Factor out intel_pt_8b_tsc() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 68/85] perf intel-pt: Factor out intel_pt_reposition() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 69/85] perf intel-pt: Add reposition parameter to intel_pt_get_data() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 70/85] perf intel-pt: Add intel_pt_fast_forward() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 71/85] perf intel-pt: Factor out intel_pt_get_buffer() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 72/85] perf intel-pt: Add support for lookahead Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 73/85] perf intel-pt: Add support for efficient time interval filtering Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 74/85] perf time-utils: Treat time ranges consistently Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 75/85] perf time-utils: Factor out set_percent_time() Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 76/85] perf time-utils: Prevent percentage time range overlap Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 77/85] perf time-utils: Fix --time documentation Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 78/85] perf time-utils: Simplify perf_time__parse_for_ranges() error paths slightly Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 79/85] perf time-utils: Make perf_time__parse_for_ranges() more logical Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 80/85] perf tests: Add a test for time-utils Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 81/85] perf time-utils: Add support for multiple explicit time intervals Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 82/85] perf test 6: Fix missing kvm module load for s390 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 83/85] perf report: Fix OOM error in TUI mode on s390 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 84/85] perf report: Support s390 diag event display on x86 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 85/85] perf trace: Skip unknown syscalls when expanding strace like syscall groups Arnaldo Carvalho de Melo
2019-06-17 18:48 ` [GIT PULL] perf/core improvements and fixes Ingo Molnar

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=20190611185911.11645-57-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=williams@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.