]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
devlink: support index-based lookup via bus_name/dev_name handle
authorJiri Pirko <jiri@nvidia.com>
Thu, 12 Mar 2026 10:03:59 +0000 (11:03 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Mar 2026 20:08:48 +0000 (13:08 -0700)
Devlink instances without a backing device use bus_name
"devlink_index" and dev_name set to the decimal index string.
When user space sends this handle, detect the pattern and perform
a direct xarray lookup by index instead of iterating all instances.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Link: https://patch.msgid.link/20260312100407.551173-6-jiri@resnulli.us
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/uapi/linux/devlink.h
net/devlink/netlink.c

index 1ba3436db4ae3ea166824dde826ca60ba1cd755a..7de2d8cc862f870fdc33d5cf9c8743e77e1598b3 100644 (file)
@@ -19,6 +19,8 @@
 #define DEVLINK_GENL_VERSION 0x1
 #define DEVLINK_GENL_MCGRP_CONFIG_NAME "config"
 
+#define DEVLINK_INDEX_BUS_NAME "devlink_index"
+
 enum devlink_command {
        /* don't change the order or add anything between, this is ABI! */
        DEVLINK_CMD_UNSPEC,
index 9cba40285de4e7a22467e5b723383a74277d10c4..fa38fca22fe424cf70076c878d8d69dd5f2ceb0d 100644 (file)
@@ -203,6 +203,15 @@ devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs,
        busname = nla_data(attrs[DEVLINK_ATTR_BUS_NAME]);
        devname = nla_data(attrs[DEVLINK_ATTR_DEV_NAME]);
 
+       if (!strcmp(busname, DEVLINK_INDEX_BUS_NAME)) {
+               if (kstrtoul(devname, 10, &index))
+                       return ERR_PTR(-ENODEV);
+               devlink = devlinks_xa_lookup_get(net, index);
+               if (!devlink)
+                       return ERR_PTR(-ENODEV);
+               goto found;
+       }
+
        devlinks_xa_for_each_registered_get(net, index, devlink) {
                if (strcmp(devlink_bus_name(devlink), busname) == 0 &&
                    strcmp(devlink_dev_name(devlink), devname) == 0)