From: Jiri Pirko <redacted>
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 <redacted>
---
v2->v3:
- new patch
---
net/devlink/devl_internal.h | 4 ++++
net/devlink/netlink.c | 11 ++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
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;--
2.51.1