From: Or Har-Toov <[email protected]>

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 <[email protected]>
Reviewed-by: Shay Drori <[email protected]>
Reviewed-by: Moshe Shemesh <[email protected]>
Reviewed-by: Jiri Pirko <[email protected]>
Signed-off-by: Tariq Toukan <[email protected]>
---
 include/net/devlink.h  |   2 +-
 net/devlink/resource.c | 140 ++++++++++++++++++++++++++---------------
 2 files changed, 91 insertions(+), 51 deletions(-)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index cb839e0435a1..48e1ad067836 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1875,7 +1875,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,
diff --git a/net/devlink/resource.c b/net/devlink/resource.c
index 5131875482ec..10043ad26dfd 100644
--- a/net/devlink/resource.c
+++ b/net/devlink/resource.c
@@ -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)
 {
@@ -215,13 +225,14 @@ static int devlink_resource_put(struct devlink *devlink, 
struct sk_buff *skb,
 
 static int devlink_resource_list_fill(struct sk_buff *skb,
                                      struct devlink *devlink,
+                                     struct list_head *resource_list_head,
                                      int *idx)
 {
        struct devlink_resource *resource;
        int i = 0;
        int err;
 
-       list_for_each_entry(resource, &devlink->resource_list, list) {
+       list_for_each_entry(resource, resource_list_head, list) {
                if (i < *idx) {
                        i++;
                        continue;
@@ -237,8 +248,9 @@ static int devlink_resource_list_fill(struct sk_buff *skb,
        return 0;
 }
 
-static int devlink_resource_fill(struct genl_info *info,
-                                enum devlink_command cmd, int flags)
+static int __devlink_resource_fill(struct genl_info *info,
+                                  struct list_head *resource_list_head,
+                                  enum devlink_command cmd, int flags)
 {
        struct devlink *devlink = info->user_ptr[0];
        struct nlattr *resources_attr;
@@ -250,6 +262,9 @@ static int devlink_resource_fill(struct genl_info *info,
        int i = 0;
        int err;
 
+       if (list_empty(resource_list_head))
+               return -EOPNOTSUPP;
+
 start_again:
        err = devlink_nl_msg_reply_and_new(&skb, info);
        if (err)
@@ -272,7 +287,7 @@ static int devlink_resource_fill(struct genl_info *info,
 
        incomplete = false;
        start_idx = i;
-       err = devlink_resource_list_fill(skb, devlink, &i);
+       err = devlink_resource_list_fill(skb, devlink, resource_list_head, &i);
        if (err) {
                if (i == start_idx)
                        goto err_resource_put;
@@ -300,13 +315,17 @@ static int devlink_resource_fill(struct genl_info *info,
        return err;
 }
 
-int devlink_nl_resource_dump_doit(struct sk_buff *skb, struct genl_info *info)
+static int devlink_resource_fill(struct genl_info *info,
+                                enum devlink_command cmd, int flags)
 {
        struct devlink *devlink = info->user_ptr[0];
 
-       if (list_empty(&devlink->resource_list))
-               return -EOPNOTSUPP;
+       return __devlink_resource_fill(info, &devlink->resource_list,
+                                     cmd, flags);
+}
 
+int devlink_nl_resource_dump_doit(struct sk_buff *skb, struct genl_info *info)
+{
        return devlink_resource_fill(info, DEVLINK_CMD_RESOURCE_DUMP, 0);
 }
 
@@ -338,7 +357,8 @@ devlink_nl_resource_dump_one(struct sk_buff *skb, struct 
devlink *devlink,
                goto nla_put_failure;
        }
 
-       err = devlink_resource_list_fill(skb, devlink, &state->idx);
+       err = devlink_resource_list_fill(skb, devlink,
+                                        &devlink->resource_list, &state->idx);
        if (err) {
                if (state->idx == start_idx)
                        goto nla_put_failure_unwind;
@@ -385,26 +405,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;
@@ -414,7 +420,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;
 
@@ -423,12 +430,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;
@@ -443,46 +451,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);
 
 /**
-- 
2.44.0


Reply via email to