mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ian Rogers <irogers@google.com>
To: Andi Kleen <ak@linux.intel.com>, Jiri Olsa <jolsa@redhat.com>,
	Namhyung Kim <namhyung@kernel.org>,
	John Garry <john.garry@huawei.com>,
	Kajol Jain <kjain@linux.ibm.com>,
	"Paul A . Clarke" <pc@us.ibm.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Riccardo Mancini <rickyman7@gmail.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
	Vineet Singh <vineet.singh@intel.com>,
	James Clark <james.clark@arm.com>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Mike Leach <mike.leach@linaro.org>, Leo Yan <leo.yan@linaro.org>,
	coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
	zhengjun.xing@intel.com
Cc: eranian@google.com, Ian Rogers <irogers@google.com>
Subject: [PATCH v4 18/48] perf cpumap: Refactor cpu_map__build_map
Date: Tue,  4 Jan 2022 22:13:21 -0800	[thread overview]
Message-ID: <20220105061351.120843-19-irogers@google.com> (raw)
In-Reply-To: <20220105061351.120843-1-irogers@google.com>

Turn it into a cpu_aggr_map__new. Pass helper functions. Refactor
builtin-stat calls to manually pass function pointers. Try to reduce
some copy-paste code.

Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/builtin-stat.c | 187 ++++++++++++++++++++------------------
 tools/perf/util/cpumap.c  |  59 +++++-------
 tools/perf/util/cpumap.h  |  16 ++--
 3 files changed, 130 insertions(+), 132 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index d229fb71b577..2b04a948cf37 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -1322,6 +1322,17 @@ static struct option stat_options[] = {
 	OPT_END()
 };
 
+static const char *const aggr_mode__string[] = {
+	[AGGR_CORE] = "core",
+	[AGGR_DIE] = "die",
+	[AGGR_GLOBAL] = "global",
+	[AGGR_NODE] = "node",
+	[AGGR_NONE] = "none",
+	[AGGR_SOCKET] = "socket",
+	[AGGR_THREAD] = "thread",
+	[AGGR_UNSET] = "unset",
+};
+
 static struct aggr_cpu_id perf_stat__get_socket(struct perf_stat_config *config __maybe_unused,
 						int cpu)
 {
@@ -1394,54 +1405,67 @@ static bool term_percore_set(void)
 	return false;
 }
 
-static int perf_stat_init_aggr_mode(void)
+static aggr_cpu_id_get_t aggr_mode__get_aggr(enum aggr_mode aggr_mode)
 {
-	int nr;
+	switch (aggr_mode) {
+	case AGGR_SOCKET:
+		return cpu_map__get_socket_aggr_by_cpu;
+	case AGGR_DIE:
+		return cpu_map__get_die_aggr_by_cpu;
+	case AGGR_CORE:
+		return cpu_map__get_core_aggr_by_cpu;
+	case AGGR_NODE:
+		return cpu_map__get_node_aggr_by_cpu;
+	case AGGR_NONE:
+		if (term_percore_set())
+			return cpu_map__get_core_aggr_by_cpu;
+
+		return NULL;
+	case AGGR_GLOBAL:
+	case AGGR_THREAD:
+	case AGGR_UNSET:
+	default:
+		return NULL;
+	}
+}
 
-	switch (stat_config.aggr_mode) {
+static aggr_get_id_t aggr_mode__get_id(enum aggr_mode aggr_mode)
+{
+	switch (aggr_mode) {
 	case AGGR_SOCKET:
-		if (cpu_map__build_socket_map(evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build socket map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_socket_cached;
-		break;
+		return perf_stat__get_socket_cached;
 	case AGGR_DIE:
-		if (cpu_map__build_die_map(evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build die map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_die_cached;
-		break;
+		return perf_stat__get_die_cached;
 	case AGGR_CORE:
-		if (cpu_map__build_core_map(evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build core map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_core_cached;
-		break;
+		return perf_stat__get_core_cached;
 	case AGGR_NODE:
-		if (cpu_map__build_node_map(evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build core map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_node_cached;
-		break;
+		return perf_stat__get_node_cached;
 	case AGGR_NONE:
 		if (term_percore_set()) {
-			if (cpu_map__build_core_map(evsel_list->core.cpus,
-						    &stat_config.aggr_map)) {
-				perror("cannot build core map");
-				return -1;
-			}
-			stat_config.aggr_get_id = perf_stat__get_core_cached;
+			return perf_stat__get_core_cached;
 		}
-		break;
+		return NULL;
 	case AGGR_GLOBAL:
 	case AGGR_THREAD:
 	case AGGR_UNSET:
 	default:
-		break;
+		return NULL;
+	}
+}
+
+static int perf_stat_init_aggr_mode(void)
+{
+	int nr;
+	aggr_cpu_id_get_t get_id = aggr_mode__get_aggr(stat_config.aggr_mode);
+
+	if (get_id) {
+		stat_config.aggr_map = cpu_aggr_map__new(evsel_list->core.cpus,
+							 get_id, /*data=*/NULL);
+		if (!stat_config.aggr_map) {
+			pr_err("cannot build %s map", aggr_mode__string[stat_config.aggr_mode]);
+			return -1;
+		}
+		stat_config.aggr_get_id = aggr_mode__get_id(stat_config.aggr_mode);
 	}
 
 	/*
@@ -1549,30 +1573,6 @@ static struct aggr_cpu_id perf_env__get_node_aggr_by_cpu(int cpu, void *data)
 	return id;
 }
 
-static int perf_env__build_socket_map(struct perf_env *env, struct perf_cpu_map *cpus,
-				      struct cpu_aggr_map **sockp)
-{
-	return cpu_map__build_map(cpus, sockp, perf_env__get_socket_aggr_by_cpu, env);
-}
-
-static int perf_env__build_die_map(struct perf_env *env, struct perf_cpu_map *cpus,
-				   struct cpu_aggr_map **diep)
-{
-	return cpu_map__build_map(cpus, diep, perf_env__get_die_aggr_by_cpu, env);
-}
-
-static int perf_env__build_core_map(struct perf_env *env, struct perf_cpu_map *cpus,
-				    struct cpu_aggr_map **corep)
-{
-	return cpu_map__build_map(cpus, corep, perf_env__get_core_aggr_by_cpu, env);
-}
-
-static int perf_env__build_node_map(struct perf_env *env, struct perf_cpu_map *cpus,
-				    struct cpu_aggr_map **nodep)
-{
-	return cpu_map__build_map(cpus, nodep, perf_env__get_node_aggr_by_cpu, env);
-}
-
 static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_config *config __maybe_unused,
 						     int cpu)
 {
@@ -1596,47 +1596,60 @@ static struct aggr_cpu_id perf_stat__get_node_file(struct perf_stat_config *conf
 	return perf_env__get_node_aggr_by_cpu(cpu, &perf_stat.session->header.env);
 }
 
-static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
+static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enum aggr_mode aggr_mode)
 {
-	struct perf_env *env = &st->session->header.env;
+	switch (aggr_mode) {
+	case AGGR_SOCKET:
+		return perf_env__get_socket_aggr_by_cpu;
+	case AGGR_DIE:
+		return perf_env__get_die_aggr_by_cpu;
+	case AGGR_CORE:
+		return perf_env__get_core_aggr_by_cpu;
+	case AGGR_NODE:
+		return perf_env__get_node_aggr_by_cpu;
+	case AGGR_NONE:
+	case AGGR_GLOBAL:
+	case AGGR_THREAD:
+	case AGGR_UNSET:
+	default:
+		return NULL;
+	}
+}
 
-	switch (stat_config.aggr_mode) {
+static aggr_get_id_t aggr_mode__get_id_file(enum aggr_mode aggr_mode)
+{
+	switch (aggr_mode) {
 	case AGGR_SOCKET:
-		if (perf_env__build_socket_map(env, evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build socket map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_socket_file;
-		break;
+		return perf_stat__get_socket_file;
 	case AGGR_DIE:
-		if (perf_env__build_die_map(env, evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build die map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_die_file;
-		break;
+		return perf_stat__get_die_file;
 	case AGGR_CORE:
-		if (perf_env__build_core_map(env, evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build core map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_core_file;
-		break;
+		return perf_stat__get_core_file;
 	case AGGR_NODE:
-		if (perf_env__build_node_map(env, evsel_list->core.cpus, &stat_config.aggr_map)) {
-			perror("cannot build core map");
-			return -1;
-		}
-		stat_config.aggr_get_id = perf_stat__get_node_file;
-		break;
+		return perf_stat__get_node_file;
 	case AGGR_NONE:
 	case AGGR_GLOBAL:
 	case AGGR_THREAD:
 	case AGGR_UNSET:
 	default:
-		break;
+		return NULL;
 	}
+}
+
+static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
+{
+	struct perf_env *env = &st->session->header.env;
+	aggr_cpu_id_get_t get_id = aggr_mode__get_aggr_file(stat_config.aggr_mode);
 
+	if (!get_id)
+		return 0;
+
+	stat_config.aggr_map = cpu_aggr_map__new(evsel_list->core.cpus, get_id, env);
+	if (!stat_config.aggr_map) {
+		pr_err("cannot build %s map", aggr_mode__string[stat_config.aggr_mode]);
+		return -1;
+	}
+	stat_config.aggr_get_id = aggr_mode__get_id_file(stat_config.aggr_mode);
 	return 0;
 }
 
diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
index 32f9fc2dd389..c8f9b3f15759 100644
--- a/tools/perf/util/cpumap.c
+++ b/tools/perf/util/cpumap.c
@@ -140,7 +140,7 @@ struct aggr_cpu_id cpu_map__get_socket_aggr_by_cpu(int cpu, void *data __maybe_u
 	return id;
 }
 
-static int cmp_aggr_cpu_id(const void *a_pointer, const void *b_pointer)
+static int aggr_cpu_id__cmp(const void *a_pointer, const void *b_pointer)
 {
 	struct aggr_cpu_id *a = (struct aggr_cpu_id *)a_pointer;
 	struct aggr_cpu_id *b = (struct aggr_cpu_id *)b_pointer;
@@ -157,37 +157,40 @@ static int cmp_aggr_cpu_id(const void *a_pointer, const void *b_pointer)
 		return a->thread - b->thread;
 }
 
-int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res,
-		       struct aggr_cpu_id (*f)(int cpu, void *data),
-		       void *data)
+struct cpu_aggr_map *cpu_aggr_map__new(const struct perf_cpu_map *cpus,
+				       aggr_cpu_id_get_t get_id,
+				       void *data)
 {
-	int nr = cpus->nr;
-	struct cpu_aggr_map *c = cpu_aggr_map__empty_new(nr);
-	int cpu, s2;
-	struct aggr_cpu_id s1;
+	int cpu, idx;
+	struct cpu_aggr_map *c = cpu_aggr_map__empty_new(cpus->nr);
 
 	if (!c)
-		return -1;
+		return NULL;
 
 	/* Reset size as it may only be partially filled */
 	c->nr = 0;
 
-	for (cpu = 0; cpu < nr; cpu++) {
-		s1 = f(cpu, data);
-		for (s2 = 0; s2 < c->nr; s2++) {
-			if (aggr_cpu_id__equal(&s1, &c->map[s2]))
+	perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
+		bool duplicate = false;
+		struct aggr_cpu_id cpu_id = get_id(cpu, data);
+
+		for (int j = 0; j < c->nr; j++) {
+			if (aggr_cpu_id__equal(&cpu_id, &c->map[j])) {
+				duplicate = true;
 				break;
+			}
 		}
-		if (s2 == c->nr) {
-			c->map[c->nr] = s1;
+		if (!duplicate) {
+			c->map[c->nr] = cpu_id;
 			c->nr++;
 		}
 	}
+
 	/* ensure we process id in increasing order */
-	qsort(c->map, c->nr, sizeof(struct aggr_cpu_id), cmp_aggr_cpu_id);
+	qsort(c->map, c->nr, sizeof(struct aggr_cpu_id), aggr_cpu_id__cmp);
+
+	return c;
 
-	*res = c;
-	return 0;
 }
 
 int cpu__get_die_id(int cpu)
@@ -253,26 +256,6 @@ struct aggr_cpu_id cpu_map__get_node_aggr_by_cpu(int cpu, void *data __maybe_unu
 	return id;
 }
 
-int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **sockp)
-{
-	return cpu_map__build_map(cpus, sockp, cpu_map__get_socket_aggr_by_cpu, NULL);
-}
-
-int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **diep)
-{
-	return cpu_map__build_map(cpus, diep, cpu_map__get_die_aggr_by_cpu, NULL);
-}
-
-int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **corep)
-{
-	return cpu_map__build_map(cpus, corep, cpu_map__get_core_aggr_by_cpu, NULL);
-}
-
-int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **numap)
-{
-	return cpu_map__build_map(cpus, numap, cpu_map__get_node_aggr_by_cpu, NULL);
-}
-
 /* setup simple routines to easily access node numbers given a cpu number */
 static int get_max_num(char *path, int *max)
 {
diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h
index 87545bcd461d..611048e2a592 100644
--- a/tools/perf/util/cpumap.h
+++ b/tools/perf/util/cpumap.h
@@ -43,10 +43,6 @@ struct aggr_cpu_id cpu_map__get_socket_aggr_by_cpu(int cpu, void *data);
 struct aggr_cpu_id cpu_map__get_die_aggr_by_cpu(int cpu, void *data);
 struct aggr_cpu_id cpu_map__get_core_aggr_by_cpu(int cpu, void *data);
 struct aggr_cpu_id cpu_map__get_node_aggr_by_cpu(int cpu, void *data);
-int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **sockp);
-int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **diep);
-int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **corep);
-int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **nodep);
 const struct perf_cpu_map *cpu_map__online(void); /* thread unsafe */
 
 int cpu__setup_cpunode_map(void);
@@ -75,10 +71,16 @@ int cpu__get_die_id(int cpu);
  */
 int cpu__get_core_id(int cpu);
 
+typedef struct aggr_cpu_id (*aggr_cpu_id_get_t)(int cpu, void *data);
 
-int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res,
-		       struct aggr_cpu_id (*f)(int cpu, void *data),
-		       void *data);
+/**
+ * cpu_aggr_map__new - Create a cpu_aggr_map with an aggr_cpu_id for each cpu in
+ * cpus. The aggr_cpu_id is created with 'get_id' that may have a data value
+ * passed to it. The cpu_aggr_map is sorted with duplicate values removed.
+ */
+struct cpu_aggr_map *cpu_aggr_map__new(const struct perf_cpu_map *cpus,
+				       aggr_cpu_id_get_t get_id,
+				       void *data);
 
 bool cpu_map__has(struct perf_cpu_map *cpus, int cpu);
 
-- 
2.34.1.448.ga2b2bfdf31-goog


  parent reply	other threads:[~2022-01-05  6:15 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-05  6:13 [PATCH v4 00/48] Refactor perf cpumap Ian Rogers
2022-01-05  6:13 ` [PATCH v4 01/48] libperf: Add comments to perf_cpu_map Ian Rogers
2022-01-10 17:00   ` John Garry
2022-01-12  5:35   ` kajoljain
2022-01-05  6:13 ` [PATCH v4 02/48] perf stat: Add aggr creators that are passed a cpu Ian Rogers
2022-01-10 17:10   ` John Garry
2022-01-10 17:36     ` Ian Rogers
2022-01-10 17:51       ` John Garry
2022-01-10 18:52       ` Arnaldo Carvalho de Melo
2022-01-10 18:53         ` Arnaldo Carvalho de Melo
2022-01-10 18:56           ` Arnaldo Carvalho de Melo
2022-01-10 19:17   ` John Garry
2022-01-11 19:33   ` Arnaldo Carvalho de Melo
2022-01-11 19:36     ` Ian Rogers
2022-01-11 19:56       ` Arnaldo Carvalho de Melo
2022-01-11 19:49     ` Arnaldo Carvalho de Melo
2022-01-05  6:13 ` [PATCH v4 03/48] perf stat: Correct aggregation CPU map Ian Rogers
2022-01-10 18:43   ` John Garry
2022-01-05  6:13 ` [PATCH v4 04/48] perf stat: Switch aggregation to use for_each loop Ian Rogers
2022-01-10 18:50   ` John Garry
2022-01-10 22:22     ` Ian Rogers
2022-01-05  6:13 ` [PATCH v4 05/48] perf stat: Switch to cpu version of cpu_map__get Ian Rogers
2022-01-10 19:04   ` John Garry
2022-01-11 18:46     ` Ian Rogers
2022-01-11 18:50       ` Arnaldo Carvalho de Melo
2022-01-05  6:13 ` [PATCH v4 06/48] perf cpumap: Switch cpu_map__build_map to cpu function Ian Rogers
2022-01-05  6:13 ` [PATCH v4 07/48] perf cpumap: Remove map+index get_socket Ian Rogers
2022-01-05  6:13 ` [PATCH v4 08/48] perf cpumap: Remove map+index get_die Ian Rogers
2022-01-05  6:13 ` [PATCH v4 09/48] perf cpumap: Remove map+index get_core Ian Rogers
2022-01-05  6:13 ` [PATCH v4 10/48] perf cpumap: Remove map+index get_node Ian Rogers
2022-01-05  6:13 ` [PATCH v4 11/48] perf cpumap: Add comments to aggr_cpu_id Ian Rogers
2022-01-05  6:13 ` [PATCH v4 12/48] perf cpumap: Remove unused cpu_map__socket Ian Rogers
2022-01-05  6:13 ` [PATCH v4 13/48] perf cpumap: Simplify equal function name Ian Rogers
2022-01-05  6:13 ` [PATCH v4 14/48] perf cpumap: Rename empty functions Ian Rogers
2022-01-05  6:13 ` [PATCH v4 15/48] perf cpumap: Document cpu__get_node and remove redundant function Ian Rogers
2022-01-05  6:13 ` [PATCH v4 16/48] perf cpumap: Remove map from function names that don't use a map Ian Rogers
2022-01-05  6:13 ` [PATCH v4 17/48] perf cpumap: Remove cpu_map__cpu, use libperf function Ian Rogers
2022-01-10 19:02   ` Arnaldo Carvalho de Melo
2022-01-10 19:04     ` Arnaldo Carvalho de Melo
2022-01-10 19:06       ` Arnaldo Carvalho de Melo
2022-01-05  6:13 ` Ian Rogers [this message]
2022-01-05  6:13 ` [PATCH v4 19/48] perf cpumap: Rename cpu_map__get_X_aggr_by_cpu functions Ian Rogers
2022-01-05  6:13 ` [PATCH v4 20/48] perf cpumap: Move 'has' function to libperf Ian Rogers
2022-01-05  6:13 ` [PATCH v4 21/48] perf cpumap: Add some comments to cpu_aggr_map Ian Rogers
2022-01-05  6:13 ` [PATCH v4 22/48] perf cpumap: Trim the cpu_aggr_map Ian Rogers
2022-01-05  6:13 ` [PATCH v4 23/48] perf stat: Fix memory leak in check_per_pkg Ian Rogers
2022-01-05  6:13 ` [PATCH v4 24/48] perf cpumap: Add CPU to aggr_cpu_id Ian Rogers
2022-01-05  6:13 ` [PATCH v4 25/48] perf stat-display: Avoid use of core for CPU Ian Rogers
2022-01-05  6:13 ` [PATCH v4 26/48] perf evsel: Derive CPUs and threads in alloc_counts Ian Rogers
2022-01-09 18:30   ` Jiri Olsa
2022-01-10  5:49     ` Ian Rogers
2022-01-05  6:13 ` [PATCH v4 27/48] libperf: Switch cpu to more accurate cpu_map_idx Ian Rogers
2022-01-05  6:13 ` [PATCH v4 28/48] libperf: Use cpu not index for evsel mmap Ian Rogers
2022-01-05  6:13 ` [PATCH v4 29/48] perf counts: Switch name cpu to cpu_map_idx Ian Rogers
2022-01-05  6:13 ` [PATCH v4 30/48] perf stat: Rename aggr_data cpu to imply it's an index Ian Rogers
2022-01-05  6:13 ` [PATCH v4 31/48] perf stat: Use perf_cpu_map__for_each_cpu Ian Rogers
2022-01-05  6:13 ` [PATCH v4 32/48] perf script: Use for each cpu to aid readability Ian Rogers
2022-01-05  6:13 ` [PATCH v4 33/48] libperf: Allow NULL in perf_cpu_map__idx Ian Rogers
2022-01-05  6:13 ` [PATCH v4 34/48] perf evlist: Refactor evlist__for_each_cpu Ian Rogers
2022-01-05  6:13 ` [PATCH v4 35/48] perf evsel: Pass cpu not cpu map index to synthesize Ian Rogers
2022-01-05  6:13 ` [PATCH v4 36/48] perf stat: Correct variable name for read counter Ian Rogers
2022-01-05  6:13 ` [PATCH v4 37/48] perf evsel: Rename CPU around get_group_fd Ian Rogers
2022-01-05  6:13 ` [PATCH v4 38/48] perf evsel: Reduce scope of evsel__ignore_missing_thread Ian Rogers
2022-01-05  6:13 ` [PATCH v4 39/48] perf evsel: Rename variable cpu to index Ian Rogers
2022-01-05  6:13 ` [PATCH v4 40/48] perf test: Use perf_cpu_map__for_each_cpu Ian Rogers
2022-01-05  6:13 ` [PATCH v4 41/48] perf stat: Correct check_per_pkg cpu Ian Rogers
2022-01-05  6:13 ` [PATCH v4 42/48] perf stat: Swap variable name cpu to index Ian Rogers
2022-01-05  6:13 ` [PATCH v4 43/48] libperf: Sync evsel documentation Ian Rogers
2022-01-05  6:13 ` [PATCH v4 44/48] perf bpf: Rename cpu to cpu_map_idx Ian Rogers
2022-01-10 19:10   ` Arnaldo Carvalho de Melo
2022-01-10 19:26     ` Arnaldo Carvalho de Melo
2022-01-05  6:13 ` [PATCH v4 45/48] perf c2c: Use more intention revealing iterator Ian Rogers
2022-01-05  6:13 ` [PATCH v4 46/48] perf script: Fix flipped index and cpu Ian Rogers
2022-01-05  6:13 ` [PATCH v4 47/48] perf stat: Correct first_shadow_cpu to return index Ian Rogers
2022-01-05  6:13 ` [PATCH v4 48/48] perf cpumap: Give CPUs their own type Ian Rogers
2022-01-09 18:30   ` Jiri Olsa
2022-01-10  5:45     ` Ian Rogers
2022-01-10 19:50   ` Arnaldo Carvalho de Melo
2022-01-11 19:16     ` Ian Rogers
2022-01-11 20:01       ` Arnaldo Carvalho de Melo
2022-01-11 20:47         ` Arnaldo Carvalho de Melo
2022-01-12 17:39         ` Arnaldo Carvalho de Melo
2022-01-12 18:02           ` Ian Rogers
2022-01-10 20:17 ` [PATCH v4 00/48] Refactor perf cpumap Arnaldo Carvalho de Melo
2022-01-10 20:40   ` Arnaldo Carvalho de Melo
2022-01-10 20:42     ` 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=20220105061351.120843-19-irogers@google.com \
    --to=irogers@google.com \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=coresight@lists.linaro.org \
    --cc=eranian@google.com \
    --cc=james.clark@arm.com \
    --cc=john.garry@huawei.com \
    --cc=jolsa@redhat.com \
    --cc=kan.liang@linux.intel.com \
    --cc=kjain@linux.ibm.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mathieu.poirier@linaro.org \
    --cc=mike.leach@linaro.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=pc@us.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rickyman7@gmail.com \
    --cc=suzuki.poulose@arm.com \
    --cc=vineet.singh@intel.com \
    --cc=zhengjun.xing@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome