]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
devlink: Add port-level resource registration infrastructure
authorOr Har-Toov <ohartoov@nvidia.com>
Tue, 7 Apr 2026 19:40:57 +0000 (22:40 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Apr 2026 02:55:38 +0000 (19:55 -0700)
The current devlink resource infrastructure supports only device-level
resources. Some hardware resources are associated with specific ports
rather than the entire device, and today we have no way to show resource
per-port.

Add support for registering resources at the port level.

Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260407194107.148063-3-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/devlink.h
net/devlink/port.c
net/devlink/resource.c

index f5439d050eb055959a20950f203080d02e7a66a5..bcd31de1f890888996e99ff8a349602124fa897e 100644 (file)
@@ -129,6 +129,7 @@ struct devlink_rate {
 struct devlink_port {
        struct list_head list;
        struct list_head region_list;
+       struct list_head resource_list;
        struct devlink *devlink;
        const struct devlink_port_ops *ops;
        unsigned int index;
@@ -1891,6 +1892,13 @@ void devlink_resources_unregister(struct devlink *devlink);
 int devl_resource_size_get(struct devlink *devlink,
                           u64 resource_id,
                           u64 *p_resource_size);
+int
+devl_port_resource_register(struct devlink_port *devlink_port,
+                           const char *resource_name,
+                           u64 resource_size, u64 resource_id,
+                           u64 parent_resource_id,
+                           const struct devlink_resource_size_params *params);
+void devl_port_resources_unregister(struct devlink_port *devlink_port);
 int devl_dpipe_table_resource_set(struct devlink *devlink,
                                  const char *table_name, u64 resource_id,
                                  u64 resource_units);
index 7fcd1d3ed44c47322064267086d19b418757b74a..485029d434287d458672b968599897ab290d586c 100644 (file)
@@ -1025,6 +1025,7 @@ void devlink_port_init(struct devlink *devlink,
                return;
        devlink_port->devlink = devlink;
        INIT_LIST_HEAD(&devlink_port->region_list);
+       INIT_LIST_HEAD(&devlink_port->resource_list);
        devlink_port->initialized = true;
 }
 EXPORT_SYMBOL_GPL(devlink_port_init);
@@ -1042,6 +1043,7 @@ EXPORT_SYMBOL_GPL(devlink_port_init);
 void devlink_port_fini(struct devlink_port *devlink_port)
 {
        WARN_ON(!list_empty(&devlink_port->region_list));
+       WARN_ON(!list_empty(&devlink_port->resource_list));
 }
 EXPORT_SYMBOL_GPL(devlink_port_fini);
 
index ee169a467d4835a71c723c3dec4f041392dc1251..f3014ec425c412ad6ebd711e722a2b3a7fc3d9d6 100644 (file)
@@ -532,3 +532,46 @@ void devl_resource_occ_get_unregister(struct devlink *devlink,
        resource->occ_get_priv = NULL;
 }
 EXPORT_SYMBOL_GPL(devl_resource_occ_get_unregister);
+
+/**
+ * devl_port_resource_register - devlink port resource register
+ *
+ * @devlink_port: devlink port
+ * @resource_name: resource's name
+ * @resource_size: resource's size
+ * @resource_id: resource's id
+ * @parent_resource_id: resource's parent id
+ * @params: size parameters
+ *
+ * Generic resources should reuse the same names across drivers.
+ * Please see the generic resources list at:
+ * Documentation/networking/devlink/devlink-resource.rst
+ *
+ * Return: 0 on success, negative error code otherwise.
+ */
+int
+devl_port_resource_register(struct devlink_port *devlink_port,
+                           const char *resource_name,
+                           u64 resource_size, u64 resource_id,
+                           u64 parent_resource_id,
+                           const struct devlink_resource_size_params *params)
+{
+       return __devl_resource_register(devlink_port->devlink,
+                                       &devlink_port->resource_list,
+                                       resource_name, resource_size,
+                                       resource_id, parent_resource_id,
+                                       params);
+}
+EXPORT_SYMBOL_GPL(devl_port_resource_register);
+
+/**
+ * devl_port_resources_unregister - unregister all devlink port resources
+ *
+ * @devlink_port: devlink port
+ */
+void devl_port_resources_unregister(struct devlink_port *devlink_port)
+{
+       __devl_resources_unregister(devlink_port->devlink,
+                                   &devlink_port->resource_list);
+}
+EXPORT_SYMBOL_GPL(devl_port_resources_unregister);