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)
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;
......
......@@ -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)
......
......@@ -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];
......
......@@ -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 */
......@@ -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
*/
......
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