2024-04-04 14:17:09

by Rob Herring (Arm)

[permalink] [raw]
Subject: [PATCH 1/3] of: Add a helper to free property struct

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 <[email protected]>
---
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;

--
2.43.0



2024-04-04 23:10:25

by Saravana Kannan

[permalink] [raw]
Subject: Re: [PATCH 1/3] of: Add a helper to free property struct

On Thu, Apr 4, 2024 at 7:15 AM Rob Herring <[email protected]> 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 <[email protected]>
> ---
> 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 <[email protected]>

-Saravana

2024-04-06 16:48:07

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 1/3] of: Add a helper to free property struct

On Thu, 04 Apr 2024 09:15:10 -0500
Rob Herring <[email protected]> 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 <[email protected]>
Reviewed-by: Jonathan Cameron <[email protected]>