Commit d50a79cd authored by James Clark's avatar James Clark Committed by Arnaldo Carvalho de Melo

perf pmu: Use perf_pmu__open_file() and perf_pmu__scan_file()

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: default avatarLeo Yan <leo.yan@linaro.org>
Signed-off-by: default avatarJames Clark <james.clark@arm.com>
Acked-by: default avatarSuzuki Poulouse <suzuki.poulose@arm.com>
Tested-by: default avatarTanmay 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f8ad6018
...@@ -422,8 +422,6 @@ void numa_topology__delete(struct numa_topology *tp) ...@@ -422,8 +422,6 @@ void numa_topology__delete(struct numa_topology *tp)
static int load_hybrid_node(struct hybrid_topology_node *node, static int load_hybrid_node(struct hybrid_topology_node *node,
struct perf_pmu *pmu) struct perf_pmu *pmu)
{ {
const char *sysfs;
char path[PATH_MAX];
char *buf = NULL, *p; char *buf = NULL, *p;
FILE *fp; FILE *fp;
size_t len = 0; size_t len = 0;
...@@ -432,12 +430,7 @@ static int load_hybrid_node(struct hybrid_topology_node *node, ...@@ -432,12 +430,7 @@ static int load_hybrid_node(struct hybrid_topology_node *node,
if (!node->pmu_name) if (!node->pmu_name)
return -1; return -1;
sysfs = sysfs__mountpoint(); fp = perf_pmu__open_file(pmu, "cpus");
if (!sysfs)
goto err;
snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, pmu->name);
fp = fopen(path, "r");
if (!fp) if (!fp)
goto err; goto err;
......
...@@ -20,32 +20,15 @@ LIST_HEAD(perf_pmu__hybrid_pmus); ...@@ -20,32 +20,15 @@ LIST_HEAD(perf_pmu__hybrid_pmus);
bool perf_pmu__hybrid_mounted(const char *name) bool perf_pmu__hybrid_mounted(const char *name)
{ {
char path[PATH_MAX]; int cpu;
const char *sysfs; char pmu_name[PATH_MAX];
FILE *file; struct perf_pmu pmu = {.name = pmu_name};
int n, cpu;
if (strncmp(name, "cpu_", 4)) if (strncmp(name, "cpu_", 4))
return false; return false;
sysfs = sysfs__mountpoint(); strlcpy(pmu_name, name, sizeof(pmu_name));
if (!sysfs) return perf_pmu__scan_file(&pmu, "cpus", "%u", &cpu) > 0;
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;
} }
struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name) struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
......
...@@ -571,45 +571,31 @@ static void pmu_read_sysfs(void) ...@@ -571,45 +571,31 @@ static void pmu_read_sysfs(void)
closedir(dir); 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) * Uncore PMUs have a "cpumask" file under sysfs. CPU PMUs (e.g. on arm/arm64)
* may have a "cpus" file. * may have a "cpus" file.
*/ */
#define SYS_TEMPLATE_ID "./bus/event_source/devices/%s/identifier" #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) static struct perf_cpu_map *pmu_cpumask(const char *name)
{ {
char path[PATH_MAX];
struct perf_cpu_map *cpus; struct perf_cpu_map *cpus;
const char *sysfs = sysfs__mountpoint();
const char *templates[] = { const char *templates[] = {
CPUS_TEMPLATE_UNCORE, "cpumask",
CPUS_TEMPLATE_CPU, "cpus",
NULL NULL
}; };
const char **template; const char **template;
char pmu_name[PATH_MAX];
struct perf_pmu pmu = {.name = pmu_name};
FILE *file;
if (!sysfs) strlcpy(pmu_name, name, sizeof(pmu_name));
return NULL;
for (template = templates; *template; template++) { for (template = templates; *template; template++) {
snprintf(path, PATH_MAX, *template, sysfs, name); file = perf_pmu__open_file(&pmu, *template);
cpus = __pmu_cpumask(path); if (!file)
continue;
cpus = perf_cpu_map__read(file);
if (cpus) if (cpus)
return cpus; return cpus;
} }
...@@ -620,13 +606,11 @@ static struct perf_cpu_map *pmu_cpumask(const char *name) ...@@ -620,13 +606,11 @@ static struct perf_cpu_map *pmu_cpumask(const char *name)
static bool pmu_is_uncore(const char *name) static bool pmu_is_uncore(const char *name)
{ {
char path[PATH_MAX]; char path[PATH_MAX];
const char *sysfs;
if (perf_pmu__hybrid_mounted(name)) if (perf_pmu__hybrid_mounted(name))
return false; return false;
sysfs = sysfs__mountpoint(); perf_pmu__pathname_scnprintf(path, sizeof(path), name, "cpumask");
snprintf(path, PATH_MAX, CPUS_TEMPLATE_UNCORE, sysfs, name);
return file_available(path); return file_available(path);
} }
...@@ -1737,7 +1721,7 @@ bool pmu_have_event(const char *pname, const char *name) ...@@ -1737,7 +1721,7 @@ bool pmu_have_event(const char *pname, const char *name)
return false; 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]; char path[PATH_MAX];
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/perf_event.h> #include <linux/perf_event.h>
#include <linux/list.h> #include <linux/list.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h>
#include "parse-events.h" #include "parse-events.h"
#include "pmu-events/pmu-events.h" #include "pmu-events/pmu-events.h"
...@@ -22,7 +23,6 @@ enum { ...@@ -22,7 +23,6 @@ enum {
}; };
#define PERF_PMU_FORMAT_BITS 64 #define PERF_PMU_FORMAT_BITS 64
#define CPUS_TEMPLATE_CPU "%s/bus/event_source/devices/%s/cpus"
#define MAX_PMU_NAME_LEN 128 #define MAX_PMU_NAME_LEN 128
struct perf_event_attr; struct perf_event_attr;
...@@ -262,5 +262,6 @@ double perf_pmu__cpu_slots_per_cycle(void); ...@@ -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__event_source_devices_scnprintf(char *pathname, size_t size);
int perf_pmu__pathname_scnprintf(char *buf, size_t size, int perf_pmu__pathname_scnprintf(char *buf, size_t size,
const char *pmu_name, const char *filename); const char *pmu_name, const char *filename);
FILE *perf_pmu__open_file(struct perf_pmu *pmu, const char *name);
#endif /* __PMU_H */ #endif /* __PMU_H */
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "stat.h" #include "stat.h"
#include "metricgroup.h" #include "metricgroup.h"
#include "util/env.h" #include "util/env.h"
#include "util/pmu.h"
#include <internal/lib.h> #include <internal/lib.h>
#include "util.h" #include "util.h"
...@@ -83,7 +84,7 @@ void perf_stat__collect_metric_expr(struct evlist *evsel_list) ...@@ -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 * 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 * 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 * 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) ...@@ -94,6 +95,11 @@ struct perf_pmu *evsel__find_pmu(struct evsel *evsel __maybe_unused)
return NULL; 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 * Add this one here not to drag util/metricgroup.c
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment