From nobody Thu Dec 11 19:20:27 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7C5E2D7DFE for ; Tue, 2 Dec 2025 17:52:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764697954; cv=none; b=tHuAxpp0Tryb8HJ2LEYXcvBZ4stZcjYQmNw/seAlSiMKG6WN8t+O+kEvs2z8IxWQE1EDbPvfp2pB2o/oQZjgUL99fpJyMyPo7hTz3oJOmZ93fFBMOwMRLGGTWx2eYFlp2uc8NHFav9UHmlWXU27mPKVpFhljYyv5fRmBXepIIJc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764697954; c=relaxed/simple; bh=7RnGkPZOpGKGatjj+MFrqJQE14RNbTv5rkqCzRl2MH0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=UcMVZcCb5l4uO9TI+r11I7n+ZbdXrIfkl3nSYg8PJaYbgcSOT1QhtGOo79c3sdOUE+RO+1NRkqjXd3ZX7cu3VvpkgamHuaUQivPec3IDpjpq7WWOxll/KmzCTU/5DjdBUxAAqNTPltbOjH4HJtf+yclAnLUZLf2Xs9RAv3ve1A4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=wsgK+mru; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="wsgK+mru" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b9d73d57328so6395704a12.1 for ; Tue, 02 Dec 2025 09:52:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1764697952; x=1765302752; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=kKDA0IrKz790dnyekDQWaFWB3MnJqfzTphK128DE4rY=; b=wsgK+mru92dCpHxwE5g9zGy31nZdqWeFGGyVG68DgesGeMfaxktMe0sgWm4aaW2fep NFAyoGArqU+s/YRl/yEs2d1TtdalAy+SBxbHUwJtbccojlBCKzMmEXzYF4/sESUi5qoM geQL5SPktU+aagi/mdgfoz1RGLzokyoaMX9/Pcs4cHvRsuJNDo7TP///FUuIE/SrFU9f Pt8wuJw1HWh+piMh4Rh7Crwz4jsz7oNeF7mBgQ12TMePJW7xCIgPI73Ksm958gxTHOMA gncLvEhNM1jTRB9prfv+2KTCFI2zss2hG2YxaosL0LNdNsq92aznFCbtNQIe9nJww6PO uRBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764697952; x=1765302752; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kKDA0IrKz790dnyekDQWaFWB3MnJqfzTphK128DE4rY=; b=ceqgNuRZi2xeSyw2OV+fYIg+QWoyQGNKlzmLxpitQHIywODHeJHu2kx2jRh5nJHTlL i6VWk0yWCbKkiVsrO5ShlB+/IsbNiZ0cEywdkgsupN0GcxocGpRaosJcU5NV94lGHeuX i0LW58S6PAbfh5zt/hmuxafL2z5Di+lzgBEzHSo2pdQMNoHap6yytQG0dfj9d4jtoB7t wEkjI+Ru5VCYCtuaO+Cg5mfu3SezkBAKlL4x5q8+MC4KS7HCqbpEUSba5ZdskWic9xHR 5qZ/G+F9ilB5nsQqxmyG+TqFSM2mw4AjACIcR81LqRCVQ1VjiFU5ETko1LvsnNEJ2keg S45Q== X-Forwarded-Encrypted: i=1; AJvYcCU00M0luusGxmzHXLYpfYsKvUI1llstm8Si1jzE9JJCK2DqcJ/pswDa9afRXvlkdTovq9LlFRmZb9aGZKI=@vger.kernel.org X-Gm-Message-State: AOJu0YyQdQPq66wd6giUm5jUNSF6FpJhyPmYW/QwMJ/k/4pYm7Q0nfy9 tzY02hXowEz7L02b9uYjkw8CO/IWbViYaC1PK0/Wn1WTbJvMQVj/WJBa55OVbOvE3KZJuo9eVIO DwH9gMAArsA== X-Google-Smtp-Source: AGHT+IFWM63cnWnkLe7ok63yjTdk6eHNw0ET7DDAEa0omGoKQKoWY4gPGg8hY8IO9Zc5sulUb+hNnVzRfsqe X-Received: from dycou23.prod.google.com ([2002:a05:7300:dc97:b0:2a4:6577:68f1]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7301:9c91:b0:2a4:4f86:822a with SMTP id 5a478bee46e88-2a941887a80mr12900570eec.33.1764697951923; Tue, 02 Dec 2025 09:52:31 -0800 (PST) Date: Tue, 2 Dec 2025 09:50:13 -0800 In-Reply-To: <20251202175043.623597-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251202175043.623597-1-irogers@google.com> X-Mailer: git-send-email 2.52.0.158.g65b55ccf14-goog Message-ID: <20251202175043.623597-19-irogers@google.com> Subject: [PATCH v9 18/48] perf jevents: Add br metric group for branch statistics on AMD From: Ian Rogers To: Adrian Hunter , Alexander Shishkin , Arnaldo Carvalho de Melo , Benjamin Gray , Caleb Biggers , Edward Baker , Ian Rogers , Ingo Molnar , James Clark , Jing Zhang , Jiri Olsa , John Garry , Leo Yan , Namhyung Kim , Perry Taylor , Peter Zijlstra , Samantha Alt , Sandipan Das , Thomas Falcon , Weilin Wang , Xu Yang , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The br metric group for branches itself comprises metric groups for total, taken, conditional, fused and far metric groups using json events. The lack of conditional events on anything but zen2 means this category is lacking on zen1, zen3 and zen4. Signed-off-by: Ian Rogers Reviewed-by: Sandipan Das --- tools/perf/pmu-events/amd_metrics.py | 104 +++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/tools/perf/pmu-events/amd_metrics.py b/tools/perf/pmu-events/a= md_metrics.py index 42e46b33334d..1880ccf9c6fc 100755 --- a/tools/perf/pmu-events/amd_metrics.py +++ b/tools/perf/pmu-events/amd_metrics.py @@ -18,6 +18,109 @@ cycles =3D Event("cycles") smt_cycles =3D Select(cycles / 2, Literal("#smt_on"), cycles) =20 =20 +def AmdBr(): + def Total() -> MetricGroup: + br =3D Event("ex_ret_brn") + br_m_all =3D Event("ex_ret_brn_misp") + br_clr =3D Event("ex_ret_msprd_brnch_instr_dir_msmtch", + "ex_ret_brn_resync") + + br_r =3D d_ratio(br, interval_sec) + ins_r =3D d_ratio(ins, br) + misp_r =3D d_ratio(br_m_all, br) + clr_r =3D d_ratio(br_clr, interval_sec) + + return MetricGroup("lpm_br_total", [ + Metric("lpm_br_total_retired", + "The number of branch instructions retired per second."= , br_r, + "insn/s"), + Metric( + "lpm_br_total_mispred", + "The number of branch instructions retired, of any type, t= hat were " + "not correctly predicted as a percentage of all branch ins= trucions.", + misp_r, "100%"), + Metric("lpm_br_total_insn_between_branches", + "The number of instructions divided by the number of br= anches.", + ins_r, "insn"), + Metric("lpm_br_total_insn_fe_resteers", + "The number of resync branches per second.", clr_r, "re= q/s") + ]) + + def Taken() -> MetricGroup: + br =3D Event("ex_ret_brn_tkn") + br_m_tk =3D Event("ex_ret_brn_tkn_misp") + br_r =3D d_ratio(br, interval_sec) + ins_r =3D d_ratio(ins, br) + misp_r =3D d_ratio(br_m_tk, br) + return MetricGroup("lpm_br_taken", [ + Metric("lpm_br_taken_retired", + "The number of taken branches that were retired per sec= ond.", + br_r, "insn/s"), + Metric( + "lpm_br_taken_mispred", + "The number of retired taken branch instructions that were= " + "mispredicted as a percentage of all taken branches.", mis= p_r, + "100%"), + Metric( + "lpm_br_taken_insn_between_branches", + "The number of instructions divided by the number of taken= branches.", + ins_r, "insn"), + ]) + + def Conditional() -> Optional[MetricGroup]: + global _zen_model + br =3D Event("ex_ret_cond") + br_r =3D d_ratio(br, interval_sec) + ins_r =3D d_ratio(ins, br) + + metrics =3D [ + Metric("lpm_br_cond_retired", "Retired conditional branch inst= ructions.", + br_r, "insn/s"), + Metric("lpm_br_cond_insn_between_branches", + "The number of instructions divided by the number of co= nditional " + "branches.", ins_r, "insn"), + ] + if _zen_model =3D=3D 2: + br_m_cond =3D Event("ex_ret_cond_misp") + misp_r =3D d_ratio(br_m_cond, br) + metrics +=3D [ + Metric("lpm_br_cond_mispred", + "Retired conditional branch instructions mispredict= ed as a " + "percentage of all conditional branches.", misp_r, = "100%"), + ] + + return MetricGroup("lpm_br_cond", metrics) + + def Fused() -> MetricGroup: + br =3D Event("ex_ret_fused_instr", "ex_ret_fus_brnch_inst") + br_r =3D d_ratio(br, interval_sec) + ins_r =3D d_ratio(ins, br) + return MetricGroup("lpm_br_cond", [ + Metric("lpm_br_fused_retired", + "Retired fused branch instructions per second.", br_r, = "insn/s"), + Metric( + "lpm_br_fused_insn_between_branches", + "The number of instructions divided by the number of fused= " + "branches.", ins_r, "insn"), + ]) + + def Far() -> MetricGroup: + br =3D Event("ex_ret_brn_far") + br_r =3D d_ratio(br, interval_sec) + ins_r =3D d_ratio(ins, br) + return MetricGroup("lpm_br_far", [ + Metric("lpm_br_far_retired", "Retired far control transfers pe= r second.", + br_r, "insn/s"), + Metric( + "lpm_br_far_insn_between_branches", + "The number of instructions divided by the number of far b= ranches.", + ins_r, "insn"), + ]) + + return MetricGroup("lpm_br", [Total(), Taken(), Conditional(), Fused()= , Far()], + description=3D"breakdown of retired branch instruct= ions") + + def AmdUpc() -> Metric: ops =3D Event("ex_ret_ops", "ex_ret_cops") upc =3D d_ratio(ops, smt_cycles) @@ -83,6 +186,7 @@ def main() -> None: _zen_model =3D int(_args.model[6:]) =20 all_metrics =3D MetricGroup("", [ + AmdBr(), AmdUpc(), Idle(), Rapl(), --=20 2.52.0.158.g65b55ccf14-goog