From: Ian Rogers <irogers@google.com>
To: irogers@google.com, acme@kernel.org, adrian.hunter@intel.com,
alice.mei.rogers@gmail.com, james.clark@linaro.org,
linux-perf-users@vger.kernel.org, namhyung@kernel.org
Cc: dapeng1.mi@linux.intel.com, leo.yan@linux.dev,
linux-kernel@vger.kernel.org, mingo@redhat.com,
peterz@infradead.org, tmricht@linux.ibm.com
Subject: [PATCH v1 11/49] perf pmu-events: Clean up mypy and pylint issues
Date: Sat, 19 Sep 2026 22:21:03 -0700 [thread overview]
Message-ID: <339d7d6a5c9d2c4900871cf1221e7bb67dd99ec2.1789880842.git.irogers@google.com> (raw)
In-Reply-To: <cover.1789880842.git.irogers@google.com>
Clean up mypy type errors and pylint warnings across the pmu-events Python
scripts (amd_metrics.py, intel_metrics.py, jevents.py,
make_legacy_cache.py,
and metric.py) in preparation for making MYPY and PYLINT build tests
opt-out.
In addition to type annotations and unused import/variable cleanups, fix
three bugs in intel_metrics.py exposed by static analysis:
- Fix references to undefined 'args.model' (instead of '_args.model')
inside
try/except blocks in IntelL2() and UncoreMemBw(), which previously threw
NameError and silently disabled Skylake/CascadeLake L2 silent eviction
adjustments and uncore memory bandwidth JSON loading.
- Define DC_WB_U and DC_WB_D before their first use in IntelL2(), fixing
an UnboundLocalError that silently dropped the l2_out_rate, wbn, and isd
metrics.
- Fix Event-to-string comparison and addition in IntelFp() by comparing
and modifying 'f_assist.name' instead of the Event object 'f_assist'.
Assisted-by: Antigravity:gemini-3.1-pro
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/pmu-events/amd_metrics.py | 10 +-
tools/perf/pmu-events/intel_metrics.py | 259 ++++++++++-----------
tools/perf/pmu-events/jevents.py | 77 +++---
tools/perf/pmu-events/make_legacy_cache.py | 34 +--
tools/perf/pmu-events/metric.py | 58 +++--
5 files changed, 210 insertions(+), 228 deletions(-)
diff --git a/tools/perf/pmu-events/amd_metrics.py b/tools/perf/pmu-events/amd_metrics.py
index dccfcacaf148..cf8b68954737 100755
--- a/tools/perf/pmu-events/amd_metrics.py
+++ b/tools/perf/pmu-events/amd_metrics.py
@@ -70,7 +70,6 @@ def AmdBr():
])
def Conditional() -> Optional[MetricGroup]:
- global _zen_model
br = Event("ex_ret_brn_cond", "ex_ret_cond")
br_r = d_ratio(br, interval_sec)
ins_r = d_ratio(ins, br)
@@ -156,11 +155,10 @@ def AmdCtxSw() -> MetricGroup:
def AmdDtlb() -> Optional[MetricGroup]:
- global _zen_model
if _zen_model >= 4:
return None
- d_dat = Event("ls_dc_accesses") if _zen_model <= 3 else None
+ d_dat = Event("ls_dc_accesses")
d_h4k = Event("ls_l1_d_tlb_miss.tlb_reload_4k_l2_hit")
d_hcoal = Event(
"ls_l1_d_tlb_miss.tlb_reload_coalesced_page_hit") if _zen_model >= 2 else 0
@@ -173,8 +171,8 @@ def AmdDtlb() -> Optional[MetricGroup]:
d_m2m = Event("ls_l1_d_tlb_miss.tlb_reload_2m_l2_miss")
d_m1g = Event("ls_l1_d_tlb_miss.tlb_reload_1g_l2_miss")
- d_w0 = Event("ls_tablewalker.dc_type0") if _zen_model <= 3 else None
- d_w1 = Event("ls_tablewalker.dc_type1") if _zen_model <= 3 else None
+ d_w0 = Event("ls_tablewalker.dc_type0")
+ d_w1 = Event("ls_tablewalker.dc_type1")
walks = d_w0 + d_w1
walks_r = d_ratio(walks, interval_sec)
ins_w = d_ratio(ins, walks)
@@ -266,7 +264,6 @@ def AmdDtlb() -> Optional[MetricGroup]:
def AmdIotlb() -> Optional[MetricGroup]:
- global _zen_model
if _zen_model < 2:
return None
@@ -322,7 +319,6 @@ def AmdIotlb() -> Optional[MetricGroup]:
def AmdItlb():
- global _zen_model
l2h = Event("bp_l1_tlb_miss_l2_tlb_hit", "bp_l1_tlb_miss_l2_hit")
l2m = Event("bp_l1_tlb_miss_l2_tlb_miss.all", "l2_itlb_misses",)
l2r = l2h + l2m
diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events/intel_metrics.py
index 9780bf978a41..497d8fd05e09 100755
--- a/tools/perf/pmu-events/intel_metrics.py
+++ b/tools/perf/pmu-events/intel_metrics.py
@@ -5,10 +5,10 @@ import json
import math
import os
import re
-from typing import Optional
+from typing import Optional, Union
from common_metrics import Cycles
-from metric import (d_ratio, has_event, max, aggr_nr, CheckPmu, Event,
- JsonEncodeMetric, JsonEncodeMetricGroupDescriptions,
+from metric import (d_ratio, has_event, max, aggr_nr, CheckPmu, Constant, Event,
+ Expression, JsonEncodeMetric, JsonEncodeMetricGroupDescriptions,
Literal, LoadEvents, Metric, MetricConstraint, MetricGroup,
MetricRef, Select)
@@ -90,7 +90,7 @@ def Tsx() -> Optional[MetricGroup]:
# sysfs version so that we can detect its presence at runtime.
transaction_start = Event("RTM_RETIRED.START")
transaction_start = Event(f'{pmu}/tx\\-start/')
- except:
+ except ValueError:
return None
elision_start = None
@@ -100,7 +100,7 @@ def Tsx() -> Optional[MetricGroup]:
# case. Again, prefer the sysfs encoding of the event.
elision_start = Event("HLE_RETIRED.START")
elision_start = Event(f'{pmu}/el\\-start/')
- except:
+ except ValueError:
pass
return MetricGroup('transaction', [
@@ -139,7 +139,7 @@ def IntelBr():
br_clr = None
try:
br_clr = Event("BACLEARS.ANY", "BACLEARS.ALL")
- except:
+ except ValueError:
pass
br_r = d_ratio(br_all, interval_sec)
@@ -171,7 +171,7 @@ def IntelBr():
br_m_tk = Event("BR_MISP_RETIRED.NEAR_TAKEN",
"BR_MISP_RETIRED.TAKEN_JCC",
"BR_INST_RETIRED.MISPRED_TAKEN")
- except:
+ except ValueError:
pass
br_r = d_ratio(br_all, interval_sec)
ins_r = d_ratio(ins, br_all)
@@ -199,7 +199,7 @@ def IntelBr():
br_m_cond = Event("BR_MISP_RETIRED.COND",
"BR_MISP_RETIRED.CONDITIONAL",
"BR_MISP_RETIRED.TAKEN_JCC")
- except:
+ except ValueError:
return None
br_cond_nt = None
@@ -207,7 +207,7 @@ def IntelBr():
try:
br_cond_nt = Event("BR_INST_RETIRED.COND_NTAKEN")
br_m_cond_nt = Event("BR_MISP_RETIRED.COND_NTAKEN")
- except:
+ except ValueError:
pass
br_r = d_ratio(br_cond, interval_sec)
ins_r = d_ratio(ins, br_cond)
@@ -222,7 +222,7 @@ def IntelBr():
"Retired conditional branch instructions mispredicted as a "
"percentage of all conditional branches.", misp_r, "100%"),
]
- if not br_m_cond_nt:
+ if not br_m_cond_nt or not br_cond_nt:
return MetricGroup("lpm_br_cond", taken_metrics)
br_r = d_ratio(br_cond_nt, interval_sec)
@@ -247,7 +247,7 @@ def IntelBr():
def Far() -> Optional[MetricGroup]:
try:
br_far = Event("BR_INST_RETIRED.FAR_BRANCH")
- except:
+ except ValueError:
return None
br_r = d_ratio(br_far, interval_sec)
@@ -284,7 +284,7 @@ def IntelCtxSw() -> MetricGroup:
ev = Event("MEM_INST_RETIRED.ALL_LOADS", "MEM_UOPS_RETIRED.ALL_LOADS")
metrics.append(Metric("lpm_cs_loads", "Loads per context switch",
d_ratio(ev, cs), "loads/cs"))
- except:
+ except ValueError:
pass
try:
@@ -292,14 +292,14 @@ def IntelCtxSw() -> MetricGroup:
"MEM_UOPS_RETIRED.ALL_STORES")
metrics.append(Metric("lpm_cs_stores", "Stores per context switch",
d_ratio(ev, cs), "stores/cs"))
- except:
+ except ValueError:
pass
try:
ev = Event("BR_INST_RETIRED.NEAR_TAKEN", "BR_INST_RETIRED.TAKEN_JCC")
metrics.append(Metric("lpm_cs_br_taken", "Branches taken per context switch",
d_ratio(ev, cs), "br_taken/cs"))
- except:
+ except ValueError:
pass
try:
@@ -309,12 +309,12 @@ def IntelCtxSw() -> MetricGroup:
try:
l2_misses += Event("L2_RQSTS.HWPF_MISS",
"L2_RQSTS.L2_PF_MISS", "L2_RQSTS.PF_MISS")
- except:
+ except ValueError:
pass
metrics.append(Metric("lpm_cs_l2_misses", "L2 misses per context switch",
d_ratio(l2_misses, cs), "l2_misses/cs"))
- except:
+ except ValueError:
pass
return MetricGroup("lpm_cs", metrics,
@@ -327,7 +327,7 @@ def IntelFpu() -> Optional[MetricGroup]:
try:
s_64 = Event("FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
"SIMD_INST_RETIRED.SCALAR_SINGLE")
- except:
+ except ValueError:
return None
d_64 = Event("FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
"SIMD_INST_RETIRED.SCALAR_DOUBLE")
@@ -352,21 +352,21 @@ def IntelFpu() -> Optional[MetricGroup]:
flop += 16 * s_512
d_512 = Event("FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE")
flop += 8 * d_512
- except:
+ except ValueError:
pass
f_assist = Event("ASSISTS.FP", "FP_ASSIST.ANY", "FP_ASSIST.S")
- if f_assist in [
+ nmi_constraint = MetricConstraint.GROUPED_EVENTS
+ if f_assist.name == "ASSISTS.FP": # Icelake+
+ nmi_constraint = MetricConstraint.NO_GROUP_EVENTS_NMI
+ if f_assist.name in [
"ASSISTS.FP",
"FP_ASSIST.S",
]:
- f_assist += "/cmask=1/"
+ f_assist.name += "/cmask=1/"
flop_r = d_ratio(flop, interval_sec)
flop_c = d_ratio(flop, cyc)
- nmi_constraint = MetricConstraint.GROUPED_EVENTS
- if f_assist.name == "ASSISTS.FP": # Icelake+
- nmi_constraint = MetricConstraint.NO_GROUP_EVENTS_NMI
def FpuMetrics(group: str, fl: Optional[Event], mult: int, desc: str) -> Optional[MetricGroup]:
if not fl:
@@ -421,16 +421,17 @@ def IntelFpu() -> Optional[MetricGroup]:
def IntelIlp() -> MetricGroup:
tsc = Event("msr/tsc/")
c0 = Event("msr/mperf/")
- low = tsc - c0
+ low = max(tsc - c0, 0)
inst_ret = Event("INST_RETIRED.ANY_P")
- inst_ret_c = [Event(f"{inst_ret.name}/cmask={x}/") for x in range(1, 6)]
core_cycles = Event("CPU_CLK_UNHALTED.THREAD_P_ANY",
"CPU_CLK_UNHALTED.DISTRIBUTED",
"cycles")
+ inst_ret_c = [Event(f"{inst_ret.name}/cmask={x}/") for x in range(1, 6)]
+
ilp = [d_ratio(max(inst_ret_c[x] - inst_ret_c[x + 1], 0), core_cycles)
for x in range(0, 4)]
ilp.append(d_ratio(inst_ret_c[4], core_cycles))
- ilp0 = 1
+ ilp0: Expression = Constant(1)
for x in ilp:
ilp0 -= x
return MetricGroup("lpm_ilp", [
@@ -465,7 +466,7 @@ def IntelIotlb() -> Optional[MetricGroup]:
+ Event("UNC_IIO_IOMMU0.1G_HITS")
)
total_miss = Event("UNC_IIO_IOMMU0.MISSES")
- except:
+ except ValueError:
return None
miss_rate = d_ratio(total_miss, total_miss + total_hit)
@@ -508,7 +509,7 @@ def IntelIotlb() -> Optional[MetricGroup]:
"100%",
),
]
- except:
+ except ValueError:
pass
return MetricGroup(
@@ -519,59 +520,92 @@ def IntelIotlb() -> Optional[MetricGroup]:
def IntelL2() -> Optional[MetricGroup]:
+ assert _args is not None
try:
DC_HIT = Event("L2_RQSTS.DEMAND_DATA_RD_HIT")
- except:
+ except ValueError:
return None
try:
DC_MISS = Event("L2_RQSTS.DEMAND_DATA_RD_MISS")
- l2_dmnd_miss = DC_MISS
- l2_dmnd_rd_all = DC_MISS + DC_HIT
- except:
+ l2_dmnd_miss: Expression = DC_MISS
+ l2_dmnd_rd_all: Expression = DC_MISS + DC_HIT
+ except ValueError:
DC_ALL = Event("L2_RQSTS.ALL_DEMAND_DATA_RD")
l2_dmnd_miss = DC_ALL - DC_HIT
l2_dmnd_rd_all = DC_ALL
l2_dmnd_mrate = d_ratio(l2_dmnd_miss, interval_sec)
l2_dmnd_rrate = d_ratio(l2_dmnd_rd_all, interval_sec)
- DC_PFH = None
- DC_PFM = None
- l2_pf_all = None
- l2_pf_mrate = None
- l2_pf_rrate = None
+ l2_useless_rate = None
+ try:
+ DC_OUT_U = Event("L2_LINES_OUT.USELESS_HWPF")
+ l2_pf_useless = DC_OUT_U
+ l2_useless_rate = d_ratio(l2_pf_useless, interval_sec)
+ except ValueError:
+ pass
+
+ hwpf_group = None
try:
DC_PFH = Event("L2_RQSTS.PF_HIT")
DC_PFM = Event("L2_RQSTS.PF_MISS")
l2_pf_all = DC_PFH + DC_PFM
l2_pf_mrate = d_ratio(DC_PFM, interval_sec)
l2_pf_rrate = d_ratio(l2_pf_all, interval_sec)
- except:
+ hwpf_group = MetricGroup("lpm_l2_hwpf", [
+ Metric("lpm_l2_hwpf_hits", "L2 cache hardware prefetcher hits",
+ d_ratio(DC_PFH, l2_pf_all), "100%"),
+ Metric("lpm_l2_hwpf_misses", "L2 cache hardware prefetcher misses",
+ d_ratio(DC_PFM, l2_pf_all), "100%"),
+ Metric("lpm_l2_hwpf_useless", "L2 cache hardware prefetcher useless prefetches per second",
+ l2_useless_rate, "100%") if l2_useless_rate else None,
+ Metric("lpm_l2_hwpf_requests", "L2 cache hardware prefetcher requests per second",
+ l2_pf_rrate, "100%"),
+ Metric("lpm_l2_hwpf_misses", "L2 cache hardware prefetcher misses per second",
+ l2_pf_mrate, "100%"),
+ ])
+ except ValueError:
pass
- DC_RFOH = None
- DC_RFOM = None
- l2_rfo_all = None
- l2_rfo_mrate = None
- l2_rfo_rrate = None
+ rfo_group = None
try:
DC_RFOH = Event("L2_RQSTS.RFO_HIT")
DC_RFOM = Event("L2_RQSTS.RFO_MISS")
l2_rfo_all = DC_RFOH + DC_RFOM
l2_rfo_mrate = d_ratio(DC_RFOM, interval_sec)
l2_rfo_rrate = d_ratio(l2_rfo_all, interval_sec)
- except:
+ rfo_group = MetricGroup("lpm_l2_rfo", [
+ Metric("lpm_l2_rfo_hits", "L2 cache request for ownership (RFO) hits",
+ d_ratio(DC_RFOH, l2_rfo_all), "100%"),
+ Metric("lpm_l2_rfo_misses", "L2 cache request for ownership (RFO) misses",
+ d_ratio(DC_RFOM, l2_rfo_all), "100%"),
+ Metric("lpm_l2_rfo_requests", "L2 cache request for ownership (RFO) requests per second",
+ l2_rfo_rrate, "requests/s"),
+ Metric("lpm_l2_rfo_misses", "L2 cache request for ownership (RFO) misses per second",
+ l2_rfo_mrate, "misses/s"),
+ ])
+ except ValueError:
pass
DC_CH = None
try:
DC_CH = Event("L2_RQSTS.CODE_RD_HIT")
- except:
+ except ValueError:
pass
DC_CM = Event("L2_RQSTS.CODE_RD_MISS")
DC_IN = Event("L2_LINES_IN.ALL")
- DC_OUT_NS = None
- DC_OUT_S = None
- l2_lines_out = None
+
+ DC_WB_U = None
+ DC_WB_D = None
+ wbu = None
+ wbd = None
+ try:
+ DC_WB_U = Event("IDI_MISC.WB_UPGRADE")
+ DC_WB_D = Event("IDI_MISC.WB_DOWNGRADE")
+ wbu = d_ratio(DC_WB_U, interval_sec)
+ wbd = d_ratio(DC_WB_D, interval_sec)
+ except ValueError:
+ pass
+
l2_out_rate = None
wbn = None
isd = None
@@ -583,43 +617,24 @@ def IntelL2() -> Optional[MetricGroup]:
"L2_LINES_OUT.DEMAND_CLEAN",
"L2_LINES_IN.I")
if DC_OUT_S.name == "L2_LINES_OUT.SILENT" and (
- args.model.startswith("skylake") or
- args.model == "cascadelakex"):
+ _args.model.startswith("skylake") or
+ _args.model == "cascadelakex"):
DC_OUT_S.name = "L2_LINES_OUT.SILENT/any/"
# bring is back to per-CPU
l2_s = Select(DC_OUT_S / 2, Literal("#smt_on"), DC_OUT_S)
l2_ns = DC_OUT_NS
l2_lines_out = l2_s + l2_ns
l2_out_rate = d_ratio(l2_lines_out, interval_sec)
- nlr = max(l2_ns - DC_WB_U - DC_WB_D, 0)
- wbn = d_ratio(nlr, interval_sec)
+ if DC_WB_U and DC_WB_D:
+ nlr = max(l2_ns - DC_WB_U - DC_WB_D, 0)
+ wbn = d_ratio(nlr, interval_sec)
isd = d_ratio(l2_s, interval_sec)
- except:
- pass
- DC_OUT_U = None
- l2_pf_useless = None
- l2_useless_rate = None
- try:
- DC_OUT_U = Event("L2_LINES_OUT.USELESS_HWPF")
- l2_pf_useless = DC_OUT_U
- l2_useless_rate = d_ratio(l2_pf_useless, interval_sec)
- except:
- pass
- DC_WB_U = None
- DC_WB_D = None
- wbu = None
- wbd = None
- try:
- DC_WB_U = Event("IDI_MISC.WB_UPGRADE")
- DC_WB_D = Event("IDI_MISC.WB_DOWNGRADE")
- wbu = d_ratio(DC_WB_U, interval_sec)
- wbd = d_ratio(DC_WB_D, interval_sec)
- except:
+ except ValueError:
pass
l2_lines_in = DC_IN
l2_code_all = (DC_CH + DC_CM) if DC_CH else None
- l2_code_rate = d_ratio(l2_code_all, interval_sec) if DC_CH else None
+ l2_code_rate = d_ratio(l2_code_all, interval_sec) if l2_code_all else None
l2_code_miss_rate = d_ratio(DC_CM, interval_sec)
l2_in_rate = d_ratio(l2_lines_in, interval_sec)
@@ -640,35 +655,15 @@ def IntelL2() -> Optional[MetricGroup]:
Metric("lpm_l2_rd_misses", "L2 cache data read misses per second",
l2_dmnd_mrate, "misses/s"),
]),
- MetricGroup("lpm_l2_hwpf", [
- Metric("lpm_l2_hwpf_hits", "L2 cache hardware prefetcher hits",
- d_ratio(DC_PFH, l2_pf_all), "100%"),
- Metric("lpm_l2_hwpf_misses", "L2 cache hardware prefetcher misses",
- d_ratio(DC_PFM, l2_pf_all), "100%"),
- Metric("lpm_l2_hwpf_useless", "L2 cache hardware prefetcher useless prefetches per second",
- l2_useless_rate, "100%") if l2_useless_rate else None,
- Metric("lpm_l2_hwpf_requests", "L2 cache hardware prefetcher requests per second",
- l2_pf_rrate, "100%"),
- Metric("lpm_l2_hwpf_misses", "L2 cache hardware prefetcher misses per second",
- l2_pf_mrate, "100%"),
- ]) if DC_PFH else None,
- MetricGroup("lpm_l2_rfo", [
- Metric("lpm_l2_rfo_hits", "L2 cache request for ownership (RFO) hits",
- d_ratio(DC_RFOH, l2_rfo_all), "100%"),
- Metric("lpm_l2_rfo_misses", "L2 cache request for ownership (RFO) misses",
- d_ratio(DC_RFOM, l2_rfo_all), "100%"),
- Metric("lpm_l2_rfo_requests", "L2 cache request for ownership (RFO) requests per second",
- l2_rfo_rrate, "requests/s"),
- Metric("lpm_l2_rfo_misses", "L2 cache request for ownership (RFO) misses per second",
- l2_rfo_mrate, "misses/s"),
- ]) if DC_RFOH else None,
+ hwpf_group,
+ rfo_group,
MetricGroup("lpm_l2_code", [
Metric("lpm_l2_code_hits", "L2 cache code hits",
- d_ratio(DC_CH, l2_code_all), "100%") if DC_CH else None,
+ d_ratio(DC_CH, l2_code_all), "100%") if DC_CH and l2_code_all else None,
Metric("lpm_l2_code_misses", "L2 cache code misses",
- d_ratio(DC_CM, l2_code_all), "100%") if DC_CH else None,
+ d_ratio(DC_CM, l2_code_all), "100%") if DC_CH and l2_code_all else None,
Metric("lpm_l2_code_requests", "L2 cache code requests per second",
- l2_code_rate, "requests/s") if DC_CH else None,
+ l2_code_rate, "requests/s") if l2_code_rate else None,
Metric("lpm_l2_code_misses", "L2 cache code misses per second",
l2_code_miss_rate, "misses/s"),
]),
@@ -706,7 +701,7 @@ def IntelMissLat() -> Optional[MetricGroup]:
"UNC_CHA_TOR_INSERTS.IA_MISS",
"UNC_C_TOR_INSERTS.MISS_REMOTE_OPCODE",
"UNC_C_TOR_INSERTS.NID_MISS_OPCODE")
- except:
+ except ValueError:
return None
if (data_rd_loc_occ.name == "UNC_C_TOR_OCCUPANCY.MISS_LOCAL_OPCODE" or
@@ -752,8 +747,8 @@ def IntelMissLat() -> Optional[MetricGroup]:
def IntelMlp() -> Optional[Metric]:
try:
l1d = Event("L1D_PEND_MISS.PENDING")
- l1dc = Event("L1D_PEND_MISS.PENDING_CYCLES")
- except:
+ l1dc: Expression = Event("L1D_PEND_MISS.PENDING_CYCLES")
+ except ValueError:
return None
l1dc = Select(l1dc / 2, Literal("#smt_on"), l1dc)
@@ -764,8 +759,9 @@ def IntelMlp() -> Optional[Metric]:
def IntelPorts() -> Optional[MetricGroup]:
- pipeline_events = json.load(
- open(f"{_args.events_path}/x86/{_args.model}/pipeline.json"))
+ assert _args is not None
+ with open(f"{_args.events_path}/x86/{_args.model}/pipeline.json", encoding="utf-8") as f:
+ pipeline_events = json.load(f)
core_cycles = Event("CPU_CLK_UNHALTED.THREAD_P_ANY",
"CPU_CLK_UNHALTED.DISTRIBUTED",
@@ -777,11 +773,10 @@ def IntelPorts() -> Optional[MetricGroup]:
for x in pipeline_events:
if "EventName" in x and re.search("^UOPS_DISPATCHED.PORT", x["EventName"]):
name = x["EventName"]
- port = re.search(r"(PORT_[0-9].*)", name).group(0).lower()
- if name.endswith("_CORE"):
- cyc = core_cycles
- else:
- cyc = smt_cycles
+ match = re.search(r"(PORT_[0-9].*)", name)
+ assert match is not None
+ port = match.group(0).lower()
+ cyc: Expression = core_cycles if name.endswith("_CORE") else smt_cycles
metrics.append(Metric(f"lpm_{port}", f"{port} utilization (higher is better)",
d_ratio(Event(name), cyc), "100%"))
if len(metrics) == 0:
@@ -800,7 +795,7 @@ def IntelSwpf() -> Optional[MetricGroup]:
s_t0 = Event("SW_PREFETCH_ACCESS.T0")
s_t1 = Event("SW_PREFETCH_ACCESS.T1_T2")
s_w = Event("SW_PREFETCH_ACCESS.PREFETCHW")
- except:
+ except ValueError:
return None
all_sw = s_nta + s_t0 + s_t1 + s_w
@@ -857,6 +852,7 @@ def IntelSwpf() -> Optional[MetricGroup]:
def IntelLdSt() -> Optional[MetricGroup]:
+ assert _args is not None
if _args.model in [
"bonnell",
"nehalemep",
@@ -882,12 +878,12 @@ def IntelLdSt() -> Optional[MetricGroup]:
LDST_PRE = None
try:
LDST_PRE = Event("LOAD_HIT_PREFETCH.SWPF", "LOAD_HIT_PRE.SW_PF")
- except:
+ except ValueError:
pass
LDST_AT = None
try:
LDST_AT = Event("MEM_INST_RETIRED.LOCK_LOADS")
- except:
+ except ValueError:
pass
cyc = LDST_CYC
@@ -945,8 +941,8 @@ def UncoreCState() -> Optional[MetricGroup]:
pcu_ticks = Event("UNC_P_CLOCKTICKS")
c0 = Event("UNC_P_POWER_STATE_OCCUPANCY.CORES_C0")
c3 = Event("UNC_P_POWER_STATE_OCCUPANCY.CORES_C3")
- c6 = Event("UNC_P_POWER_STATE_OCCUPANCY.CORES_C6")
- except:
+ c6: Expression = Event("UNC_P_POWER_STATE_OCCUPANCY.CORES_C6")
+ except ValueError:
return None
num_cores = Literal("#num_cores") / Literal("#num_packages")
@@ -981,13 +977,10 @@ def UncoreDir() -> Optional[MetricGroup]:
cha_upd = Event("UNC_CHA_DIR_UPDATE.HA")
# Turn the umask into a ANY rather than HA filter.
cha_upd.name += "/umask=3,name=UNC_CHA_DIR_UPDATE.ANY/"
- except:
+ except ValueError:
return None
m2m_total = m2m_hits + m2m_miss
- upd = m2m_upd + cha_upd # in cache lines
- upd_r = upd / interval_sec
- look_r = m2m_total / interval_sec
scale = 64 / 1_000_000 # Cache lines to MB
return MetricGroup("lpm_dir", [
@@ -1014,7 +1007,7 @@ def UncoreMem() -> Optional[MetricGroup]:
"UNC_H_REQUESTS.WRITES_LOCAL")
rem_wrs = Event("UNC_CHA_REQUESTS.WRITES_REMOTE",
"UNC_H_REQUESTS.WRITES_REMOTE")
- except:
+ except ValueError:
return None
scale = 64 / 1_000_000
@@ -1035,16 +1028,18 @@ def UncoreMem() -> Optional[MetricGroup]:
def UncoreMemBw() -> Optional[MetricGroup]:
+ assert _args is not None
mem_events = []
try:
- mem_events = json.load(open(f"{os.path.dirname(os.path.realpath(__file__))}"
- f"/arch/x86/{args.model}/uncore-memory.json"))
- except:
+ with open(f"{os.path.dirname(os.path.realpath(__file__))}"
+ f"/arch/x86/{_args.model}/uncore-memory.json", encoding="utf-8") as f:
+ mem_events = json.load(f)
+ except (OSError, ValueError):
pass
- ddr_rds = 0
- ddr_wrs = 0
- ddr_total = 0
+ ddr_rds: Union[int, Expression] = 0
+ ddr_wrs: Union[int, Expression] = 0
+ ddr_total: Union[int, Expression] = 0
for x in mem_events:
if "EventName" in x:
name = x["EventName"]
@@ -1059,17 +1054,17 @@ def UncoreMemBw() -> Optional[MetricGroup]:
try:
ddr_rds = Event("UNC_M_CAS_COUNT.RD")
ddr_wrs = Event("UNC_M_CAS_COUNT.WR")
- except:
+ except ValueError:
return None
ddr_total = ddr_rds + ddr_wrs
- pmm_rds = 0
- pmm_wrs = 0
+ pmm_rds: Union[int, Expression] = 0
+ pmm_wrs: Union[int, Expression] = 0
try:
pmm_rds = Event("UNC_M_PMM_RPQ_INSERTS")
pmm_wrs = Event("UNC_M_PMM_WPQ_INSERTS")
- except:
+ except ValueError:
pass
pmm_total = pmm_rds + pmm_wrs
@@ -1101,7 +1096,7 @@ def UncoreMemSat() -> Optional[Metric]:
sat = Event("UNC_CHA_DISTRESS_ASSERTED.VERT", "UNC_CHA_FAST_ASSERTED.VERT",
"UNC_C_FAST_ASSERTED", "UNC_CHA_DISTRESS_ASSERTED.DPT_ANY",
"UNC_CHA_DISTRESS_ASSERTED.DPT_NONLOCAL")
- except:
+ except ValueError:
return None
desc = ("Mesh Bandwidth saturation (% CBOX cycles with FAST signal asserted, "
@@ -1116,11 +1111,9 @@ def UncoreUpiBw() -> Optional[MetricGroup]:
try:
upi_rds = Event("UNC_UPI_RxL_FLITS.ALL_DATA")
upi_wrs = Event("UNC_UPI_TxL_FLITS.ALL_DATA")
- except:
+ except ValueError:
return None
- upi_total = upi_rds + upi_wrs
-
# From "Uncore Performance Monitoring": When measuring the amount of
# bandwidth consumed by transmission of the data (i.e. NOT including
# the header), it should be .ALL_DATA / 9 * 64B.
diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index 860027bb71b2..e853a06cbade 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -3,7 +3,6 @@
"""Convert directories of JSON events to C code."""
import argparse
import csv
-from functools import lru_cache
import json
import metric
import os
@@ -22,7 +21,7 @@ _metric_tables: list[str] = []
# List of metric tables generated from "/sys" directories.
_sys_metric_tables: list[str] = []
# Mapping between sys event table names and sys metric table names.
-_sys_event_table_to_metric_table_mapping = {}
+_sys_event_table_to_metric_table_mapping: Dict[str, str] = {}
# Map from an event name to an architecture standard
# JsonEvent. Architecture standard events are in json files in the top
# f'{_args.starting_dir}/{_args.arch}' directory.
@@ -38,7 +37,7 @@ _pending_metrics_tblname: Optional[str] = None
# Global BigCString shared by all structures.
_bcs = None
# Map from the name of a metric group to a description of the group.
-_metricgroups = {}
+_metricgroups: Dict[str, str] = {}
# Order specific JsonEvent attributes will be visited.
_json_event_attributes = [
# cmp_sevent related attributes.
@@ -124,17 +123,17 @@ class BigCString:
def __init__(self):
self.strings = set()
- self.insert_number = 0;
+ self.insert_number = 0
self.insert_point = {}
self.metrics = set()
- def add(self, s: str, metric: bool) -> None:
+ def add(self, s: str, is_metric: bool) -> None:
"""Called to add to the big string."""
if s not in self.strings:
self.strings.add(s)
self.insert_point[s] = self.insert_number
self.insert_number += 1
- if metric:
+ if is_metric:
self.metrics.add(s)
def compute(self) -> None:
@@ -313,7 +312,7 @@ class JsonEvent:
return int(val, 16) == 0
else:
return int(val) == 0
- except:
+ except ValueError:
return False
def canonicalize_value(val: str) -> str:
@@ -321,7 +320,7 @@ class JsonEvent:
if val.startswith('0x'):
return llx(int(val, 16))
return str(int(val))
- except:
+ except ValueError:
return val
eventcode = 0
@@ -436,15 +435,15 @@ class JsonEvent:
s += f'\t{attr} = {value},\n'
return s + '}'
- def build_c_string(self, metric: bool) -> str:
+ def build_c_string(self, is_metric: bool) -> str:
s = ''
- for attr in _json_metric_attributes if metric else _json_event_attributes:
+ for attr in _json_metric_attributes if is_metric else _json_event_attributes:
x = getattr(self, attr)
- if metric and x and attr == 'metric_expr':
+ if is_metric and x and attr == 'metric_expr':
# Convert parsed metric expressions into a string. Slashes
# must be doubled in the file.
x = x.ToPerfJson().replace('\\', '\\\\')
- if metric and x and attr == 'metric_threshold':
+ if is_metric and x and attr == 'metric_threshold':
x = x.replace('\\', '\\\\')
if attr in _json_enum_attributes:
s += x if x else '0'
@@ -452,24 +451,25 @@ class JsonEvent:
s += f'{x}\\000' if x else '\\000'
return s
- def to_c_string(self, metric: bool) -> str:
+ def to_c_string(self, is_metric: bool) -> str:
"""Representation of the event as a C struct initializer."""
def make_comment(s: str) -> str:
s = s.replace('*/', r'\*\/')
return f'\t/* {s} */\n' if len(s) < 80 else f'\t/* {s[0:80]}... */\n'
- s = self.build_c_string(metric)
+ s = self.build_c_string(is_metric)
assert _bcs is not None
return f'{make_comment(s)}\t{{ { _bcs.offsets[s] } }},\n'
-_json_cache = {}
+_json_cache: Dict[Tuple[str, str], Sequence[JsonEvent]] = {}
def _read_json_events_impl(path: str, topic: str) -> Sequence[JsonEvent]:
"""Read json events from the specified file."""
try:
- events = json.load(open(path), object_hook=JsonEvent)
- except BaseException as err:
+ with open(path, encoding='utf-8') as f:
+ events = json.load(f, object_hook=JsonEvent)
+ except BaseException:
print(f"Exception processing {path}")
raise
metrics: list[Tuple[str, str, metric.Expression]] = []
@@ -493,7 +493,6 @@ def read_json_events(path: str, topic: str) -> Sequence[JsonEvent]:
def preprocess_arch_std_files(archpath: str) -> None:
"""Read in all architecture standard events."""
- global _arch_std_events
for item in os.scandir(archpath):
if not item.is_file() or not item.name.endswith('.json'):
continue
@@ -533,13 +532,10 @@ def print_pending_events() -> None:
if not _pending_events:
return
- global _pending_events_tblname
assert _pending_events_tblname is not None
if _pending_events_tblname.endswith('_sys'):
- global _sys_event_tables
_sys_event_tables.append(_pending_events_tblname)
else:
- global event_tables
_event_tables.append(_pending_events_tblname)
first = True
@@ -560,7 +556,7 @@ def print_pending_events() -> None:
last_pmu = event.pmu
pmus.add((event.pmu, pmu_name))
- _args.output_file.write(event.to_c_string(metric=False))
+ _args.output_file.write(event.to_c_string(is_metric=False))
last_name = event.name
_pending_events = []
@@ -596,31 +592,28 @@ def print_pending_metrics() -> None:
if not _pending_metrics:
return
- global _pending_metrics_tblname
assert _pending_metrics_tblname is not None
if _pending_metrics_tblname.endswith('_sys'):
- global _sys_metric_tables
_sys_metric_tables.append(_pending_metrics_tblname)
else:
- global metric_tables
_metric_tables.append(_pending_metrics_tblname)
first = True
last_pmu = None
pmus: Set[Tuple[str, str]] = set()
assert _args is not None
- for metric in sorted(_pending_metrics, key=metric_cmp_key):
- if metric.pmu != last_pmu:
+ for m in sorted(_pending_metrics, key=metric_cmp_key):
+ if m.pmu != last_pmu:
if not first:
_args.output_file.write('};\n')
- pmu_name = metric.pmu.replace(',', '_')
+ pmu_name = m.pmu.replace(',', '_')
_args.output_file.write(
f'static const struct compact_pmu_event {_pending_metrics_tblname}_{pmu_name}[] = {{\n')
first = False
- last_pmu = metric.pmu
- pmus.add((metric.pmu, pmu_name))
+ last_pmu = m.pmu
+ pmus.add((m.pmu, pmu_name))
- _args.output_file.write(metric.to_c_string(metric=True))
+ _args.output_file.write(m.to_c_string(is_metric=True))
_pending_metrics = []
_args.output_file.write(f"""
@@ -659,13 +652,14 @@ def preprocess_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
assert _bcs is not None
if item.name.endswith('metricgroups.json'):
- metricgroup_descriptions = json.load(open(item.path))
+ with open(item.path, encoding='utf-8') as f:
+ metricgroup_descriptions = json.load(f)
for mgroup in metricgroup_descriptions:
assert len(mgroup) > 1, parents
description = f"{metricgroup_descriptions[mgroup]}\\000"
mgroup = f"{mgroup}\\000"
- _bcs.add(mgroup, metric=True)
- _bcs.add(description, metric=True)
+ _bcs.add(mgroup, is_metric=True)
+ _bcs.add(description, is_metric=True)
_metricgroups[mgroup] = description
return
@@ -673,11 +667,12 @@ def preprocess_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
for event in read_json_events(item.path, topic):
pmu_name = f"{event.pmu}\\000"
if event.name:
- _bcs.add(pmu_name, metric=False)
- _bcs.add(event.build_c_string(metric=False), metric=False)
+ _bcs.add(pmu_name, is_metric=False)
+ _bcs.add(event.build_c_string(is_metric=False), is_metric=False)
if event.metric_name:
- _bcs.add(pmu_name, metric=True)
- _bcs.add(event.build_c_string(metric=True), metric=True)
+ pmu_name = f"{event.pmu}\\000"
+ _bcs.add(pmu_name, is_metric=True)
+ _bcs.add(event.build_c_string(is_metric=True), is_metric=True)
def process_one_file(parents: Sequence[str], item: os.DirEntry) -> None:
"""Process a JSON file during the main walk."""
@@ -787,7 +782,7 @@ static const struct pmu_events_map pmu_events_map[] = {
},
""")
else:
- with open(f'{_args.starting_dir}/{arch}/mapfile.csv') as csvfile:
+ with open(f'{_args.starting_dir}/{arch}/mapfile.csv', encoding='utf-8') as csvfile:
table = csv.reader(csvfile)
first = True
for row in table:
@@ -881,8 +876,8 @@ int pmu_metrics_table__iterate_tables(pmu_metrics_table_iter_t fn, void *data)
def print_system_mapping_table() -> None:
- assert _args is not None
"""C struct mapping table array for tables from /sys directories."""
+ assert _args is not None
_args.output_file.write("""
struct pmu_sys_events {
\tconst char *name;
@@ -1484,7 +1479,7 @@ def main() -> None:
except Exception as e:
raise RuntimeError(f'Action failure for \'{item.name}\' in {parents}') from e
if item.is_dir():
- ftw(item.path, parents + [item.name], action)
+ ftw(item.path, list(parents) + [item.name], action)
ap = argparse.ArgumentParser()
ap.add_argument('arch', help='Architecture name like x86')
diff --git a/tools/perf/pmu-events/make_legacy_cache.py b/tools/perf/pmu-events/make_legacy_cache.py
index 28a1ff804f86..b224544f85f6 100755
--- a/tools/perf/pmu-events/make_legacy_cache.py
+++ b/tools/perf/pmu-events/make_legacy_cache.py
@@ -61,7 +61,7 @@ hw_cache_result = [
"misses"),
]
-events = []
+events: list[dict[str, str]] = []
def add_event(name: str,
cache_id: int, cache_op: int, cache_result: int,
desc: str,
@@ -87,10 +87,10 @@ def add_event(name: str,
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,
+for (cid, names, ops, cache_desc) in hw_cache_id:
+ for cname in names:
+ add_event(cname,
+ cid,
0, # PERF_COUNT_HW_CACHE_OP_READ
0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
f"{cache_desc} read accesses.",
@@ -100,27 +100,29 @@ for (cache_id, names, ops, cache_desc) in hw_cache_id:
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,
+ is_deprecated = (names[0] != cname or op_names[1] != op_name)
+ add_event(f"{cname}-{op_name}",
+ cid,
op,
0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
f"{cache_desc} {op_desc} accesses.",
- deprecated)
+ is_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,
+ is_deprecated = ((names[0] != cname or op_names[0] != op_name) or
+ (result == 0) or (result_names[0] != result_name))
+ add_event(f"{cname}-{op_name}-{result_name}",
+ cid,
+ op,
+ result,
f"{cache_desc} {op_desc} {result_desc}.",
- deprecated)
+ is_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,
+ add_event(f"{cname}-{result_name}",
+ cid,
0, # PERF_COUNT_HW_CACHE_OP_READ
result,
f"{cache_desc} read {result_desc}.",
diff --git a/tools/perf/pmu-events/metric.py b/tools/perf/pmu-events/metric.py
index ce025675898c..92144c5d8024 100644
--- a/tools/perf/pmu-events/metric.py
+++ b/tools/perf/pmu-events/metric.py
@@ -6,18 +6,16 @@ import json
import os
import re
from enum import Enum
-from typing import Dict, List, Optional, Set, Tuple, Union
+from typing import Dict, List, Optional, Sequence, Set, Tuple, Union
-all_pmus = set()
-all_events = set()
-experimental_events = set()
-all_events_all_models = set()
+all_pmus: Set[str] = set()
+all_events: Set[str] = set()
+experimental_events: Set[str] = set()
+all_events_all_models: Set[str] = set()
def LoadEvents(directory: str) -> None:
"""Populate a global set of all known events for the purpose of validating Event names"""
- global all_pmus
global all_events
- global experimental_events
global all_events_all_models
all_events = {
"context\\-switches",
@@ -30,29 +28,31 @@ def LoadEvents(directory: str) -> None:
filename = os.fsdecode(file)
if filename.endswith(".json"):
try:
- for x in json.load(open(f"{directory}/{filename}")):
- if "Unit" in x:
- all_pmus.add(x["Unit"])
- if "EventName" in x:
- all_events.add(x["EventName"])
- if "Experimental" in x and x["Experimental"] == "1":
- experimental_events.add(x["EventName"])
- elif "ArchStdEvent" in x:
- all_events.add(x["ArchStdEvent"])
+ with open(f"{directory}/{filename}", encoding="utf-8") as f:
+ for x in json.load(f):
+ if "Unit" in x:
+ all_pmus.add(x["Unit"])
+ if "EventName" in x:
+ all_events.add(x["EventName"])
+ if "Experimental" in x and x["Experimental"] == "1":
+ experimental_events.add(x["EventName"])
+ elif "ArchStdEvent" in x:
+ all_events.add(x["ArchStdEvent"])
except json.decoder.JSONDecodeError:
# The generated directory may be the same as the input, which
# causes partial json files. Ignore errors.
pass
all_events_all_models = all_events.copy()
- for root, dirs, files in os.walk(directory + ".."):
+ for root, _, files in os.walk(directory + ".."):
for filename in files:
if filename.endswith(".json"):
try:
- for x in json.load(open(f"{root}/{filename}")):
- if "EventName" in x:
- all_events_all_models.add(x["EventName"])
- elif "ArchStdEvent" in x:
- all_events_all_models.add(x["ArchStdEvent"])
+ with open(f"{root}/{filename}", encoding="utf-8") as f:
+ for x in json.load(f):
+ if "EventName" in x:
+ all_events_all_models.add(x["EventName"])
+ elif "ArchStdEvent" in x:
+ all_events_all_models.add(x["ArchStdEvent"])
except json.decoder.JSONDecodeError:
# The generated directory may be the same as the input, which
# causes partial json files. Ignore errors.
@@ -65,7 +65,6 @@ def CheckPmu(name: str) -> bool:
def CheckEvent(name: str) -> bool:
"""Check the event name exists in the set of all loaded events"""
- global all_events
if len(all_events) == 0:
# No events loaded so assume any event is good.
return True
@@ -81,7 +80,6 @@ def CheckEvent(name: str) -> bool:
def CheckEveryEvent(*names: str) -> None:
"""Check all the events exist in at least one json file"""
- global all_events_all_models
if len(all_events_all_models) == 0:
assert len(names) == 1, f"Cannot determine valid events in {names}"
# No events loaded so assume any event is good.
@@ -96,11 +94,10 @@ def CheckEveryEvent(*names: str) -> None:
if any([name.startswith(x) for x in ['amd', 'arm', 'cpu', 'msr', 'power', 'cha', 'uncore']]):
continue
if name not in all_events_all_models:
- raise Exception(f"Is {name} a named json event?")
+ raise ValueError(f"Is {name} a named json event?")
def IsExperimentalEvent(name: str) -> bool:
- global experimental_events
if ':' in name:
# Remove trailing modifier.
name = name[:name.find(':')]
@@ -447,8 +444,7 @@ class Event(Expression):
error += " or " + name
else:
error = name
- global all_events
- raise Exception(f"No event {error} in:\n{all_events}")
+ raise ValueError(f"No event {error} in:\n{all_events}")
def HasExperimentalEvents(self) -> bool:
return IsExperimentalEvent(self.name)
@@ -655,7 +651,7 @@ class Metric:
return result
- def ToMetricGroupDescriptions(self, root: bool = True) -> Dict[str, str]:
+ def ToMetricGroupDescriptions(self, _root: bool = True) -> Dict[str, str]:
return {}
class MetricGroup:
@@ -667,7 +663,7 @@ class MetricGroup:
"""
def __init__(self, name: str,
- metric_list: List[Union[Optional[Metric], Optional['MetricGroup']]],
+ metric_list: Sequence[Union[Optional[Metric], Optional['MetricGroup']]],
description: Optional[str] = None):
self.name = name
self.metric_list = []
@@ -696,7 +692,7 @@ class MetricGroup:
result.append(x.ToPerfJson())
return result
- def ToMetricGroupDescriptions(self, root: bool = True) -> Dict[str, str]:
+ def ToMetricGroupDescriptions(self, _root: bool = True) -> Dict[str, str]:
result = {self.name: self.description} if self.description else {}
for x in self.metric_list:
result.update(x.ToMetricGroupDescriptions(False))
--
2.55.0.1082.g2b9226bbc0-goog
next prev parent reply other threads:[~2026-09-20 5:22 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-20 5:20 [PATCH v1 00/49] perf: Complete transition to standalone Python scripts Ian Rogers
2026-09-20 5:20 ` [PATCH v1 01/49] perf python: Update syscall format string to optional positional Ian Rogers
2026-09-20 5:20 ` [PATCH v1 02/49] perf python: Update callchain stubs and session thread lookup Ian Rogers
2026-09-20 5:20 ` [PATCH v1 03/49] perf python: Clean up pylint warnings in ilist.py Ian Rogers
2026-09-20 5:20 ` [PATCH v1 04/49] perf python: Clean up pylint warnings in treport.py Ian Rogers
2026-09-20 5:20 ` [PATCH v1 05/49] perf python: Clean up pylint warnings in tracepoint.py Ian Rogers
2026-09-20 5:20 ` [PATCH v1 06/49] perf python: Clean up pylint warnings in twatch.py Ian Rogers
2026-09-20 5:20 ` [PATCH v1 07/49] perf python: Improve perf script -l descriptions Ian Rogers
2026-09-20 5:21 ` [PATCH v1 08/49] perf python: Expose addr location, transaction, and context_switch Ian Rogers
2026-09-20 5:21 ` [PATCH v1 09/49] perf python: Add Intel PT call_return and itrace capability Ian Rogers
2026-09-20 5:21 ` [PATCH v1 10/49] perf python: Allow KeyboardInterrupt to propagate in LiveSession Ian Rogers
2026-09-20 5:21 ` Ian Rogers [this message]
2026-09-20 5:21 ` [PATCH v1 12/49] perf test: Clean up mypy and pylint issues in shell test libraries Ian Rogers
2026-09-20 5:21 ` [PATCH v1 13/49] perf build: Make mypy build test opt-out (NO_MYPY=1) Ian Rogers
2026-09-20 5:21 ` [PATCH v1 14/49] perf build: Make pylint build test opt-out (NO_PYLINT=1) Ian Rogers
2026-09-20 5:21 ` [PATCH v1 15/49] perf Makefile: Install standalone Python scripts during transition Ian Rogers
2026-09-20 5:21 ` [PATCH v1 16/49] perf python: Port stat-cpi to perf module Ian Rogers
2026-09-20 5:21 ` [PATCH v1 17/49] perf python: Port mem-phys-addr " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 18/49] perf python: Port stackcollapse " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 19/49] perf python: Port flamegraph " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 20/49] perf python: Port gecko " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 21/49] perf python: Port event_analyzing_sample " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 22/49] perf python: Port syscall-counts " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 23/49] perf python: Port syscall-counts-by-pid " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 24/49] perf python: Port failed-syscalls-by-pid " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 25/49] perf python: Port failed-syscalls from Perl " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 26/49] perf python: Port sctop " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 27/49] perf python: Port rw-by-file from Perl " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 28/49] perf python: Port rw-by-pid " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 29/49] perf python: Port rwtop " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 30/49] perf python: Port futex-contention " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 31/49] perf python: Port task-analyzer " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 32/49] perf python: Port sched-migration and SchedGui " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 33/49] perf python: Port wakeup-latency from Perl " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 34/49] perf python: Port compaction-times " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 35/49] perf python: Port net_dropmonitor " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 36/49] perf python: Port netdev-times " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 37/49] perf python: Port check-perf-trace " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 38/49] perf python: Port arm-cs-trace-disasm " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 39/49] perf python: Port powerpc-hcalls " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 40/49] perf python: Port intel-pt-events and libxed " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 41/49] perf test: Migrate Intel PT virtual LBR test to Python API Ian Rogers
2026-09-20 5:21 ` [PATCH v1 42/49] perf python: Port export-to-sqlite to perf module Ian Rogers
2026-09-20 5:21 ` [PATCH v1 43/49] perf python: Port export-to-postgresql " Ian Rogers
2026-09-20 5:21 ` [PATCH v1 44/49] perf python: Move and clean up exported-sql-viewer.py Ian Rogers
2026-09-20 5:21 ` [PATCH v1 45/49] perf python: Move and clean up parallel-perf.py Ian Rogers
2026-09-20 5:21 ` [PATCH v1 46/49] perf: Remove libpython support and legacy Python scripts Ian Rogers
2026-09-20 5:21 ` [PATCH v1 47/49] perf Makefile: Update Python script installation path Ian Rogers
2026-09-20 5:21 ` [PATCH v1 48/49] perf script: Support standalone scripts and remove embedded scripting Ian Rogers
2026-09-20 5:21 ` [PATCH v1 49/49] perf Documentation: Update for standalone Python scripts Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=339d7d6a5c9d2c4900871cf1221e7bb67dd99ec2.1789880842.git.irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alice.mei.rogers@gmail.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=james.clark@linaro.org \
--cc=leo.yan@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=tmricht@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®