mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
perf jevents: Add cpuid to model lookup command
When restricting jevents generated json lookup code with JEVENTS_MODEL a list of models must be provided. Some builds don't know model names but know cpuids. Add a command that can convert a cpuid to a model using mapfile.csv files. This can be used with JEVENTS_MODEL like: $ make JEVENTS_MODEL=`./pmu-events/models.py x86 'GenuineIntel-6-8D-1,AuthenticAMD-26-1' pmu-events/arch/` Committer testing: $ tools/perf/pmu-events/models.py x86 'GenuineIntel-6-8D-1,AuthenticAMD-26-1' tools/perf/pmu-events/arch/ tigerlake,amdzen5 $ perf stat -v sleep 1 |& head -1 Using CPUID GenuineIntel-6-B7-1 $ tools/perf/pmu-events/models.py x86 'GenuineIntel-6-B7-1' tools/perf/pmu-events/arch/ alderlake $ Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20240904044351.712080-1-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
98ad0b7732
commit
9b2b9b66d5
73
tools/perf/pmu-events/models.py
Executable file
73
tools/perf/pmu-events/models.py
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
||||
"""List model names from mapfile.csv files."""
|
||||
import argparse
|
||||
import csv
|
||||
import os
|
||||
import re
|
||||
from typing import List
|
||||
|
||||
def main() -> None:
|
||||
def dir_path(path: str) -> str:
|
||||
"""Validate path is a directory for argparse."""
|
||||
if os.path.isdir(path):
|
||||
return path
|
||||
raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory')
|
||||
|
||||
def find_archs(start_dir: str, arch: str) -> List[str]:
|
||||
archs = []
|
||||
for item in os.scandir(start_dir):
|
||||
if not item.is_dir():
|
||||
continue
|
||||
if arch in (item.name, 'all'):
|
||||
archs.append(item.name)
|
||||
|
||||
if len(archs) < 1:
|
||||
raise IOError(f'Missing architecture directory \'{arch}\'')
|
||||
|
||||
return archs
|
||||
|
||||
def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]:
|
||||
result = []
|
||||
for arch in archs:
|
||||
for item in os.scandir(f'{start_dir}/{arch}'):
|
||||
if item.is_dir():
|
||||
continue
|
||||
if item.name == 'mapfile.csv':
|
||||
result.append(f'{start_dir}/{arch}/mapfile.csv')
|
||||
return result
|
||||
|
||||
def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]:
|
||||
result = []
|
||||
for mapfile in mapfiles:
|
||||
with open(mapfile, encoding='utf-8') as csvfile:
|
||||
first = False
|
||||
table = csv.reader(csvfile)
|
||||
for row in table:
|
||||
if not first or len(row) == 0 or row[0].startswith('#'):
|
||||
first = True
|
||||
continue
|
||||
# Python regular expressions don't handle xdigit.
|
||||
regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]')
|
||||
for cpuid in cpuids.split(','):
|
||||
if re.match(regex, cpuid):
|
||||
result.append(row[2])
|
||||
return result
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('arch', help='Architecture name like x86')
|
||||
ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names')
|
||||
ap.add_argument(
|
||||
'starting_dir',
|
||||
type=dir_path,
|
||||
help='Root of tree containing architecture directories containing json files'
|
||||
)
|
||||
args = ap.parse_args()
|
||||
|
||||
archs = find_archs(args.starting_dir, args.arch)
|
||||
mapfiles = find_mapfiles(args.starting_dir, archs)
|
||||
models = find_cpuids(mapfiles, args.cpuid)
|
||||
print(','.join(models))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user