mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 09:34:12 +08:00
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: 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>
This commit is contained in:
parent
f8ad6018ce
commit
d50a79cd0f
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user