Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
130 lines
4.3 KiB
Python
Executable File
130 lines
4.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
|
|
import json
|
|
|
|
hw_cache_id = [
|
|
(0, # PERF_COUNT_HW_CACHE_L1D
|
|
["L1-dcache", "l1-d", "l1d", "L1-data",],
|
|
[0, 1, 2,], # read, write, prefetch
|
|
"Level 1 data cache",
|
|
),
|
|
(1, # PERF_COUNT_HW_CACHE_L1I
|
|
["L1-icache", "l1-i", "l1i", "L1-instruction",],
|
|
[0, 2,], # read, prefetch
|
|
"Level 1 instruction cache",
|
|
),
|
|
(2, # PERF_COUNT_HW_CACHE_LL
|
|
["LLC", "L2"],
|
|
[0, 1, 2,], # read, write, prefetch
|
|
"Last level cache",
|
|
),
|
|
(3, # PERF_COUNT_HW_CACHE_DTLB
|
|
["dTLB", "d-tlb", "Data-TLB",],
|
|
[0, 1, 2,], # read, write, prefetch
|
|
"Data TLB",
|
|
),
|
|
(4, # PERF_COUNT_HW_CACHE_ITLB
|
|
["iTLB", "i-tlb", "Instruction-TLB",],
|
|
[0,], # read
|
|
"Instruction TLB",
|
|
),
|
|
(5, # PERF_COUNT_HW_CACHE_BPU
|
|
["branch", "branches", "bpu", "btb", "bpc",],
|
|
[0,], # read
|
|
"Branch prediction unit",
|
|
),
|
|
(6, # PERF_COUNT_HW_CACHE_NODE
|
|
["node",],
|
|
[0, 1, 2,], # read, write, prefetch
|
|
"Local memory",
|
|
),
|
|
]
|
|
|
|
hw_cache_op = [
|
|
(0, # PERF_COUNT_HW_CACHE_OP_READ
|
|
["load", "loads", "read",],
|
|
"read"),
|
|
(1, # PERF_COUNT_HW_CACHE_OP_WRITE
|
|
["store", "stores", "write",],
|
|
"write"),
|
|
(2, # PERF_COUNT_HW_CACHE_OP_PREFETCH
|
|
["prefetch", "prefetches", "speculative-read", "speculative-load",],
|
|
"prefetch"),
|
|
]
|
|
|
|
hw_cache_result = [
|
|
(0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
|
|
["refs", "Reference", "ops", "access",],
|
|
"accesses"),
|
|
(1, # PERF_COUNT_HW_CACHE_RESULT_MISS
|
|
["misses", "miss",],
|
|
"misses"),
|
|
]
|
|
|
|
events = []
|
|
def add_event(name: str,
|
|
cache_id: int, cache_op: int, cache_result: int,
|
|
desc: str,
|
|
deprecated: bool) -> None:
|
|
# Avoid conflicts with PERF_TYPE_HARDWARE events which are higher priority.
|
|
if name in ["branch-misses", "branches"]:
|
|
return
|
|
|
|
# Tweak and deprecate L2 named events.
|
|
if name.startswith("L2"):
|
|
desc = desc.replace("Last level cache", "Level 2 (or higher) last level cache")
|
|
deprecated = True
|
|
|
|
event = {
|
|
"EventName": name,
|
|
"BriefDescription": desc,
|
|
"LegacyCacheCode": f"0x{cache_id | (cache_op << 8) | (cache_result << 16):06x}",
|
|
}
|
|
|
|
# Deprecate events with the name starting L2 as it is actively
|
|
# confusing as on many machines it actually means the L3 cache.
|
|
if deprecated:
|
|
event["Deprecated"] = "1"
|
|
events.append(event)
|
|
|
|
for (cache_id, names, ops, cache_desc) in hw_cache_id:
|
|
for name in names:
|
|
add_event(name,
|
|
cache_id,
|
|
0, # PERF_COUNT_HW_CACHE_OP_READ
|
|
0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
|
|
f"{cache_desc} read accesses.",
|
|
deprecated=True)
|
|
|
|
for (op, op_names, op_desc) in hw_cache_op:
|
|
if op not in ops:
|
|
continue
|
|
for op_name in op_names:
|
|
deprecated = (names[0] != name or op_names[1] != op_name)
|
|
add_event(f"{name}-{op_name}",
|
|
cache_id,
|
|
op,
|
|
0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
|
|
f"{cache_desc} {op_desc} accesses.",
|
|
deprecated)
|
|
|
|
for (result, result_names, result_desc) in hw_cache_result:
|
|
for result_name in result_names:
|
|
deprecated = ((names[0] != name or op_names[0] != op_name) or
|
|
(result == 0) or (result_names[0] != result_name))
|
|
add_event(f"{name}-{op_name}-{result_name}",
|
|
cache_id, op, result,
|
|
f"{cache_desc} {op_desc} {result_desc}.",
|
|
deprecated)
|
|
|
|
for (result, result_names, result_desc) in hw_cache_result:
|
|
for result_name in result_names:
|
|
add_event(f"{name}-{result_name}",
|
|
cache_id,
|
|
0, # PERF_COUNT_HW_CACHE_OP_READ
|
|
result,
|
|
f"{cache_desc} read {result_desc}.",
|
|
deprecated=True)
|
|
|
|
print(json.dumps(events, indent=2))
|