From: Ravi Bangoria <ravi.bangoria@amd.com>
To: Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@redhat.com>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Ian Rogers <irogers@google.com>,
Dapeng Mi <dapeng1.mi@linux.intel.com>,
James Clark <james.clark@linaro.org>,
Sadasivan Shaiju <sadasivan.shaiju2@amd.com>, <x86@kernel.org>,
<linux-perf-users@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
Manali Shukla <manali.shukla@amd.com>,
Santosh Shukla <santosh.shukla@amd.com>,
Ananth Narayan <ananth.narayan@amd.com>,
Sandipan Das <sandipan.das@amd.com>
Subject: [PATCH v2 5/7] perf/amd/ibs: Enable RIP bit63 hardware filtering
Date: Mon, 16 Feb 2026 04:25:28 +0000 [thread overview]
Message-ID: <20260216042530.1546-6-ravi.bangoria@amd.com> (raw)
In-Reply-To: <20260216042530.1546-1-ravi.bangoria@amd.com>
IBS on future hardware adds the ability to filter IBS events by examining
RIP bit 63. Because Linux kernel addresses always have bit 63 set while
user-space addresses never do, this capability can be used as a privilege
filter.
So far, IBS supports privilege filtering in software (swfilt=1), where
samples are dropped in the NMI handler. The RIP bit63 hardware filter
enables IBS to be usable by unprivileged users without passing swfilt
flag. So, swfilt flag will silently be ignored when the hardware
filtering capability is present.
Example (non-root user):
$ perf record -e ibs_op//u -- <workload>
Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com>
---
arch/x86/events/amd/ibs.c | 46 ++++++++++++++++++++++++++++++++-------
1 file changed, 38 insertions(+), 8 deletions(-)
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index cb3ae4e4744c..13ecc8d92b23 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -321,11 +321,6 @@ static int perf_ibs_init(struct perf_event *event)
event->attr.exclude_idle)
return -EINVAL;
- if (!(event->attr.config2 & IBS_SW_FILTER_MASK) &&
- (event->attr.exclude_kernel || event->attr.exclude_user ||
- event->attr.exclude_hv))
- return -EINVAL;
-
ret = validate_group(event);
if (ret)
return ret;
@@ -338,6 +333,32 @@ static int perf_ibs_init(struct perf_event *event)
hwc->extra_reg.reg = perf_ibs->msr2;
}
+ if (ibs_caps & IBS_CAPS_BIT63_FILTER) {
+ if (perf_ibs == &perf_ibs_fetch) {
+ if (event->attr.exclude_kernel) {
+ hwc->extra_reg.config |= IBS_FETCH_2_EXCL_RIP_63_EQ_1;
+ hwc->extra_reg.reg = perf_ibs->msr2;
+ }
+ if (event->attr.exclude_user) {
+ hwc->extra_reg.config |= IBS_FETCH_2_EXCL_RIP_63_EQ_0;
+ hwc->extra_reg.reg = perf_ibs->msr2;
+ }
+ } else {
+ if (event->attr.exclude_kernel) {
+ hwc->extra_reg.config |= IBS_OP_2_EXCL_RIP_63_EQ_1;
+ hwc->extra_reg.reg = perf_ibs->msr2;
+ }
+ if (event->attr.exclude_user) {
+ hwc->extra_reg.config |= IBS_OP_2_EXCL_RIP_63_EQ_0;
+ hwc->extra_reg.reg = perf_ibs->msr2;
+ }
+ }
+ } else if (!(event->attr.config2 & IBS_SW_FILTER_MASK) &&
+ (event->attr.exclude_kernel || event->attr.exclude_user ||
+ event->attr.exclude_hv)) {
+ return -EINVAL;
+ }
+
if (hwc->sample_period) {
if (config & perf_ibs->cnt_mask)
/* raw max_cnt may not be set */
@@ -1280,7 +1301,7 @@ static bool perf_ibs_is_kernel_br_target(struct perf_event *event,
op_data.op_brn_ret && kernel_ip(br_target));
}
-static bool perf_ibs_swfilt_discard(struct perf_ibs *perf_ibs, struct perf_event *event,
+static bool perf_ibs_discard_sample(struct perf_ibs *perf_ibs, struct perf_event *event,
struct pt_regs *regs, struct perf_ibs_data *ibs_data,
int br_target_idx)
{
@@ -1435,8 +1456,9 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
regs.flags |= PERF_EFLAGS_EXACT;
}
- if ((event->attr.config2 & IBS_SW_FILTER_MASK) &&
- perf_ibs_swfilt_discard(perf_ibs, event, ®s, &ibs_data, br_target_idx)) {
+ if (((ibs_caps & IBS_CAPS_BIT63_FILTER) ||
+ (event->attr.config2 & IBS_SW_FILTER_MASK)) &&
+ perf_ibs_discard_sample(perf_ibs, event, ®s, &ibs_data, br_target_idx)) {
throttle = perf_event_account_interrupt(event);
goto out;
}
@@ -1899,6 +1921,14 @@ static __init int amd_ibs_init(void)
perf_ibs_pm_init();
+#ifdef CONFIG_X86_32
+ /*
+ * IBS_CAPS_BIT63_FILTER is used for exclude_kernel/user filtering,
+ * which obviously won't work for 32 bit kernel.
+ */
+ caps &= ~IBS_CAPS_BIT63_FILTER;
+#endif
+
ibs_caps = caps;
/* make ibs_caps visible to other cpus: */
smp_mb();
--
2.43.0
next prev parent reply other threads:[~2026-02-16 4:26 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-16 4:25 [PATCH v2 0/7] perf/amd/ibs: Future enhancements Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 1/7] perf/amd/ibs: Define macro for ldlat mask and shift Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 2/7] perf/amd/ibs: Add new MSRs and CPUID bits definitions Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 3/7] perf/amd/ibs: Support IBS_{FETCH|OP}_CTL2[Dis] to eliminate RMW race Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-28 11:01 ` Peter Zijlstra
2026-02-28 11:07 ` [tip: perf/core] perf/amd/ibs: Support IBS_{FETCH|OP}_CTL2[Dis] " tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 4/7] perf/amd/ibs: Enable fetch latency filtering Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-28 11:07 ` tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` Ravi Bangoria [this message]
2026-02-24 17:47 ` [PATCH v2 5/7] perf/amd/ibs: Enable RIP bit63 hardware filtering Ian Rogers
2026-02-26 9:20 ` Ravi Bangoria
2026-02-26 16:53 ` Ian Rogers
2026-03-09 2:58 ` Ravi Bangoria
2026-03-09 15:57 ` Ian Rogers
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-28 11:07 ` tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 6/7] perf/amd/ibs: Enable streaming store filter Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-28 11:07 ` tip-bot2 for Ravi Bangoria
2026-02-16 4:25 ` [PATCH v2 7/7] perf/amd/ibs: Advertise remote socket capability Ravi Bangoria
2026-02-28 10:56 ` [tip: perf/core] " tip-bot2 for Ravi Bangoria
2026-02-28 11:07 ` tip-bot2 for Ravi Bangoria
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=20260216042530.1546-6-ravi.bangoria@amd.com \
--to=ravi.bangoria@amd.com \
--cc=acme@kernel.org \
--cc=ananth.narayan@amd.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=manali.shukla@amd.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=sadasivan.shaiju2@amd.com \
--cc=sandipan.das@amd.com \
--cc=santosh.shukla@amd.com \
--cc=x86@kernel.org \
/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®