Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/usr/bin/env python3
2# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
3import json
4
5hw_cache_id = [
6 (0, # PERF_COUNT_HW_CACHE_L1D
7 ["L1-dcache", "l1-d", "l1d", "L1-data",],
8 [0, 1, 2,], # read, write, prefetch
9 "Level 1 data cache",
10 ),
11 (1, # PERF_COUNT_HW_CACHE_L1I
12 ["L1-icache", "l1-i", "l1i", "L1-instruction",],
13 [0, 2,], # read, prefetch
14 "Level 1 instruction cache",
15 ),
16 (2, # PERF_COUNT_HW_CACHE_LL
17 ["LLC", "L2"],
18 [0, 1, 2,], # read, write, prefetch
19 "Last level cache",
20 ),
21 (3, # PERF_COUNT_HW_CACHE_DTLB
22 ["dTLB", "d-tlb", "Data-TLB",],
23 [0, 1, 2,], # read, write, prefetch
24 "Data TLB",
25 ),
26 (4, # PERF_COUNT_HW_CACHE_ITLB
27 ["iTLB", "i-tlb", "Instruction-TLB",],
28 [0,], # read
29 "Instruction TLB",
30 ),
31 (5, # PERF_COUNT_HW_CACHE_BPU
32 ["branch", "branches", "bpu", "btb", "bpc",],
33 [0,], # read
34 "Branch prediction unit",
35 ),
36 (6, # PERF_COUNT_HW_CACHE_NODE
37 ["node",],
38 [0, 1, 2,], # read, write, prefetch
39 "Local memory",
40 ),
41]
42
43hw_cache_op = [
44 (0, # PERF_COUNT_HW_CACHE_OP_READ
45 ["load", "loads", "read",],
46 "read"),
47 (1, # PERF_COUNT_HW_CACHE_OP_WRITE
48 ["store", "stores", "write",],
49 "write"),
50 (2, # PERF_COUNT_HW_CACHE_OP_PREFETCH
51 ["prefetch", "prefetches", "speculative-read", "speculative-load",],
52 "prefetch"),
53]
54
55hw_cache_result = [
56 (0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
57 ["refs", "Reference", "ops", "access",],
58 "accesses"),
59 (1, # PERF_COUNT_HW_CACHE_RESULT_MISS
60 ["misses", "miss",],
61 "misses"),
62]
63
64events = []
65def add_event(name: str,
66 cache_id: int, cache_op: int, cache_result: int,
67 desc: str,
68 deprecated: bool) -> None:
69 # Avoid conflicts with PERF_TYPE_HARDWARE events which are higher priority.
70 if name in ["branch-misses", "branches"]:
71 return
72
73 # Tweak and deprecate L2 named events.
74 if name.startswith("L2"):
75 desc = desc.replace("Last level cache", "Level 2 (or higher) last level cache")
76 deprecated = True
77
78 event = {
79 "EventName": name,
80 "BriefDescription": desc,
81 "LegacyCacheCode": f"0x{cache_id | (cache_op << 8) | (cache_result << 16):06x}",
82 }
83
84 # Deprecate events with the name starting L2 as it is actively
85 # confusing as on many machines it actually means the L3 cache.
86 if deprecated:
87 event["Deprecated"] = "1"
88 events.append(event)
89
90for (cache_id, names, ops, cache_desc) in hw_cache_id:
91 for name in names:
92 add_event(name,
93 cache_id,
94 0, # PERF_COUNT_HW_CACHE_OP_READ
95 0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
96 f"{cache_desc} read accesses.",
97 deprecated=True)
98
99 for (op, op_names, op_desc) in hw_cache_op:
100 if op not in ops:
101 continue
102 for op_name in op_names:
103 deprecated = (names[0] != name or op_names[1] != op_name)
104 add_event(f"{name}-{op_name}",
105 cache_id,
106 op,
107 0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
108 f"{cache_desc} {op_desc} accesses.",
109 deprecated)
110
111 for (result, result_names, result_desc) in hw_cache_result:
112 for result_name in result_names:
113 deprecated = ((names[0] != name or op_names[0] != op_name) or
114 (result == 0) or (result_names[0] != result_name))
115 add_event(f"{name}-{op_name}-{result_name}",
116 cache_id, op, result,
117 f"{cache_desc} {op_desc} {result_desc}.",
118 deprecated)
119
120 for (result, result_names, result_desc) in hw_cache_result:
121 for result_name in result_names:
122 add_event(f"{name}-{result_name}",
123 cache_id,
124 0, # PERF_COUNT_HW_CACHE_OP_READ
125 result,
126 f"{cache_desc} read {result_desc}.",
127 deprecated=True)
128
129print(json.dumps(events, indent=2))