From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.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 5FCF92C2357 for ; Tue, 2 Dec 2025 17:53:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764698024; cv=none; b=TH5fEyWUSAHBft+syZ8MClaInDlJ2FSpMmpueuWOyPB9CzszXM+5NEKkoMy/j5tBLJq9ClcG5Z+n/YCPHn9MxysZCd9W4Ymu0i57lG8r8u35yck7NDvKCEBYbPmbFAeInPWmTbNonHjpmmLWJhIQgqCebeSh/nuAgzfP27LTVa8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764698024; c=relaxed/simple; bh=cnrn7ebfjvFiAKJasfouyQP3U+pd/rAe6Cjcx0pS1NM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=tO3nc8qaCZfDIDZlHOjouDUFYJHvcxXEYJrT3jso9xIzgb0wseQTtzCh1nDfNz6aLb4W7nykNjzhYvwGXLsGzSe8tG8zSesLLRg4N61fZvq6pwYRNb0Sa2kIglb2E2OBK9TR9fJ7MVmuHkOjcAqKMHM8xYEJSAAnZgEk1CUSJH8= 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=H+4CQwzx; arc=none smtp.client-ip=209.85.210.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="H+4CQwzx" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-7b89c1ce9cfso5068201b3a.2 for ; Tue, 02 Dec 2025 09:53:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1764698021; x=1765302821; 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=T7H/fiSBZbcH4CZp2bWGmcEpNcwTRUbcYlOhUmrRII8=; b=H+4CQwzxmVeJwVq/TYsBk0Q4R1ssOpbBMG5HFrz2XDl555tjKBrb+YHH+EQRum2FP2 ewpUXUb3QUec4MlGIM6PxLJYN2hAECiozBrYu5J25fKVg38nhc7keDUvCZMu2K6k4WYF RHW8PnbYH3V8VJv7/m3Dg+XAgmRIlwe2ruqf7W6jNIlY22cMkNiPLuDLleZvu1B/+eXb 8lDlsZCyoaomyzxqXW43AQQgxiVcJGPf1rHAyXZuwzpG5HtMwNmsc+vybx+TUEFqsKxk bt6HoJ55IrZTvxJR5AmqH42ZvGdpmNXlJvww+qWlHut8lrVcvX5x6RRTCX0Re2BE16CQ /bVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764698021; x=1765302821; 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=T7H/fiSBZbcH4CZp2bWGmcEpNcwTRUbcYlOhUmrRII8=; b=jJeVi0WPltueV9oX22O9nge+HI7b+7eed+4/C0VVMzEUD93Rn/H+n9WCsUyl3A+SxV EzX5CWup9bJb39ATKPAaqoNs43uAYlkzxPhRX8+70T+EMjKqdn1mLHPQaLvRGetCs7/V KfPj5I8cMv1PNNmkySoQR6+/EDvMg57s4inwpgIrebT1HjvOokJLx7KZ8E/XCzoaJiDK /zp7BvzHG7rpu4PlGlRRf7DKBvx+0BXsIlPQgZtRM40pBAvtyt/uKNtevg/7dVgHXRuh RHLZgVjWeAxH+SuGlvLgIomTryQejVT+exVOW/Nu6gXtmXnp6VC4t4k+0l6EEoHe627K n6tw== X-Forwarded-Encrypted: i=1; AJvYcCUY3E7KpMg1G1vR1AWTfRVzyr7fCgLSBgXoVVTHIG/gBdi+GgRYus3tisi/sYva8D7bdza3iY9UP422xUo=@vger.kernel.org X-Gm-Message-State: AOJu0Yxgr6bCmx1nRTsruGt4zc1nMNhXlYfE/7iyUx/jkw/F87/8R0J5 gXJ6xUyk7jHrrHMczA7yaReRpbG8ON7QCPyRE2fEX3knpAjX5BlON1Df35YcG5S5mLDM/bEWFPz GZdzbLBuWmQ== X-Google-Smtp-Source: AGHT+IG9lm22mi8fuekKs8VooDbr1yV2Hrw+KvlrXOR7DExXJGCsd39iQjnlI2CKxSwkYQh4V5eOnfOrWHgs X-Received: from pfblg22.prod.google.com ([2002:a05:6a00:7096:b0:7dd:8bba:63a0]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:a91:b0:7b9:ef46:ec61 with SMTP id d2e1a72fcca58-7ca89a6a2b9mr29142803b3a.26.1764698021378; Tue, 02 Dec 2025 09:53:41 -0800 (PST) Date: Tue, 2 Dec 2025 09:50:25 -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-31-irogers@google.com> Subject: [PATCH v9 30/48] 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-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 Tested-by: Thomas Falcon --- 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="Breakdown of transactional memory statistics") +def IntelBr(): + ins = Event("instructions") + + def Total() -> MetricGroup: + br_all = Event("BR_INST_RETIRED.ALL_BRANCHES", "BR_INST_RETIRED.ANY") + br_m_all = Event("BR_MISP_RETIRED.ALL_BRANCHES", + "BR_INST_RETIRED.MISPRED", + "BR_MISP_EXEC.ANY") + br_clr = None + try: + br_clr = Event("BACLEARS.ANY", "BACLEARS.ALL") + except: + pass + + br_r = d_ratio(br_all, interval_sec) + ins_r = d_ratio(ins, br_all) + misp_r = d_ratio(br_m_all, br_all) + clr_r = 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, that were " + "not correctly predicted as a percentage of all branch instrucions.", + misp_r, "100%"), + Metric("lpm_br_total_insn_between_branches", + "The number of instructions divided by the number of branches.", + ins_r, "insn"), + Metric("lpm_br_total_insn_fe_resteers", + "The number of resync branches per second.", clr_r, "req/s" + ) if clr_r else None + ]) + + def Taken() -> MetricGroup: + br_all = Event("BR_INST_RETIRED.ALL_BRANCHES", "BR_INST_RETIRED.ANY") + br_m_tk = None + try: + br_m_tk = Event("BR_MISP_RETIRED.NEAR_TAKEN", + "BR_MISP_RETIRED.TAKEN_JCC", + "BR_INST_RETIRED.MISPRED_TAKEN") + except: + pass + br_r = d_ratio(br_all, interval_sec) + ins_r = d_ratio(ins, br_all) + misp_r = 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 second.", + 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.", misp_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 = Event("BR_INST_RETIRED.COND", + "BR_INST_RETIRED.CONDITIONAL", + "BR_INST_RETIRED.TAKEN_JCC") + br_m_cond = Event("BR_MISP_RETIRED.COND", + "BR_MISP_RETIRED.CONDITIONAL", + "BR_MISP_RETIRED.TAKEN_JCC") + except: + return None + + br_cond_nt = None + br_m_cond_nt = None + try: + br_cond_nt = Event("BR_INST_RETIRED.COND_NTAKEN") + br_m_cond_nt = Event("BR_MISP_RETIRED.COND_NTAKEN") + except: + pass + br_r = d_ratio(br_cond, interval_sec) + ins_r = d_ratio(ins, br_cond) + misp_r = d_ratio(br_m_cond, br_cond) + taken_metrics = [ + Metric("lpm_br_cond_retired", "Retired conditional branch instructions.", + br_r, "insn/s"), + Metric("lpm_br_cond_insn_between_branches", + "The number of instructions divided by the number of conditional " + "branches.", ins_r, "insn"), + Metric("lpm_br_cond_mispred", + "Retired conditional branch instructions mispredicted as a " + "percentage of all conditional branches.", misp_r, "100%"), + ] + if not br_m_cond_nt: + return MetricGroup("lpm_br_cond", taken_metrics) + + br_r = d_ratio(br_cond_nt, interval_sec) + ins_r = d_ratio(ins, br_cond_nt) + misp_r = d_ratio(br_m_cond_nt, br_cond_nt) + + not_taken_metrics = [ + Metric("lpm_br_cond_retired", "Retired conditional not taken branch instructions.", + br_r, "insn/s"), + Metric("lpm_br_cond_insn_between_branches", + "The number of instructions divided by the number of not taken conditional " + "branches.", ins_r, "insn"), + Metric("lpm_br_cond_mispred", + "Retired not taken conditional branch instructions mispredicted as a " + "percentage of all not taken conditional branches.", misp_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 = Event("BR_INST_RETIRED.FAR_BRANCH") + except: + return None + + br_r = d_ratio(br_far, interval_sec) + ins_r = d_ratio(ins, br_far) + return MetricGroup("lpm_br_far", [ + Metric("lpm_br_far_retired", "Retired far control transfers per second.", + br_r, "insn/s"), + Metric( + "lpm_br_far_insn_between_branches", + "The number of instructions divided by the number of far branches.", + ins_r, "insn"), + ]) + + return MetricGroup("lpm_br", [Total(), Taken(), Conditional(), Far()], + description="breakdown of retired branch instructions") + + def main() -> None: global _args @@ -153,6 +290,7 @@ def main() -> None: Rapl(), Smi(), Tsx(), + IntelBr(), ]) if _args.metricgroups: -- 2.52.0.158.g65b55ccf14-goog