diff mbox series

[1/3] of: Add a helper to free property struct

Message ID 20240404-dt-cleanup-free-v1-1-c60e6cba8da9@kernel.org
State Changes Requested, archived
Headers show
Series of: Use __free() based cleanups | expand

Checks

Context Check Description
robh/checkpatch success
robh/patch-applied fail build log

Commit Message

Rob Herring (Arm) April 4, 2024, 2:15 p.m. UTC
Freeing a property struct is 3 kfree()'s which is duplicated in multiple
spots. Add a helper, __of_prop_free(), and replace all the open coded
cases in the DT code.

Signed-off-by: Rob Herring <robh@kernel.org>
---
 drivers/of/dynamic.c    | 26 ++++++++++++--------------
 drivers/of/of_private.h |  1 +
 drivers/of/overlay.c    | 11 +++--------
 drivers/of/unittest.c   | 12 +++---------
 4 files changed, 19 insertions(+), 31 deletions(-)

Comments

Saravana Kannan April 4, 2024, 11:09 p.m. UTC | #1
On Thu, Apr 4, 2024 at 7:15 AM Rob Herring <robh@kernel.org> wrote:
>
> Freeing a property struct is 3 kfree()'s which is duplicated in multiple
> spots. Add a helper, __of_prop_free(), and replace all the open coded
> cases in the DT code.
>
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
>  drivers/of/dynamic.c    | 26 ++++++++++++--------------
>  drivers/of/of_private.h |  1 +
>  drivers/of/overlay.c    | 11 +++--------
>  drivers/of/unittest.c   | 12 +++---------
>  4 files changed, 19 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
> index 3bf27052832f..af7c57a7a25d 100644
> --- a/drivers/of/dynamic.c
> +++ b/drivers/of/dynamic.c
> @@ -305,15 +305,20 @@ int of_detach_node(struct device_node *np)
>  }
>  EXPORT_SYMBOL_GPL(of_detach_node);
>
> +void __of_prop_free(struct property *prop)
> +{
> +       kfree(prop->name);
> +       kfree(prop->value);
> +       kfree(prop);
> +}
> +
>  static void property_list_free(struct property *prop_list)
>  {
>         struct property *prop, *next;
>
>         for (prop = prop_list; prop != NULL; prop = next) {
>                 next = prop->next;
> -               kfree(prop->name);
> -               kfree(prop->value);
> -               kfree(prop);
> +               __of_prop_free(prop);
>         }
>  }
>
> @@ -426,9 +431,7 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
>         return new;
>
>   err_free:
> -       kfree(new->name);
> -       kfree(new->value);
> -       kfree(new);
> +       __of_prop_free(new);
>         return NULL;
>  }
>
> @@ -470,9 +473,7 @@ struct device_node *__of_node_dup(const struct device_node *np,
>                         if (!new_pp)
>                                 goto err_prop;
>                         if (__of_add_property(node, new_pp)) {
> -                               kfree(new_pp->name);
> -                               kfree(new_pp->value);
> -                               kfree(new_pp);
> +                               __of_prop_free(new_pp);
>                                 goto err_prop;
>                         }
>                 }
> @@ -921,11 +922,8 @@ static int of_changeset_add_prop_helper(struct of_changeset *ocs,
>                 return -ENOMEM;
>
>         ret = of_changeset_add_property(ocs, np, new_pp);
> -       if (ret) {
> -               kfree(new_pp->name);
> -               kfree(new_pp->value);
> -               kfree(new_pp);
> -       }
> +       if (ret)
> +               __of_prop_free(new_pp);
>
>         return ret;
>  }
> diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
> index 485483524b7f..94fc0aa07af9 100644
> --- a/drivers/of/of_private.h
> +++ b/drivers/of/of_private.h
> @@ -123,6 +123,7 @@ extern void *__unflatten_device_tree(const void *blob,
>   * own the devtree lock or work on detached trees only.
>   */
>  struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
> +void __of_prop_free(struct property *prop);
>  struct device_node *__of_node_dup(const struct device_node *np,
>                                   const char *full_name);
>
> diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
> index 2ae7e9d24a64..4d861a75d694 100644
> --- a/drivers/of/overlay.c
> +++ b/drivers/of/overlay.c
> @@ -262,9 +262,7 @@ static struct property *dup_and_fixup_symbol_prop(
>         return new_prop;
>
>  err_free_new_prop:
> -       kfree(new_prop->name);
> -       kfree(new_prop->value);
> -       kfree(new_prop);
> +       __of_prop_free(new_prop);
>  err_free_target_path:
>         kfree(target_path);
>
> @@ -361,11 +359,8 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
>                 pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n",
>                        target->np, new_prop->name);
>
> -       if (ret) {
> -               kfree(new_prop->name);
> -               kfree(new_prop->value);
> -               kfree(new_prop);
> -       }
> +       if (ret)
> +               __of_prop_free(new_prop);
>         return ret;
>  }
>
> diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
> index 6b5c36b6a758..a8c01c953a29 100644
> --- a/drivers/of/unittest.c
> +++ b/drivers/of/unittest.c
> @@ -795,15 +795,11 @@ static void __init of_unittest_property_copy(void)
>
>         new = __of_prop_dup(&p1, GFP_KERNEL);
>         unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
> -       kfree(new->value);
> -       kfree(new->name);
> -       kfree(new);
> +       __of_prop_free(new);
>
>         new = __of_prop_dup(&p2, GFP_KERNEL);
>         unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
> -       kfree(new->value);
> -       kfree(new->name);
> -       kfree(new);
> +       __of_prop_free(new);
>  #endif
>  }
>
> @@ -3718,9 +3714,7 @@ static __init void of_unittest_overlay_high_level(void)
>                                 goto err_unlock;
>                         }
>                         if (__of_add_property(of_symbols, new_prop)) {
> -                               kfree(new_prop->name);
> -                               kfree(new_prop->value);
> -                               kfree(new_prop);
> +                               __of_prop_free(new_prop);
>                                 /* "name" auto-generated by unflatten */
>                                 if (!strcmp(prop->name, "name"))
>                                         continue;
>

Reviewed-by: Saravana Kannan <saravanak@google.com>

-Saravana
Jonathan Cameron April 6, 2024, 4:47 p.m. UTC | #2
On Thu, 04 Apr 2024 09:15:10 -0500
Rob Herring <robh@kernel.org> wrote:

> Freeing a property struct is 3 kfree()'s which is duplicated in multiple
> spots. Add a helper, __of_prop_free(), and replace all the open coded
> cases in the DT code.
> 
> Signed-off-by: Rob Herring <robh@kernel.org>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
diff mbox series

Patch

diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index 3bf27052832f..af7c57a7a25d 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -305,15 +305,20 @@  int of_detach_node(struct device_node *np)
 }
 EXPORT_SYMBOL_GPL(of_detach_node);
 
+void __of_prop_free(struct property *prop)
+{
+	kfree(prop->name);
+	kfree(prop->value);
+	kfree(prop);
+}
+
 static void property_list_free(struct property *prop_list)
 {
 	struct property *prop, *next;
 
 	for (prop = prop_list; prop != NULL; prop = next) {
 		next = prop->next;
-		kfree(prop->name);
-		kfree(prop->value);
-		kfree(prop);
+		__of_prop_free(prop);
 	}
 }
 
@@ -426,9 +431,7 @@  struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
 	return new;
 
  err_free:
-	kfree(new->name);
-	kfree(new->value);
-	kfree(new);
+	__of_prop_free(new);
 	return NULL;
 }
 
@@ -470,9 +473,7 @@  struct device_node *__of_node_dup(const struct device_node *np,
 			if (!new_pp)
 				goto err_prop;
 			if (__of_add_property(node, new_pp)) {
-				kfree(new_pp->name);
-				kfree(new_pp->value);
-				kfree(new_pp);
+				__of_prop_free(new_pp);
 				goto err_prop;
 			}
 		}
@@ -921,11 +922,8 @@  static int of_changeset_add_prop_helper(struct of_changeset *ocs,
 		return -ENOMEM;
 
 	ret = of_changeset_add_property(ocs, np, new_pp);
-	if (ret) {
-		kfree(new_pp->name);
-		kfree(new_pp->value);
-		kfree(new_pp);
-	}
+	if (ret)
+		__of_prop_free(new_pp);
 
 	return ret;
 }
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index 485483524b7f..94fc0aa07af9 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -123,6 +123,7 @@  extern void *__unflatten_device_tree(const void *blob,
  * own the devtree lock or work on detached trees only.
  */
 struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
+void __of_prop_free(struct property *prop);
 struct device_node *__of_node_dup(const struct device_node *np,
 				  const char *full_name);
 
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 2ae7e9d24a64..4d861a75d694 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -262,9 +262,7 @@  static struct property *dup_and_fixup_symbol_prop(
 	return new_prop;
 
 err_free_new_prop:
-	kfree(new_prop->name);
-	kfree(new_prop->value);
-	kfree(new_prop);
+	__of_prop_free(new_prop);
 err_free_target_path:
 	kfree(target_path);
 
@@ -361,11 +359,8 @@  static int add_changeset_property(struct overlay_changeset *ovcs,
 		pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n",
 		       target->np, new_prop->name);
 
-	if (ret) {
-		kfree(new_prop->name);
-		kfree(new_prop->value);
-		kfree(new_prop);
-	}
+	if (ret)
+		__of_prop_free(new_prop);
 	return ret;
 }
 
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 6b5c36b6a758..a8c01c953a29 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -795,15 +795,11 @@  static void __init of_unittest_property_copy(void)
 
 	new = __of_prop_dup(&p1, GFP_KERNEL);
 	unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
-	kfree(new->value);
-	kfree(new->name);
-	kfree(new);
+	__of_prop_free(new);
 
 	new = __of_prop_dup(&p2, GFP_KERNEL);
 	unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
-	kfree(new->value);
-	kfree(new->name);
-	kfree(new);
+	__of_prop_free(new);
 #endif
 }
 
@@ -3718,9 +3714,7 @@  static __init void of_unittest_overlay_high_level(void)
 				goto err_unlock;
 			}
 			if (__of_add_property(of_symbols, new_prop)) {
-				kfree(new_prop->name);
-				kfree(new_prop->value);
-				kfree(new_prop);
+				__of_prop_free(new_prop);
 				/* "name" auto-generated by unflatten */
 				if (!strcmp(prop->name, "name"))
 					continue;