]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
devlink: Refactor resource functions to be generic
authorOr Har-Toov <ohartoov@nvidia.com>
Tue, 7 Apr 2026 19:40:56 +0000 (22:40 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Apr 2026 02:55:38 +0000 (19:55 -0700)
Currently the resource functions take devlink pointer as parameter
and take the resource list from there.
Allow resource functions to work with other resource lists that will
be added in next patches and not only with the devlink's resource list.

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-2-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/devlink.h
net/devlink/resource.c

index 3038af6ec017ecfca2b7474d66012f9cf84a2607..f5439d050eb055959a20950f203080d02e7a66a5 100644 (file)
@@ -1885,7 +1885,7 @@ int devl_resource_register(struct devlink *devlink,
                           u64 resource_size,
                           u64 resource_id,
                           u64 parent_resource_id,
-                          const struct devlink_resource_size_params *size_params);
+                          const struct devlink_resource_size_params *params);
 void devl_resources_unregister(struct devlink *devlink);
 void devlink_resources_unregister(struct devlink *devlink);
 int devl_resource_size_get(struct devlink *devlink,
index 351835a710b136b7617b02f7ec87ea752080070f..ee169a467d4835a71c723c3dec4f041392dc1251 100644 (file)
@@ -36,15 +36,16 @@ struct devlink_resource {
 };
 
 static struct devlink_resource *
-devlink_resource_find(struct devlink *devlink,
-                     struct devlink_resource *resource, u64 resource_id)
+__devlink_resource_find(struct list_head *resource_list_head,
+                       struct devlink_resource *resource,
+                       u64 resource_id)
 {
        struct list_head *resource_list;
 
        if (resource)
                resource_list = &resource->resource_list;
        else
-               resource_list = &devlink->resource_list;
+               resource_list = resource_list_head;
 
        list_for_each_entry(resource, resource_list, list) {
                struct devlink_resource *child_resource;
@@ -52,14 +53,23 @@ devlink_resource_find(struct devlink *devlink,
                if (resource->id == resource_id)
                        return resource;
 
-               child_resource = devlink_resource_find(devlink, resource,
-                                                      resource_id);
+               child_resource = __devlink_resource_find(resource_list_head,
+                                                        resource,
+                                                        resource_id);
                if (child_resource)
                        return child_resource;
        }
        return NULL;
 }
 
+static struct devlink_resource *
+devlink_resource_find(struct devlink *devlink,
+                     struct devlink_resource *resource, u64 resource_id)
+{
+       return __devlink_resource_find(&devlink->resource_list,
+                                      resource, resource_id);
+}
+
 static void
 devlink_resource_validate_children(struct devlink_resource *resource)
 {
@@ -314,26 +324,12 @@ int devlink_resources_validate(struct devlink *devlink,
        return err;
 }
 
-/**
- * devl_resource_register - devlink resource register
- *
- * @devlink: devlink
- * @resource_name: resource's name
- * @resource_size: resource's size
- * @resource_id: resource's id
- * @parent_resource_id: resource's parent id
- * @size_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
- */
-int devl_resource_register(struct devlink *devlink,
-                          const char *resource_name,
-                          u64 resource_size,
-                          u64 resource_id,
-                          u64 parent_resource_id,
-                          const struct devlink_resource_size_params *size_params)
+static int
+__devl_resource_register(struct devlink *devlink,
+                        struct list_head *resource_list_head,
+                        const char *resource_name, u64 resource_size,
+                        u64 resource_id, u64 parent_resource_id,
+                        const struct devlink_resource_size_params *params)
 {
        struct devlink_resource *resource;
        struct list_head *resource_list;
@@ -343,7 +339,8 @@ int devl_resource_register(struct devlink *devlink,
 
        top_hierarchy = parent_resource_id == DEVLINK_RESOURCE_ID_PARENT_TOP;
 
-       resource = devlink_resource_find(devlink, NULL, resource_id);
+       resource = __devlink_resource_find(resource_list_head, NULL,
+                                          resource_id);
        if (resource)
                return -EEXIST;
 
@@ -352,12 +349,13 @@ int devl_resource_register(struct devlink *devlink,
                return -ENOMEM;
 
        if (top_hierarchy) {
-               resource_list = &devlink->resource_list;
+               resource_list = resource_list_head;
        } else {
                struct devlink_resource *parent_resource;
 
-               parent_resource = devlink_resource_find(devlink, NULL,
-                                                       parent_resource_id);
+               parent_resource = __devlink_resource_find(resource_list_head,
+                                                         NULL,
+                                                         parent_resource_id);
                if (parent_resource) {
                        resource_list = &parent_resource->resource_list;
                        resource->parent = parent_resource;
@@ -372,46 +370,78 @@ int devl_resource_register(struct devlink *devlink,
        resource->size_new = resource_size;
        resource->id = resource_id;
        resource->size_valid = true;
-       memcpy(&resource->size_params, size_params,
-              sizeof(resource->size_params));
+       memcpy(&resource->size_params, params, sizeof(resource->size_params));
        INIT_LIST_HEAD(&resource->resource_list);
        list_add_tail(&resource->list, resource_list);
 
        return 0;
 }
+
+/**
+ * devl_resource_register - devlink resource register
+ *
+ * @devlink: devlink
+ * @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_resource_register(struct devlink *devlink, 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, &devlink->resource_list,
+                                       resource_name, resource_size,
+                                       resource_id, parent_resource_id,
+                                       params);
+}
 EXPORT_SYMBOL_GPL(devl_resource_register);
 
-static void devlink_resource_unregister(struct devlink *devlink,
-                                       struct devlink_resource *resource)
+static void devlink_resource_unregister(struct devlink_resource *resource)
 {
        struct devlink_resource *tmp, *child_resource;
 
        list_for_each_entry_safe(child_resource, tmp, &resource->resource_list,
                                 list) {
-               devlink_resource_unregister(devlink, child_resource);
+               devlink_resource_unregister(child_resource);
                list_del(&child_resource->list);
                kfree(child_resource);
        }
 }
 
-/**
- * devl_resources_unregister - free all resources
- *
- * @devlink: devlink
- */
-void devl_resources_unregister(struct devlink *devlink)
+static void
+__devl_resources_unregister(struct devlink *devlink,
+                           struct list_head *resource_list_head)
 {
        struct devlink_resource *tmp, *child_resource;
 
        lockdep_assert_held(&devlink->lock);
 
-       list_for_each_entry_safe(child_resource, tmp, &devlink->resource_list,
+       list_for_each_entry_safe(child_resource, tmp, resource_list_head,
                                 list) {
-               devlink_resource_unregister(devlink, child_resource);
+               devlink_resource_unregister(child_resource);
                list_del(&child_resource->list);
                kfree(child_resource);
        }
 }
+
+/**
+ * devl_resources_unregister - free all resources
+ *
+ * @devlink: devlink
+ */
+void devl_resources_unregister(struct devlink *devlink)
+{
+       __devl_resources_unregister(devlink, &devlink->resource_list);
+}
 EXPORT_SYMBOL_GPL(devl_resources_unregister);
 
 /**