perf stat aggregation: Add separate thread member
authorJames Clark <james.clark@arm.com>
Thu, 26 Nov 2020 14:13:28 +0000 (16:13 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 24 Dec 2020 13:05:28 +0000 (10:05 -0300)
A separate field isn't strictly required. The core field could be
re-used for thread IDs as a single field was used previously.

But separating them will avoid confusion and catch potential errors
where core IDs are read as thread IDs and vice versa.

Also remove the placeholder id field which is now no longer used.

Signed-off-by: James Clark <james.clark@arm.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: John Garry <john.garry@huawei.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Link: https://lore.kernel.org/r/20201126141328.6509-13-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/topology.c
tools/perf/util/cpumap.c
tools/perf/util/cpumap.h
tools/perf/util/stat-display.c

index a6e289f2c6dbd2a7fe613aec299c725a7c02a966..74748ed75b2c6318b18161a3507ee973bcacc988 100644 (file)
@@ -119,7 +119,7 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
                TEST_ASSERT_VAL("Core map - Die ID doesn't match",
                        session->header.env.cpu[map->map[i]].die_id == id.die);
                TEST_ASSERT_VAL("Core map - Node ID is set", id.node == -1);
-               TEST_ASSERT_VAL("Core map - ID is set", id.id == -1);
+               TEST_ASSERT_VAL("Core map - Thread is set", id.thread == -1);
        }
 
        // Test that die ID contains socket and die
@@ -132,8 +132,8 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
                        session->header.env.cpu[map->map[i]].die_id == id.die);
 
                TEST_ASSERT_VAL("Die map - Node ID is set", id.node == -1);
-               TEST_ASSERT_VAL("Die map - ID is set", id.id == -1);
                TEST_ASSERT_VAL("Die map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Die map - Thread is set", id.thread == -1);
        }
 
        // Test that socket ID contains only socket
@@ -144,8 +144,8 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
 
                TEST_ASSERT_VAL("Socket map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Socket map - Die ID is set", id.die == -1);
-               TEST_ASSERT_VAL("Socket map - ID is set", id.id == -1);
                TEST_ASSERT_VAL("Socket map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Socket map - Thread is set", id.thread == -1);
        }
 
        // Test that node ID contains only node
@@ -153,10 +153,10 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
                id = cpu_map__get_node(map, i, NULL);
                TEST_ASSERT_VAL("Node map - Node ID doesn't match",
                        cpu__get_node(map->map[i]) == id.node);
-               TEST_ASSERT_VAL("Node map - ID is set", id.id == -1);
                TEST_ASSERT_VAL("Node map - Socket is set", id.socket == -1);
                TEST_ASSERT_VAL("Node map - Die ID is set", id.die == -1);
                TEST_ASSERT_VAL("Node map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Node map - Thread is set", id.thread == -1);
        }
        perf_session__delete(session);
 
index d164f7bd1ac71d58edff0d5ee650cf777bb6d7d1..87d3eca9b872d81b86df3e5a38ec59aa149c458b 100644 (file)
@@ -148,16 +148,16 @@ static int cmp_aggr_cpu_id(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;
 
-       if (a->id != b->id)
-               return a->id - b->id;
-       else if (a->node != b->node)
+       if (a->node != b->node)
                return a->node - b->node;
        else if (a->socket != b->socket)
                return a->socket - b->socket;
        else if (a->die != b->die)
                return a->die - b->die;
-       else
+       else if (a->core != b->core)
                return a->core - b->core;
+       else
+               return a->thread - b->thread;
 }
 
 int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res,
@@ -616,7 +616,7 @@ const struct perf_cpu_map *cpu_map__online(void) /* thread unsafe */
 
 bool cpu_map__compare_aggr_cpu_id(struct aggr_cpu_id a, struct aggr_cpu_id b)
 {
-       return a.id == b.id &&
+       return a.thread == b.thread &&
                a.node == b.node &&
                a.socket == b.socket &&
                a.die == b.die &&
@@ -625,7 +625,7 @@ bool cpu_map__compare_aggr_cpu_id(struct aggr_cpu_id a, struct aggr_cpu_id b)
 
 bool cpu_map__aggr_cpu_id_is_empty(struct aggr_cpu_id a)
 {
-       return a.id == -1 &&
+       return a.thread == -1 &&
                a.node == -1 &&
                a.socket == -1 &&
                a.die == -1 &&
@@ -635,7 +635,7 @@ bool cpu_map__aggr_cpu_id_is_empty(struct aggr_cpu_id a)
 struct aggr_cpu_id cpu_map__empty_aggr_cpu_id(void)
 {
        struct aggr_cpu_id ret = {
-               .id = -1,
+               .thread = -1,
                .node = -1,
                .socket = -1,
                .die = -1,
index 1bb8f7d4720655beb5a0b10a7d283d26ef8436e2..a27eeaf086e8c2586b9f43fd80abbb73c034b097 100644 (file)
@@ -8,7 +8,7 @@
 #include <perf/cpumap.h>
 
 struct aggr_cpu_id {
-       int id;
+       int thread;
        int node;
        int socket;
        int die;
index 2b3842f6080d85a9d5ac26227c0a7bb3fa9d4fab..583ae4f09c5d152835fb312cab3919ba36d73f3c 100644 (file)
@@ -127,9 +127,9 @@ static void aggr_printout(struct perf_stat_config *config,
        case AGGR_THREAD:
                fprintf(config->output, "%*s-%*d%s",
                        config->csv_output ? 0 : 16,
-                       perf_thread_map__comm(evsel->core.threads, id.id),
+                       perf_thread_map__comm(evsel->core.threads, id.thread),
                        config->csv_output ? 0 : -8,
-                       perf_thread_map__pid(evsel->core.threads, id.id),
+                       perf_thread_map__pid(evsel->core.threads, id.thread),
                        config->csv_sep);
                break;
        case AGGR_GLOBAL:
@@ -740,7 +740,7 @@ static struct perf_aggr_thread_value *sort_aggr_thread(
 
                buf[i].counter = counter;
                buf[i].id = cpu_map__empty_aggr_cpu_id();
-               buf[i].id.id = thread;
+               buf[i].id.thread = thread;
                buf[i].uval = uval;
                buf[i].val = val;
                buf[i].run = run;
@@ -781,7 +781,7 @@ static void print_aggr_thread(struct perf_stat_config *config,
                if (config->stats)
                        printout(config, id, 0, buf[thread].counter, buf[thread].uval,
                                 prefix, buf[thread].run, buf[thread].ena, 1.0,
-                                &config->stats[id.id]);
+                                &config->stats[id.thread]);
                else
                        printout(config, id, 0, buf[thread].counter, buf[thread].uval,
                                 prefix, buf[thread].run, buf[thread].ena, 1.0,