From nobody Wed Dec 10 20:09:58 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 04B00315D46 for ; Thu, 13 Nov 2025 03:21:59 +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=1763004121; cv=none; b=V/iTi2XAwKBHe3JXCyBgoWcoZjb3ZgtJZKBkCCgZ62LDRRhQwBhC+VcL1s3ciudw+Jzb9CYFKycO1fJXo2FiUaXclh2qNHLbg5r7IXE5ZS9KOFJvISyZKYeVV4Qnrk3ZULa8rmTYQrNZfn5uQfjcs2rPDJxw6J7tf+GFLEUDfEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763004121; c=relaxed/simple; bh=oxIzzYTLoJauQ3Xfy3u0Yfn2TVadLlHIWXTHB0uMPH8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GR7PkVn0gPqWLyk1Wf7L+0ycjdQLHIGN/HCqTGtuZS9dJ13xCVW2z/dv8ijcYlRBLp1Jd9Qx5Tjsr2MScGQtrdG5Nm/6mtXDWNoIBeLtnwLNLKM1h68b3e2e1KbtcAX5zEMCtJOyv+ZScCgu2dAwJms8P+s7a2TWr8vm6xVBkHo= 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=xn2uJ1xW; 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="xn2uJ1xW" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-b57cf8dba28so373654a12.1 for ; Wed, 12 Nov 2025 19:21:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1763004119; x=1763608919; 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=TNA1vFEiDV2r0dzVcpCQuiLoeBw9oTVXKzmfAq51nag=; b=xn2uJ1xWPZwW9yPtPcigDyJUOIcRDcsGMbfFTXV+rEVVnJlN9A1u2D5nx2hHYOTBFt shvTr8XTbw3IDp4NwqwPK9mVDWrhY0B+C5zw03rqgNEyBE/QhbDtcIAGsQwra6ccpgWN FTBfI7DzRFXbGdYm/gs87UOZZ/Gv4jBxN67K3/wtQfbmgNO+JmSh5ZgoHe6WEpWAAZli zt7Js48rxmoHs9empSrZcbY1Q4tdZJl3CSUwFjdvGBu0BghHGVXzrMRBS+3AksEDIKLa Q1O6eWLtdae1NfQpDyhBcTxv+n3MUjVVycwxRWO0UAGGSq/EKj/Y1FK5cCI5AQhVKkwt EE0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763004119; x=1763608919; 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=TNA1vFEiDV2r0dzVcpCQuiLoeBw9oTVXKzmfAq51nag=; b=CeF9389XBw/GZ3LRmJnJ2pzNdR0L0TDgqI+lxfO9rx4B2AbY1fx0rnklPF4KEw0sOg QaRcFCkJNuprUZd1YCDr+9M0D1eY08FCPUF+4BZqmckEMNa17bi17ZVSwpi8xPH+hCZ8 b/K7ZeSeB8D1onIX8kpsGsnlp0ypoJGI77cOHIFB5NrOnH9YSb9ONthAaksrJqdpP1a7 V/H2Uc0tsfGftB3cIt+7Q0jHJEzkZv+KOFV7DQEHHQEsMcpRLsXP9K9Ke35EnN/WAT0J UxhkD2CwUsVwhjoq7pX6fhRJ3p5kmOyZspOTj6n7gzf7Fdmk75tmUtJ3XLBp8F1Vf6ng Nbqg== X-Forwarded-Encrypted: i=1; AJvYcCX88GjRfpw9BQUOpmbOCqcMpHHfXVJxIpCtxw3l+siP7acKncseQI40OI4mlXZCqv2R92kGBXdvOs3dSFg=@vger.kernel.org X-Gm-Message-State: AOJu0YyOQ4ry/ZXl6KYJYa3AntlYRYjqemQK/rxXmEGDkVDDHs2CGMbC U6SZPDpUEWLL16P1BxUThLi99ixSILp7Vc62/xWlQ9AShOo1klmANYYzPzrzRQNSUOEsj33mOPk WxkphYyU/hw== X-Google-Smtp-Source: AGHT+IFItK+UMqSWwk08n2wB4bbD3Yy9Whvf44yRIG3rO6c84NBNTJJrCvl8to5qym/IguSvlWizqtGKchKl X-Received: from pgbbm20.prod.google.com ([2002:a65:6e94:0:b0:ba6:5f4d:31b]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7d8b:b0:350:31b3:218c with SMTP id adf61e73a8af0-359096951cfmr7194085637.19.1763004119265; Wed, 12 Nov 2025 19:21:59 -0800 (PST) Date: Wed, 12 Nov 2025 19:20:22 -0800 In-Reply-To: <20251113032040.1994090-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: <20251113032040.1994090-1-irogers@google.com> X-Mailer: git-send-email 2.51.2.1041.gc1ab5b90ca-goog Message-ID: <20251113032040.1994090-35-irogers@google.com> Subject: [PATCH v8 34/52] perf jevents: Add br metric group for branch statistics on Intel 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. Conditional taken and not taken metrics are specific to Icelake and later generations, so the presence of the event is used to determine whether the metric should exist. Signed-off-by: Ian Rogers --- tools/perf/pmu-events/intel_metrics.py | 138 +++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/tools/perf/pmu-events/intel_metrics.py b/tools/perf/pmu-events= /intel_metrics.py index 05f3d94ec5d5..e1944d821248 100755 --- a/tools/perf/pmu-events/intel_metrics.py +++ b/tools/perf/pmu-events/intel_metrics.py @@ -124,6 +124,143 @@ def Tsx() -> Optional[MetricGroup]: ], description=3D"Breakdown of transactional memory statistics") =20 =20 +def IntelBr(): + ins =3D Event("instructions") + + def Total() -> MetricGroup: + br_all =3D Event("BR_INST_RETIRED.ALL_BRANCHES", "BR_INST_RETIRED.= ANY") + br_m_all =3D Event("BR_MISP_RETIRED.ALL_BRANCHES", + "BR_INST_RETIRED.MISPRED", + "BR_MISP_EXEC.ANY") + br_clr =3D None + try: + br_clr =3D Event("BACLEARS.ANY", "BACLEARS.ALL") + except: + pass + + br_r =3D d_ratio(br_all, interval_sec) + ins_r =3D d_ratio(ins, br_all) + misp_r =3D d_ratio(br_m_all, br_all) + clr_r =3D d_ratio(br_clr, interval_sec) if br_clr else None + + 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" + ) if clr_r else None + ]) + + def Taken() -> MetricGroup: + br_all =3D Event("BR_INST_RETIRED.ALL_BRANCHES", "BR_INST_RETIRED.= ANY") + br_m_tk =3D None + try: + br_m_tk =3D Event("BR_MISP_RETIRED.NEAR_TAKEN", + "BR_MISP_RETIRED.TAKEN_JCC", + "BR_INST_RETIRED.MISPRED_TAKEN") + except: + pass + br_r =3D d_ratio(br_all, interval_sec) + ins_r =3D d_ratio(ins, br_all) + misp_r =3D d_ratio(br_m_tk, br_all) if br_m_tk else None + 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%") if misp_r else None, + 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]: + try: + br_cond =3D Event("BR_INST_RETIRED.COND", + "BR_INST_RETIRED.CONDITIONAL", + "BR_INST_RETIRED.TAKEN_JCC") + br_m_cond =3D Event("BR_MISP_RETIRED.COND", + "BR_MISP_RETIRED.CONDITIONAL", + "BR_MISP_RETIRED.TAKEN_JCC") + except: + return None + + br_cond_nt =3D None + br_m_cond_nt =3D None + try: + br_cond_nt =3D Event("BR_INST_RETIRED.COND_NTAKEN") + br_m_cond_nt =3D Event("BR_MISP_RETIRED.COND_NTAKEN") + except: + pass + br_r =3D d_ratio(br_cond, interval_sec) + ins_r =3D d_ratio(ins, br_cond) + misp_r =3D d_ratio(br_m_cond, br_cond) + taken_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"), + Metric("lpm_br_cond_mispred", + "Retired conditional branch instructions mispredicted a= s a " + "percentage of all conditional branches.", misp_r, "100= %"), + ] + if not br_m_cond_nt: + return MetricGroup("lpm_br_cond", taken_metrics) + + br_r =3D d_ratio(br_cond_nt, interval_sec) + ins_r =3D d_ratio(ins, br_cond_nt) + misp_r =3D d_ratio(br_m_cond_nt, br_cond_nt) + + not_taken_metrics =3D [ + Metric("lpm_br_cond_retired", "Retired conditional not taken b= ranch instructions.", + br_r, "insn/s"), + Metric("lpm_br_cond_insn_between_branches", + "The number of instructions divided by the number of no= t taken conditional " + "branches.", ins_r, "insn"), + Metric("lpm_br_cond_mispred", + "Retired not taken conditional branch instructions misp= redicted as a " + "percentage of all not taken conditional branches.", mi= sp_r, "100%"), + ] + return MetricGroup("lpm_br_cond", [ + MetricGroup("lpm_br_cond_nt", not_taken_metrics), + MetricGroup("lpm_br_cond_tkn", taken_metrics), + ]) + + def Far() -> Optional[MetricGroup]: + try: + br_far =3D Event("BR_INST_RETIRED.FAR_BRANCH") + except: + return None + + br_r =3D d_ratio(br_far, interval_sec) + ins_r =3D d_ratio(ins, br_far) + 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(), Far()], + description=3D"breakdown of retired branch instruct= ions") + + def main() -> None: global _args =20 @@ -153,6 +290,7 @@ def main() -> None: Rapl(), Smi(), Tsx(), + IntelBr(), ]) =20 if _args.metricgroups: --=20 2.51.2.1041.gc1ab5b90ca-goog