Message ID | 20240404-dt-cleanup-free-v1-1-c60e6cba8da9@kernel.org |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | of: Use __free() based cleanups | expand |
Context | Check | Description |
---|---|---|
robh/checkpatch | success | |
robh/patch-applied | fail | build log |
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
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 --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;
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(-)