[PATCH v2 7/7] perf/amd/ibs: Advertise remote socket capability

From: Ravi Bangoria

Date: Sun Feb 15 2026 - 23:29:40 EST


IBS OP on future hardware can indicate data source from remote socket
as well. Advertise this capability to userspace so that userspace tools
can decode IBS data accordingly.

Signed-off-by: Ravi Bangoria <ravi.bangoria@xxxxxxx>
---
arch/x86/events/amd/ibs.c | 19 +++++++++++++++++++
arch/x86/include/asm/amd/ibs.h | 3 ++-
2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index 0a8313ea6331..eeb607b84dda 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -730,6 +730,7 @@ PMU_EVENT_ATTR_STRING(fetchlat, ibs_fetch_lat_format, "config1:0-10");
PMU_EVENT_ATTR_STRING(fetchlat, ibs_fetch_lat_cap, "1");
PMU_EVENT_ATTR_STRING(strmst, ibs_op_strmst_format, "config1:12");
PMU_EVENT_ATTR_STRING(strmst, ibs_op_strmst_cap, "1");
+PMU_EVENT_ATTR_STRING(rmtsocket, ibs_op_rmtsocket_cap, "1");

static umode_t
zen4_ibs_extensions_is_visible(struct kobject *kobj, struct attribute *attr, int i)
@@ -749,6 +750,12 @@ ibs_op_strmst_is_visible(struct kobject *kobj, struct attribute *attr, int i)
return ibs_caps & IBS_CAPS_STRMST_RMTSOCKET ? attr->mode : 0;
}

+static umode_t
+ibs_op_rmtsocket_is_visible(struct kobject *kobj, struct attribute *attr, int i)
+{
+ return ibs_caps & IBS_CAPS_STRMST_RMTSOCKET ? attr->mode : 0;
+}
+
static umode_t
ibs_op_ldlat_is_visible(struct kobject *kobj, struct attribute *attr, int i)
{
@@ -802,6 +809,11 @@ static struct attribute *ibs_op_strmst_cap_attrs[] = {
NULL,
};

+static struct attribute *ibs_op_rmtsocket_cap_attrs[] = {
+ &ibs_op_rmtsocket_cap.attr.attr,
+ NULL,
+};
+
static struct attribute_group group_fetch_formats = {
.name = "format",
.attrs = fetch_attrs,
@@ -849,6 +861,12 @@ static struct attribute_group group_ibs_op_strmst_cap = {
.is_visible = ibs_op_strmst_is_visible,
};

+static struct attribute_group group_ibs_op_rmtsocket_cap = {
+ .name = "caps",
+ .attrs = ibs_op_rmtsocket_cap_attrs,
+ .is_visible = ibs_op_rmtsocket_is_visible,
+};
+
static const struct attribute_group *fetch_attr_groups[] = {
&group_fetch_formats,
&empty_caps_group,
@@ -938,6 +956,7 @@ static const struct attribute_group *op_attr_update[] = {
&group_ibs_op_dtlb_pgsize_cap,
&group_ibs_op_strmst_cap,
&group_ibs_op_strmst_format,
+ &group_ibs_op_rmtsocket_cap,
NULL,
};

diff --git a/arch/x86/include/asm/amd/ibs.h b/arch/x86/include/asm/amd/ibs.h
index 020916eb7b4e..4eac36c42db6 100644
--- a/arch/x86/include/asm/amd/ibs.h
+++ b/arch/x86/include/asm/amd/ibs.h
@@ -100,7 +100,8 @@ union ibs_op_data2 {
cache_hit_st:1, /* 5: cache hit state */
data_src_hi:2, /* 6-7: data source high */
strm_st:1, /* 8: streaming store */
- reserved1:55; /* 9-63: reserved */
+ rmt_socket:1, /* 9: remote socket */
+ reserved1:54; /* 10-63: reserved */
};
};

--
2.43.0