* [PATCH] perf/amd/ibs: add phy_addr_only software filter for ibs_op
@ 2026-09-02 8:52 Huang Shijie
2026-09-02 9:15 ` sashiko-bot
0 siblings, 1 reply; 2+ messages in thread
From: Huang Shijie @ 2026-09-02 8:52 UTC (permalink / raw)
To: peterz, mingo, acme, namhyung
Cc: zhongyuan, fangbaoshun, yingzhiwei, mark.rutland,
alexander.shishkin, jolsa, irogers, adrian.hunter, james.clark,
tglx, bp, dave.hansen, x86, hpa, linux-perf-users, linux-kernel,
liuqi, lijing, wangfengyu, wujiangyong, shijie8, Huang Shijie
We use the following command to track a process's memory footprint:
#perf record -e ibs_fetch// -e ibs_op// -p xxx --phys-addr -- sleep 10
In the mysql tests, I catched over 1,804,973 records for ibs_op event.
I found that over 53% records(970,554) are like this:
ibs_op//: ffffffffb6017739 0
The physical address is 0 for these records. These records are not needed
by us, and they wasted the CPU cycles.
This patch adds an ibs_op/phy_addr_only term that discards samples
without a valid physical address (dc_phy_addr_valid == 0) in the interrupt
handler. And it avoids the phys_addr=0 noise when used with --phys-data.
Signed-off-by: Huang Shijie <huangsj@hygon.cn>
---
arch/x86/events/amd/ibs.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index e5376ad5b2ec..f258375c09bc 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -32,6 +32,7 @@ static u32 ibs_caps;
/* attr.config2 */
#define IBS_SW_FILTER_MASK 1
+#define IBS_PHY_ADDR_ONLY_MASK 2
/* attr.config1 */
#define IBS_OP_CONFIG1_LDLAT_MASK (0xFFFULL << 0)
@@ -303,6 +304,13 @@ static bool perf_ibs_strmst_event(struct perf_ibs *perf_ibs,
(event->attr.config1 & IBS_OP_CONFIG1_STRMST_MASK);
}
+static bool perf_ibs_phy_addr_only_event(struct perf_ibs *perf_ibs,
+ struct perf_event *event)
+{
+ return perf_ibs == &perf_ibs_op &&
+ (event->attr.config2 & IBS_PHY_ADDR_ONLY_MASK);
+}
+
static int perf_ibs_init(struct perf_event *event)
{
struct hw_perf_event *hwc = &event->hw;
@@ -721,6 +729,7 @@ static struct attribute_group empty_caps_group = {
PMU_FORMAT_ATTR(rand_en, "config:57");
PMU_FORMAT_ATTR(cnt_ctl, "config:19");
PMU_FORMAT_ATTR(swfilt, "config2:0");
+PMU_FORMAT_ATTR(phy_addr_only, "config2:1");
PMU_EVENT_ATTR_STRING(l3missonly, fetch_l3missonly, "config:59");
PMU_EVENT_ATTR_STRING(l3missonly, op_l3missonly, "config:16");
PMU_EVENT_ATTR_STRING(ldlat, ibs_op_ldlat_format, "config1:0-11");
@@ -890,6 +899,7 @@ cnt_ctl_is_visible(struct kobject *kobj, struct attribute *attr, int i)
static struct attribute *op_attrs[] = {
&format_attr_swfilt.attr,
+ &format_attr_phy_addr_only.attr,
NULL,
};
@@ -1357,7 +1367,8 @@ static int perf_ibs_get_offset_max(struct perf_ibs *perf_ibs,
if (event->attr.sample_type & PERF_SAMPLE_RAW ||
perf_ibs_is_mem_sample_type(perf_ibs, event) ||
perf_ibs_ldlat_event(perf_ibs, event) ||
- perf_ibs_fetch_lat_event(perf_ibs, event))
+ perf_ibs_fetch_lat_event(perf_ibs, event) ||
+ perf_ibs_phy_addr_only_event(perf_ibs, event))
return perf_ibs->offset_max;
else if (check_rip)
return 3;
@@ -1499,6 +1510,16 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
}
}
+ if (perf_ibs_phy_addr_only_event(perf_ibs, event)) {
+ union ibs_op_data3 op_data3;
+
+ op_data3.val = ibs_data.regs[ibs_op_msr_idx(MSR_AMD64_IBSOPDATA3)];
+ if (!op_data3.dc_phy_addr_valid) {
+ throttle = perf_event_account_interrupt(event);
+ goto out;
+ }
+ }
+
if (perf_ibs_fetch_lat_event(perf_ibs, event)) {
union ibs_fetch_ctl fetch_ctl;
--
2.53.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] perf/amd/ibs: add phy_addr_only software filter for ibs_op
2026-09-02 8:52 [PATCH] perf/amd/ibs: add phy_addr_only software filter for ibs_op Huang Shijie
@ 2026-09-02 9:15 ` sashiko-bot
0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-09-02 9:15 UTC (permalink / raw)
To: Huang Shijie; +Cc: linux-perf-users
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Out-of-bounds stack write to ibs_data.regs in perf_ibs_handle_irq when IBS_CAPS_OPDATA4 is present.
--
commit 5394e86487207a321dbcef29ca4cd958bfbe243c
Author: Huang Shijie <huangsj@hygon.cn>
perf/amd/ibs: add phy_addr_only software filter for ibs_op
This commit introduces an ibs_op/phy_addr_only filter to discard samples
without a valid physical address directly in the interrupt handler. This
avoids wasting CPU cycles and reduces noise when tracking a process's memory
footprint using perf record.
> diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
> index 3531f9c23b8c9..754f6f10b1717 100644
> --- a/arch/x86/events/amd/ibs.c
> +++ b/arch/x86/events/amd/ibs.c
[ ... ]
> @@ -1479,6 +1490,16 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
> }
> }
>
> + if (perf_ibs_phy_addr_only_event(perf_ibs, event)) {
> + union ibs_op_data3 op_data3;
> +
> + op_data3.val = ibs_data.regs[ibs_op_msr_idx(MSR_AMD64_IBSOPDATA3)];
> + if (!op_data3.dc_phy_addr_valid) {
> + throttle = perf_event_account_interrupt(event);
> + goto out;
> + }
> + }
> +
> if (perf_ibs_fetch_lat_event(perf_ibs, event)) {
> union ibs_fetch_ctl fetch_ctl;
>
[Severity: High]
This isn't a bug introduced by this patch, but is there an out-of-bounds
write to the ibs_data.regs[] array further down in perf_ibs_handle_irq()?
The array is sized to MSR_AMD64_IBS_REG_COUNT_MAX, which is 8:
arch/x86/include/asm/msr-index.h:
#define MSR_AMD64_IBS_REG_COUNT_MAX 8
When reading MSRs, if the hardware supports both IBS_CAPS_BRNTRGT and
IBS_CAPS_OPDATA4, the code reads up to 7 MSRs into the buffer in a loop
and then continues:
arch/x86/events/amd/ibs.c:perf_ibs_handle_irq() {
...
if (perf_ibs == &perf_ibs_op) {
if (ibs_caps & IBS_CAPS_BRNTRGT) {
rdmsrq(MSR_AMD64_IBSBRTARGET, *buf++);
br_target_idx = size;
size++;
}
if (ibs_caps & IBS_CAPS_OPDATA4) {
rdmsrq(MSR_AMD64_IBSOPDATA4, *buf++);
size++;
}
...
The rdmsrq() for IBS_CAPS_BRNTRGT writes into regs[7] and increments buf to
regs[8]. The rdmsrq() for IBS_CAPS_OPDATA4 then writes into regs[8], which is
past the end of the array.
Could this corrupt the kernel stack in NMI context when a user requests
PERF_SAMPLE_RAW?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902085251.4046240-1-huangsj@hygon.cn?part=1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-02 9:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-02 8:52 [PATCH] perf/amd/ibs: add phy_addr_only software filter for ibs_op Huang Shijie
2026-09-02 9:15 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox