summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Pirko <jiri@nvidia.com>2026-03-12 13:04:00 +0300
committerJakub Kicinski <kuba@kernel.org>2026-03-14 23:08:48 +0300
commit089aeb4f2218ee0d7b53930e9f04a061240ce0f0 (patch)
tree0e9cb825789c0900186fb8780f0342dfc145150d
parent725d5fdb7b9c01d9e7079682acf998703762475b (diff)
downloadlinux-089aeb4f2218ee0d7b53930e9f04a061240ce0f0.tar.xz
devlink: support index-based notification filtering
Extend the notification filter descriptor with devlink_index so that userspace can filter notifications by devlink instance index in addition to bus_name/dev_name. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Link: https://patch.msgid.link/20260312100407.551173-7-jiri@resnulli.us Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/devlink/devl_internal.h4
-rw-r--r--net/devlink/netlink.c11
2 files changed, 14 insertions, 1 deletions
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index 395832ed4477..f0ebfb936770 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -205,6 +205,8 @@ struct devlink_obj_desc {
const char *dev_name;
unsigned int port_index;
bool port_index_valid;
+ unsigned int devlink_index;
+ bool devlink_index_valid;
long data[];
};
@@ -214,6 +216,8 @@ static inline void devlink_nl_obj_desc_init(struct devlink_obj_desc *desc,
memset(desc, 0, sizeof(*desc));
desc->bus_name = devlink_bus_name(devlink);
desc->dev_name = devlink_dev_name(devlink);
+ desc->devlink_index = devlink->index;
+ desc->devlink_index_valid = true;
}
static inline void devlink_nl_obj_desc_port_set(struct devlink_obj_desc *desc,
diff --git a/net/devlink/netlink.c b/net/devlink/netlink.c
index fa38fca22fe4..32ddbe244cb7 100644
--- a/net/devlink/netlink.c
+++ b/net/devlink/netlink.c
@@ -73,13 +73,19 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb,
flt->dev_name = pos;
}
+ if (attrs[DEVLINK_ATTR_INDEX]) {
+ flt->devlink_index = nla_get_uint(attrs[DEVLINK_ATTR_INDEX]);
+ flt->devlink_index_valid = true;
+ }
+
if (attrs[DEVLINK_ATTR_PORT_INDEX]) {
flt->port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]);
flt->port_index_valid = true;
}
/* Don't attach empty filter. */
- if (!flt->bus_name && !flt->dev_name && !flt->port_index_valid) {
+ if (!flt->bus_name && !flt->dev_name &&
+ !flt->devlink_index_valid && !flt->port_index_valid) {
kfree(flt);
flt = NULL;
}
@@ -100,6 +106,9 @@ int devlink_nl_notify_filter_set_doit(struct sk_buff *skb,
static bool devlink_obj_desc_match(const struct devlink_obj_desc *desc,
const struct devlink_obj_desc *flt)
{
+ if (desc->devlink_index_valid && flt->devlink_index_valid &&
+ desc->devlink_index != flt->devlink_index)
+ return false;
if (desc->bus_name && flt->bus_name &&
strcmp(desc->bus_name, flt->bus_name))
return false;