perf pmu: Use perf_pmu__open_file() and perf_pmu__scan_file()
authorJames Clark <james.clark@arm.com>
Fri, 20 Jan 2023 14:36:55 +0000 (14:36 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 22 Jan 2023 21:17:32 +0000 (18:17 -0300)
Remove some code that duplicates existing methods. Copy strings where
const strings are required.

No functional changes.

Committer notes:

Add a stub for erf_pmu__scan_file() in tools/perf/util/python.c not to
drag tools/perf/util/pmu.c into the python binding.

This fixes 'perf test python' at this point in this patchset.

Reviewed-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: James Clark <james.clark@arm.com>
Acked-by: Suzuki Poulouse <suzuki.poulose@arm.com>
Tested-by: Tanmay Jagdale <tanmay@marvell.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Bharat Bhushan <bbhushan2@marvell.com>
Cc: George Cherian <gcherian@marvell.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Linu Cherian <lcherian@marvell.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sunil Kovvuri Goutham <sgoutham@marvell.com>
Cc: Will Deacon <will@kernel.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20230120143702.4035046-3-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/cputopo.c
tools/perf/util/pmu-hybrid.c
tools/perf/util/pmu.c
tools/perf/util/pmu.h
tools/perf/util/python.c

index 1a3ff64..e08797c 100644 (file)
@@ -422,8 +422,6 @@ void numa_topology__delete(struct numa_topology *tp)
 static int load_hybrid_node(struct hybrid_topology_node *node,
                            struct perf_pmu *pmu)
 {
-       const char *sysfs;
-       char path[PATH_MAX];
        char *buf = NULL, *p;
        FILE *fp;
        size_t len = 0;
@@ -432,12 +430,7 @@ static int load_hybrid_node(struct hybrid_topology_node *node,
        if (!node->pmu_name)
                return -1;
 
-       sysfs = sysfs__mountpoint();
-       if (!sysfs)
-               goto err;
-
-       snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, pmu->name);
-       fp = fopen(path, "r");
+       fp = perf_pmu__open_file(pmu, "cpus");
        if (!fp)
                goto err;
 
index f51ccaa..3862880 100644 (file)
@@ -20,32 +20,15 @@ LIST_HEAD(perf_pmu__hybrid_pmus);
 
 bool perf_pmu__hybrid_mounted(const char *name)
 {
-       char path[PATH_MAX];
-       const char *sysfs;
-       FILE *file;
-       int n, cpu;
+       int cpu;
+       char pmu_name[PATH_MAX];
+       struct perf_pmu pmu = {.name = pmu_name};
 
        if (strncmp(name, "cpu_", 4))
                return false;
 
-       sysfs = sysfs__mountpoint();
-       if (!sysfs)
-               return false;
-
-       snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, name);
-       if (!file_available(path))
-               return false;
-
-       file = fopen(path, "r");
-       if (!file)
-               return false;
-
-       n = fscanf(file, "%u", &cpu);
-       fclose(file);
-       if (n <= 0)
-               return false;
-
-       return true;
+       strlcpy(pmu_name, name, sizeof(pmu_name));
+       return perf_pmu__scan_file(&pmu, "cpus", "%u", &cpu) > 0;
 }
 
 struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
index 1edbb71..a771a59 100644 (file)
@@ -571,45 +571,31 @@ static void pmu_read_sysfs(void)
        closedir(dir);
 }
 
-static struct perf_cpu_map *__pmu_cpumask(const char *path)
-{
-       FILE *file;
-       struct perf_cpu_map *cpus;
-
-       file = fopen(path, "r");
-       if (!file)
-               return NULL;
-
-       cpus = perf_cpu_map__read(file);
-       fclose(file);
-       return cpus;
-}
-
 /*
  * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64)
  * may have a "cpus" file.
  */
 #define SYS_TEMPLATE_ID        "./bus/event_source/devices/%s/identifier"
-#define CPUS_TEMPLATE_UNCORE   "%s/bus/event_source/devices/%s/cpumask"
 
 static struct perf_cpu_map *pmu_cpumask(const char *name)
 {
-       char path[PATH_MAX];
        struct perf_cpu_map *cpus;
-       const char *sysfs = sysfs__mountpoint();
        const char *templates[] = {
-               CPUS_TEMPLATE_UNCORE,
-               CPUS_TEMPLATE_CPU,
+               "cpumask",
+               "cpus",
                NULL
        };
        const char **template;
+       char pmu_name[PATH_MAX];
+       struct perf_pmu pmu = {.name = pmu_name};
+       FILE *file;
 
-       if (!sysfs)
-               return NULL;
-
+       strlcpy(pmu_name, name, sizeof(pmu_name));
        for (template = templates; *template; template++) {
-               snprintf(path, PATH_MAX, *template, sysfs, name);
-               cpus = __pmu_cpumask(path);
+               file = perf_pmu__open_file(&pmu, *template);
+               if (!file)
+                       continue;
+               cpus = perf_cpu_map__read(file);
                if (cpus)
                        return cpus;
        }
@@ -620,13 +606,11 @@ static struct perf_cpu_map *pmu_cpumask(const char *name)
 static bool pmu_is_uncore(const char *name)
 {
        char path[PATH_MAX];
-       const char *sysfs;
 
        if (perf_pmu__hybrid_mounted(name))
                return false;
 
-       sysfs = sysfs__mountpoint();
-       snprintf(path, PATH_MAX, CPUS_TEMPLATE_UNCORE, sysfs, name);
+       perf_pmu__pathname_scnprintf(path, sizeof(path), name, "cpumask");
        return file_available(path);
 }
 
@@ -1737,7 +1721,7 @@ bool pmu_have_event(const char *pname, const char *name)
        return false;
 }
 
-static FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
+FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name)
 {
        char path[PATH_MAX];
 
index 96d030c..742d4db 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/perf_event.h>
 #include <linux/list.h>
 #include <stdbool.h>
+#include <stdio.h>
 #include "parse-events.h"
 #include "pmu-events/pmu-events.h"
 
@@ -22,7 +23,6 @@ enum {
 };
 
 #define PERF_PMU_FORMAT_BITS 64
-#define CPUS_TEMPLATE_CPU      "%s/bus/event_source/devices/%s/cpus"
 #define MAX_PMU_NAME_LEN 128
 
 struct perf_event_attr;
@@ -262,5 +262,6 @@ double perf_pmu__cpu_slots_per_cycle(void);
 int perf_pmu__event_source_devices_scnprintf(char *pathname, size_t size);
 int perf_pmu__pathname_scnprintf(char *buf, size_t size,
                                 const char *pmu_name, const char *filename);
+FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name);
 
 #endif /* __PMU_H */
index d948455..9e5d881 100644 (file)
@@ -20,6 +20,7 @@
 #include "stat.h"
 #include "metricgroup.h"
 #include "util/env.h"
+#include "util/pmu.h"
 #include <internal/lib.h>
 #include "util.h"
 
@@ -83,7 +84,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list)
 }
 
 /*
- * This one is needed not to drag the PMU bandwagon, jevents generated
+ * These ones are needed not to drag the PMU bandwagon, jevents generated
  * pmu_sys_event_tables, etc and evsel__find_pmu() is used so far just for
  * doing per PMU perf_event_attr.exclude_guest handling, not really needed, so
  * far, for the perf python binding known usecases, revisit if this become
@@ -94,6 +95,11 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evsel __maybe_unused)
        return NULL;
 }
 
+int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, ...)
+{
+       return EOF;
+}
+
 /*
  * Add this one here not to drag util/metricgroup.c
  */