mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
perf jevent: Add an 'all' architecture argument
When 'all' is passed as the architecture generate a mapping table for all architectures. This simplifies testing. To identify the table for an architecture add an arch variable to the pmu_events_map. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: John Garry <john.garry@huawei.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: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Stephane Eranian <eranian@google.com> Cc: Will Deacon <will@kernel.org> Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com> Cc: linux-arm-kernel@lists.infradead.org Link: https://lore.kernel.org/r/20220812230949.683239-2-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
8d33834f9f
commit
099b157c08
@ -110,12 +110,14 @@ static const struct pmu_event pme_test_soc_cpu[] = {
|
|||||||
|
|
||||||
const struct pmu_events_map pmu_events_map[] = {
|
const struct pmu_events_map pmu_events_map[] = {
|
||||||
{
|
{
|
||||||
|
.arch = "testarch",
|
||||||
.cpuid = "testcpu",
|
.cpuid = "testcpu",
|
||||||
.version = "v1",
|
.version = "v1",
|
||||||
.type = "core",
|
.type = "core",
|
||||||
.table = pme_test_soc_cpu,
|
.table = pme_test_soc_cpu,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
.arch = 0,
|
||||||
.cpuid = 0,
|
.cpuid = 0,
|
||||||
.version = 0,
|
.version = 0,
|
||||||
.type = 0,
|
.type = 0,
|
||||||
|
@ -305,38 +305,45 @@ def process_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
|
|||||||
print_events_table_entries(item, get_topic(item.name))
|
print_events_table_entries(item, get_topic(item.name))
|
||||||
|
|
||||||
|
|
||||||
def print_mapping_table() -> None:
|
def print_mapping_table(archs: Sequence[str]) -> None:
|
||||||
"""Read the mapfile and generate the struct from cpuid string to event table."""
|
"""Read the mapfile and generate the struct from cpuid string to event table."""
|
||||||
with open(f'{_args.starting_dir}/{_args.arch}/mapfile.csv') as csvfile:
|
_args.output_file.write('const struct pmu_events_map pmu_events_map[] = {\n')
|
||||||
table = csv.reader(csvfile)
|
for arch in archs:
|
||||||
_args.output_file.write(
|
if arch == 'test':
|
||||||
'const struct pmu_events_map pmu_events_map[] = {\n')
|
_args.output_file.write("""{
|
||||||
first = True
|
\t.arch = "testarch",
|
||||||
for row in table:
|
|
||||||
# Skip the first row or any row beginning with #.
|
|
||||||
if not first and len(row) > 0 and not row[0].startswith('#'):
|
|
||||||
tblname = file_name_to_table_name([], row[2].replace('/', '_'))
|
|
||||||
_args.output_file.write("""{
|
|
||||||
\t.cpuid = \"%s\",
|
|
||||||
\t.version = \"%s\",
|
|
||||||
\t.type = \"%s\",
|
|
||||||
\t.table = %s
|
|
||||||
},
|
|
||||||
""" % (row[0].replace('\\', '\\\\'), row[1], row[3], tblname))
|
|
||||||
first = False
|
|
||||||
|
|
||||||
_args.output_file.write("""{
|
|
||||||
\t.cpuid = "testcpu",
|
\t.cpuid = "testcpu",
|
||||||
\t.version = "v1",
|
\t.version = "v1",
|
||||||
\t.type = "core",
|
\t.type = "core",
|
||||||
\t.table = pme_test_soc_cpu,
|
\t.table = pme_test_soc_cpu,
|
||||||
},
|
},
|
||||||
{
|
""")
|
||||||
|
else:
|
||||||
|
with open(f'{_args.starting_dir}/{arch}/mapfile.csv') as csvfile:
|
||||||
|
table = csv.reader(csvfile)
|
||||||
|
first = True
|
||||||
|
for row in table:
|
||||||
|
# Skip the first row or any row beginning with #.
|
||||||
|
if not first and len(row) > 0 and not row[0].startswith('#'):
|
||||||
|
tblname = file_name_to_table_name([], row[2].replace('/', '_'))
|
||||||
|
cpuid = row[0].replace('\\', '\\\\')
|
||||||
|
_args.output_file.write(f"""{{
|
||||||
|
\t.arch = "{arch}",
|
||||||
|
\t.cpuid = "{cpuid}",
|
||||||
|
\t.version = "{row[1]}",
|
||||||
|
\t.type = "{row[3]}",
|
||||||
|
\t.table = {tblname}
|
||||||
|
}},
|
||||||
|
""")
|
||||||
|
first = False
|
||||||
|
|
||||||
|
_args.output_file.write("""{
|
||||||
|
\t.arch = 0,
|
||||||
\t.cpuid = 0,
|
\t.cpuid = 0,
|
||||||
\t.version = 0,
|
\t.version = 0,
|
||||||
\t.type = 0,
|
\t.type = 0,
|
||||||
\t.table = 0,
|
\t.table = 0,
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
""")
|
""")
|
||||||
|
|
||||||
@ -387,15 +394,24 @@ def main() -> None:
|
|||||||
_args = ap.parse_args()
|
_args = ap.parse_args()
|
||||||
|
|
||||||
_args.output_file.write("#include \"pmu-events/pmu-events.h\"\n")
|
_args.output_file.write("#include \"pmu-events/pmu-events.h\"\n")
|
||||||
for path in [_args.arch, 'test']:
|
archs = []
|
||||||
arch_path = f'{_args.starting_dir}/{path}'
|
for item in os.scandir(_args.starting_dir):
|
||||||
if not os.path.isdir(arch_path):
|
if not item.is_dir():
|
||||||
raise IOError(f'Missing architecture directory in \'{arch_path}\'')
|
continue
|
||||||
|
if item.name == _args.arch or _args.arch == 'all' or item.name == 'test':
|
||||||
|
archs.append(item.name)
|
||||||
|
|
||||||
|
if len(archs) < 2:
|
||||||
|
raise IOError(f'Missing architecture directory \'{_args.arch}\'')
|
||||||
|
|
||||||
|
archs.sort()
|
||||||
|
for arch in archs:
|
||||||
|
arch_path = f'{_args.starting_dir}/{arch}'
|
||||||
preprocess_arch_std_files(arch_path)
|
preprocess_arch_std_files(arch_path)
|
||||||
ftw(arch_path, [], process_one_file)
|
ftw(arch_path, [], process_one_file)
|
||||||
print_events_table_suffix()
|
print_events_table_suffix()
|
||||||
|
|
||||||
print_mapping_table()
|
print_mapping_table(archs)
|
||||||
print_system_mapping_table()
|
print_system_mapping_table()
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ struct pmu_event {
|
|||||||
* The cpuid can contain any character other than the comma.
|
* The cpuid can contain any character other than the comma.
|
||||||
*/
|
*/
|
||||||
struct pmu_events_map {
|
struct pmu_events_map {
|
||||||
|
const char *arch;
|
||||||
const char *cpuid;
|
const char *cpuid;
|
||||||
const char *version;
|
const char *version;
|
||||||
const char *type; /* core, uncore etc */
|
const char *type; /* core, uncore etc */
|
||||||
|
@ -864,8 +864,7 @@ static void expr_failure(const char *msg,
|
|||||||
const struct pmu_events_map *map,
|
const struct pmu_events_map *map,
|
||||||
const struct pmu_event *pe)
|
const struct pmu_event *pe)
|
||||||
{
|
{
|
||||||
pr_debug("%s for map %s %s %s\n",
|
pr_debug("%s for map %s %s\n", msg, map->arch, map->cpuid);
|
||||||
msg, map->cpuid, map->version, map->type);
|
|
||||||
pr_debug("On metric %s\n", pe->metric_name);
|
pr_debug("On metric %s\n", pe->metric_name);
|
||||||
pr_debug("On expression %s\n", pe->metric_expr);
|
pr_debug("On expression %s\n", pe->metric_expr);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user