perf cpumap: Use perf_cpu_map__for_each_cpu when possible
authorIan Rogers <irogers@google.com>
Fri, 2 Feb 2024 23:40:57 +0000 (15:40 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 21 Mar 2024 13:41:28 +0000 (10:41 -0300)
Rather than manually iterating the CPU map, use
perf_cpu_map__for_each_cpu(). When possible tidy local variables.

Reviewed-by: James Clark <james.clark@arm.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
Cc: Andrew Jones <ajones@ventanamicro.com>
Cc: André Almeida <andrealmeid@igalia.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Atish Patra <atishp@rivosinc.com>
Cc: Changbin Du <changbin.du@huawei.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Paran Lee <p4ranlee@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Steinar H. Gunderson <sesse@google.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Yang Li <yang.lee@linux.alibaba.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Link: https://lore.kernel.org/r/20240202234057.2085863-9-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/arm64/util/header.c
tools/perf/tests/bitmap.c
tools/perf/tests/topology.c
tools/perf/util/bpf_kwork.c
tools/perf/util/bpf_kwork_top.c
tools/perf/util/cpumap.c
tools/perf/util/scripting-engines/trace-event-python.c
tools/perf/util/session.c
tools/perf/util/svghelper.c

index a9de0b5187dd4f7488e8ac1cf5be873012cfa4d2..741df3614a09acb21c05f23864251d27926564d5 100644 (file)
@@ -4,8 +4,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <perf/cpumap.h>
-#include <util/cpumap.h>
-#include <internal/cpumap.h>
 #include <api/fs/fs.h>
 #include <errno.h>
 #include "debug.h"
 static int _get_cpuid(char *buf, size_t sz, struct perf_cpu_map *cpus)
 {
        const char *sysfs = sysfs__mountpoint();
-       int cpu;
-       int ret = EINVAL;
+       struct perf_cpu cpu;
+       int idx, ret = EINVAL;
 
        if (!sysfs || sz < MIDR_SIZE)
                return EINVAL;
 
-       for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
+       perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
                char path[PATH_MAX];
                FILE *file;
 
                scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d" MIDR,
-                         sysfs, RC_CHK_ACCESS(cpus)->map[cpu].cpu);
+                         sysfs, cpu.cpu);
 
                file = fopen(path, "r");
                if (!file) {
index 0173f5402a35b9c2e58a38f3515f7e138586f192..98956e0e076559bebcfed91f61791b6eb1a65b63 100644 (file)
 static unsigned long *get_bitmap(const char *str, int nbits)
 {
        struct perf_cpu_map *map = perf_cpu_map__new(str);
-       unsigned long *bm = NULL;
-       int i;
+       unsigned long *bm;
 
        bm = bitmap_zalloc(nbits);
 
        if (map && bm) {
-               for (i = 0; i < perf_cpu_map__nr(map); i++)
-                       __set_bit(perf_cpu_map__cpu(map, i).cpu, bm);
+               int i;
+               struct perf_cpu cpu;
+
+               perf_cpu_map__for_each_cpu(cpu, i, map)
+                       __set_bit(cpu.cpu, bm);
        }
 
-       if (map)
-               perf_cpu_map__put(map);
+       perf_cpu_map__put(map);
        return bm;
 }
 
index 2a842f53fbb575a2f715d66898ff1bb6553dfa7f..a8cb5ba898ab3a0411bab99fc9097cfb2504bbcd 100644 (file)
@@ -68,6 +68,7 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
        };
        int i;
        struct aggr_cpu_id id;
+       struct perf_cpu cpu;
 
        session = perf_session__new(&data, NULL);
        TEST_ASSERT_VAL("can't get session", !IS_ERR(session));
@@ -113,8 +114,7 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
        TEST_ASSERT_VAL("Session header CPU map not set", session->header.env.cpu);
 
        for (i = 0; i < session->header.env.nr_cpus_avail; i++) {
-               struct perf_cpu cpu = { .cpu = i };
-
+               cpu.cpu = i;
                if (!perf_cpu_map__has(map, cpu))
                        continue;
                pr_debug("CPU %d, core %d, socket %d\n", i,
@@ -123,48 +123,48 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
        }
 
        // Test that CPU ID contains socket, die, core and CPU
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               id = aggr_cpu_id__cpu(perf_cpu_map__cpu(map, i), NULL);
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
+               id = aggr_cpu_id__cpu(cpu, NULL);
                TEST_ASSERT_VAL("Cpu map - CPU ID doesn't match",
-                               perf_cpu_map__cpu(map, i).cpu == id.cpu.cpu);
+                               cpu.cpu == id.cpu.cpu);
 
                TEST_ASSERT_VAL("Cpu map - Core ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].core_id == id.core);
+                       session->header.env.cpu[cpu.cpu].core_id == id.core);
                TEST_ASSERT_VAL("Cpu map - Socket ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].socket_id ==
+                       session->header.env.cpu[cpu.cpu].socket_id ==
                        id.socket);
 
                TEST_ASSERT_VAL("Cpu map - Die ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].die_id == id.die);
+                       session->header.env.cpu[cpu.cpu].die_id == id.die);
                TEST_ASSERT_VAL("Cpu map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Cpu map - Thread IDX is set", id.thread_idx == -1);
        }
 
        // Test that core ID contains socket, die and core
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               id = aggr_cpu_id__core(perf_cpu_map__cpu(map, i), NULL);
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
+               id = aggr_cpu_id__core(cpu, NULL);
                TEST_ASSERT_VAL("Core map - Core ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].core_id == id.core);
+                       session->header.env.cpu[cpu.cpu].core_id == id.core);
 
                TEST_ASSERT_VAL("Core map - Socket ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].socket_id ==
+                       session->header.env.cpu[cpu.cpu].socket_id ==
                        id.socket);
 
                TEST_ASSERT_VAL("Core map - Die ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].die_id == id.die);
+                       session->header.env.cpu[cpu.cpu].die_id == id.die);
                TEST_ASSERT_VAL("Core map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Core map - Thread IDX is set", id.thread_idx == -1);
        }
 
        // Test that die ID contains socket and die
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               id = aggr_cpu_id__die(perf_cpu_map__cpu(map, i), NULL);
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
+               id = aggr_cpu_id__die(cpu, NULL);
                TEST_ASSERT_VAL("Die map - Socket ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].socket_id ==
+                       session->header.env.cpu[cpu.cpu].socket_id ==
                        id.socket);
 
                TEST_ASSERT_VAL("Die map - Die ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].die_id == id.die);
+                       session->header.env.cpu[cpu.cpu].die_id == id.die);
 
                TEST_ASSERT_VAL("Die map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Die map - Core is set", id.core == -1);
@@ -173,10 +173,10 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
        }
 
        // Test that socket ID contains only socket
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               id = aggr_cpu_id__socket(perf_cpu_map__cpu(map, i), NULL);
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
+               id = aggr_cpu_id__socket(cpu, NULL);
                TEST_ASSERT_VAL("Socket map - Socket ID doesn't match",
-                       session->header.env.cpu[perf_cpu_map__cpu(map, i).cpu].socket_id ==
+                       session->header.env.cpu[cpu.cpu].socket_id ==
                        id.socket);
 
                TEST_ASSERT_VAL("Socket map - Node ID is set", id.node == -1);
@@ -187,10 +187,10 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
        }
 
        // Test that node ID contains only node
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               id = aggr_cpu_id__node(perf_cpu_map__cpu(map, i), NULL);
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
+               id = aggr_cpu_id__node(cpu, NULL);
                TEST_ASSERT_VAL("Node map - Node ID doesn't match",
-                               cpu__get_node(perf_cpu_map__cpu(map, i)) == id.node);
+                               cpu__get_node(cpu) == id.node);
                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);
index 6eb2c78fd7f4a3095e8ec3743d6bcd7d4ff14981..44f0f708a15d6a14f2f07eeed558ca26e35def3d 100644 (file)
@@ -147,12 +147,12 @@ static bool valid_kwork_class_type(enum kwork_class_type type)
 
 static int setup_filters(struct perf_kwork *kwork)
 {
-       u8 val = 1;
-       int i, nr_cpus, key, fd;
-       struct perf_cpu_map *map;
-
        if (kwork->cpu_list != NULL) {
-               fd = bpf_map__fd(skel->maps.perf_kwork_cpu_filter);
+               int idx, nr_cpus;
+               struct perf_cpu_map *map;
+               struct perf_cpu cpu;
+               int fd = bpf_map__fd(skel->maps.perf_kwork_cpu_filter);
+
                if (fd < 0) {
                        pr_debug("Invalid cpu filter fd\n");
                        return -1;
@@ -165,8 +165,8 @@ static int setup_filters(struct perf_kwork *kwork)
                }
 
                nr_cpus = libbpf_num_possible_cpus();
-               for (i = 0; i < perf_cpu_map__nr(map); i++) {
-                       struct perf_cpu cpu = perf_cpu_map__cpu(map, i);
+               perf_cpu_map__for_each_cpu(cpu, idx, map) {
+                       u8 val = 1;
 
                        if (cpu.cpu >= nr_cpus) {
                                perf_cpu_map__put(map);
@@ -181,6 +181,8 @@ static int setup_filters(struct perf_kwork *kwork)
        }
 
        if (kwork->profile_name != NULL) {
+               int key, fd;
+
                if (strlen(kwork->profile_name) >= MAX_KWORKNAME) {
                        pr_err("Requested name filter %s too large, limit to %d\n",
                               kwork->profile_name, MAX_KWORKNAME - 1);
index 035e02272790a3d3cac54a7f4ae15c5703608b89..22a3b00a1e23f92999b835649a73b7202af5edd7 100644 (file)
@@ -122,11 +122,11 @@ static bool valid_kwork_class_type(enum kwork_class_type type)
 
 static int setup_filters(struct perf_kwork *kwork)
 {
-       u8 val = 1;
-       int i, nr_cpus, fd;
-       struct perf_cpu_map *map;
-
        if (kwork->cpu_list) {
+               int idx, nr_cpus, fd;
+               struct perf_cpu_map *map;
+               struct perf_cpu cpu;
+
                fd = bpf_map__fd(skel->maps.kwork_top_cpu_filter);
                if (fd < 0) {
                        pr_debug("Invalid cpu filter fd\n");
@@ -140,8 +140,8 @@ static int setup_filters(struct perf_kwork *kwork)
                }
 
                nr_cpus = libbpf_num_possible_cpus();
-               for (i = 0; i < perf_cpu_map__nr(map); i++) {
-                       struct perf_cpu cpu = perf_cpu_map__cpu(map, i);
+               perf_cpu_map__for_each_cpu(cpu, idx, map) {
+                       u8 val = 1;
 
                        if (cpu.cpu >= nr_cpus) {
                                perf_cpu_map__put(map);
index 356e30c42cd838301809b05aebe49083ae547a67..6a270d640acb906118e1eba431864be8db9935b2 100644 (file)
@@ -655,10 +655,10 @@ static char hex_char(unsigned char val)
 
 size_t cpu_map__snprint_mask(struct perf_cpu_map *map, char *buf, size_t size)
 {
-       int i, cpu;
+       int idx;
        char *ptr = buf;
        unsigned char *bitmap;
-       struct perf_cpu last_cpu = perf_cpu_map__cpu(map, perf_cpu_map__nr(map) - 1);
+       struct perf_cpu c, last_cpu = perf_cpu_map__max(map);
 
        if (buf == NULL)
                return 0;
@@ -669,12 +669,10 @@ size_t cpu_map__snprint_mask(struct perf_cpu_map *map, char *buf, size_t size)
                return 0;
        }
 
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               cpu = perf_cpu_map__cpu(map, i).cpu;
-               bitmap[cpu / 8] |= 1 << (cpu % 8);
-       }
+       perf_cpu_map__for_each_cpu(c, idx, map)
+               bitmap[c.cpu / 8] |= 1 << (c.cpu % 8);
 
-       for (cpu = last_cpu.cpu / 4 * 4; cpu >= 0; cpu -= 4) {
+       for (int cpu = last_cpu.cpu / 4 * 4; cpu >= 0; cpu -= 4) {
                unsigned char bits = bitmap[cpu / 8];
 
                if (cpu % 8)
index b4f0f60e60a63f34b04464543e36cab71eac3ec5..8aa301948de579466ec62b8bcfe19c4c05fd67a4 100644 (file)
@@ -1699,13 +1699,15 @@ static void python_process_stat(struct perf_stat_config *config,
 {
        struct perf_thread_map *threads = counter->core.threads;
        struct perf_cpu_map *cpus = counter->core.cpus;
-       int cpu, thread;
 
-       for (thread = 0; thread < perf_thread_map__nr(threads); thread++) {
-               for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
-                       process_stat(counter, perf_cpu_map__cpu(cpus, cpu),
+       for (int thread = 0; thread < perf_thread_map__nr(threads); thread++) {
+               int idx;
+               struct perf_cpu cpu;
+
+               perf_cpu_map__for_each_cpu(cpu, idx, cpus) {
+                       process_stat(counter, cpu,
                                     perf_thread_map__pid(threads, thread), tstamp,
-                                    perf_counts(counter->counts, cpu, thread));
+                                    perf_counts(counter->counts, idx, thread));
                }
        }
 }
index 06d0bd7fb45999740bd5c3462b17db2a555916c8..02a932a83c510f9f357205288467c235ded3015f 100644 (file)
@@ -2749,6 +2749,7 @@ int perf_session__cpu_bitmap(struct perf_session *session,
        int i, err = -1;
        struct perf_cpu_map *map;
        int nr_cpus = min(session->header.env.nr_cpus_avail, MAX_NR_CPUS);
+       struct perf_cpu cpu;
 
        for (i = 0; i < PERF_TYPE_MAX; ++i) {
                struct evsel *evsel;
@@ -2770,9 +2771,7 @@ int perf_session__cpu_bitmap(struct perf_session *session,
                return -1;
        }
 
-       for (i = 0; i < perf_cpu_map__nr(map); i++) {
-               struct perf_cpu cpu = perf_cpu_map__cpu(map, i);
-
+       perf_cpu_map__for_each_cpu(cpu, i, map) {
                if (cpu.cpu >= nr_cpus) {
                        pr_err("Requested CPU %d too large. "
                               "Consider raising MAX_NR_CPUS\n", cpu.cpu);
index 1892e9b6aa7ff5ffc75d8e0daa19e83832b0fc0a..2b04f47f4db0f04866bfd7c6b09b13bd75fd02e9 100644 (file)
@@ -725,26 +725,24 @@ static void scan_core_topology(int *map, struct topology *t, int nr_cpus)
 
 static int str_to_bitmap(char *s, cpumask_t *b, int nr_cpus)
 {
-       int i;
-       int ret = 0;
-       struct perf_cpu_map *m;
-       struct perf_cpu c;
+       int idx, ret = 0;
+       struct perf_cpu_map *map;
+       struct perf_cpu cpu;
 
-       m = perf_cpu_map__new(s);
-       if (!m)
+       map = perf_cpu_map__new(s);
+       if (!map)
                return -1;
 
-       for (i = 0; i < perf_cpu_map__nr(m); i++) {
-               c = perf_cpu_map__cpu(m, i);
-               if (c.cpu >= nr_cpus) {
+       perf_cpu_map__for_each_cpu(cpu, idx, map) {
+               if (cpu.cpu >= nr_cpus) {
                        ret = -1;
                        break;
                }
 
-               __set_bit(c.cpu, cpumask_bits(b));
+               __set_bit(cpu.cpu, cpumask_bits(b));
        }
 
-       perf_cpu_map__put(m);
+       perf_cpu_map__put(map);
 
        return ret;
 }