From nobody Sun Feb 8 19:03:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1536B12A16B; Thu, 4 Apr 2024 14:15:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240136; cv=none; b=lqs4pqO6a8AS2ZOIkEWYkMstUB7L/PjmKpJlXz4leEYd3nh2ydnO4D4fHZwOQ6rErNeXtXJsfdSXt6nRmp3OvbDmzCyvdVASqB0J3hYuJKrhoEiJK4XPbED9uTkEnPnoyV5g3ihkICN1IDwIOCNajp02+8h/iNillURx3GoVpHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240136; c=relaxed/simple; bh=I+WVKzCOzbEAVVpi7ed6GlAJIOFTPk8EzRQ1aBneYDQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rs5cMKflMEyR21wWw7G7F4wDRI2kbMbFCpnAwrBN6ZoxLaJJ7mhJ9E7o1knGcYi2q858v3mveNocmg4JUcv+ZTGt6uQrvTQsPypM79CBBZwnyz5q4MjBN5b1M1N/3AX/ffgPIgcxq1nsbRGO0nSlkDjIizuZM4yMfnX/0HEqOw8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ov3kByz9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ov3kByz9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5F7EFC433C7; Thu, 4 Apr 2024 14:15:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712240135; bh=I+WVKzCOzbEAVVpi7ed6GlAJIOFTPk8EzRQ1aBneYDQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ov3kByz9QIRpI19+B4bygBuEdZ8gSQ3MTW/WrKpyDQwf1Bc3EG9p05rdeSgUbHCbk 5+TC9VDZEbhre6I9cW/apPvjbHvCNxPvdl4PY/TMBYqL7qM1E5LyxNFZmhc+tlgMV7 KL20D7qsWK+STZSoAlkLBYcNu4oXBVphE8iUxlmVlAiE+zJPNzcGD+xzo3D72CWyLe aBzNChuHhSrESN0X4j8jExtJE21x78tCWPi6bpUjB8Dx/FsjF1mnAglGwEeqAGACcY FOvBu+uHXh2z3VMbQEQAqgefA0TjRInfVVKClp95FuoeVhkd97G7oPe8lJEXubaE4a ctCskTKVJOySA== From: Rob Herring Date: Thu, 04 Apr 2024 09:15:10 -0500 Subject: [PATCH 1/3] of: Add a helper to free property struct Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240404-dt-cleanup-free-v1-1-c60e6cba8da9@kernel.org> References: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> In-Reply-To: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> To: Saravana Kannan Cc: Jonathan Cameron , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13-dev 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 Reviewed-by: Jonathan Cameron Reviewed-by: Saravana Kannan --- 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); =20 +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; =20 for (prop =3D prop_list; prop !=3D NULL; prop =3D next) { next =3D prop->next; - kfree(prop->name); - kfree(prop->value); - kfree(prop); + __of_prop_free(prop); } } =20 @@ -426,9 +431,7 @@ struct property *__of_prop_dup(const struct property *p= rop, gfp_t allocflags) return new; =20 err_free: - kfree(new->name); - kfree(new->value); - kfree(new); + __of_prop_free(new); return NULL; } =20 @@ -470,9 +473,7 @@ struct device_node *__of_node_dup(const struct device_n= ode *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_chan= geset *ocs, return -ENOMEM; =20 ret =3D 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); =20 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 allocfla= gs); +void __of_prop_free(struct property *prop); struct device_node *__of_node_dup(const struct device_node *np, const char *full_name); =20 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; =20 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); =20 @@ -361,11 +359,8 @@ static int add_changeset_property(struct overlay_chang= eset *ovcs, pr_err("WARNING: memory leak will occur if overlay removed, property: %p= OF/%s\n", target->np, new_prop->name); =20 - if (ret) { - kfree(new_prop->name); - kfree(new_prop->value); - kfree(new_prop); - } + if (ret) + __of_prop_free(new_prop); return ret; } =20 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) =20 new =3D __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); =20 new =3D __of_prop_dup(&p2, GFP_KERNEL); unittest(new && propcmp(&p2, new), "non-empty property didn't copy correc= tly\n"); - kfree(new->value); - kfree(new->name); - kfree(new); + __of_prop_free(new); #endif } =20 @@ -3718,9 +3714,7 @@ static __init void of_unittest_overlay_high_level(voi= d) 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; --=20 2.43.0 From nobody Sun Feb 8 19:03:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 740E21292EB; Thu, 4 Apr 2024 14:15:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240138; cv=none; b=D3eiWxnJD+OdnzGa5mmLkyza3T0dSKsVAcdGD3FYWbgnZvY8oLh7KeH9pjXjp6ERpBKbW3rk3QYtir3p90EYCgl0IKRB4jajbodx+fooapSONlMAY/tDmnrSFM9PeDvcD667j24eALl2Penwb4jgUPauOBTWjQ9q0X7AQ0/UO+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240138; c=relaxed/simple; bh=3WdnQmshomibzByZClEkGia7PnK6CWBXCQshlze4d+I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lMrrNHmBACtU7pIv84o1Mys6SIg52FfYKbcpFufBQMR6lg7KdtszWSZ9P5dA8B4gVE8oyizSlk6pbMq5iYZZOXUhFLgN1mvXmK5SejDu+LnzkDNF9t5aoS34r1Md9dquI134IOzrsWL5UKnkaj1BLHyY9qyBjJenU1TrRNbnJ7I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jM9sLNZD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jM9sLNZD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D3C55C43390; Thu, 4 Apr 2024 14:15:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712240138; bh=3WdnQmshomibzByZClEkGia7PnK6CWBXCQshlze4d+I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jM9sLNZDJCyGA8EVCGqMJDWNJurpEUFOlM0x6Am4RGRjjBGFRiRaB9NsO5fFyJ+MX WfUqw+KJneyFVcctw4j3ZS7orXCXOUg5Pu1sdOa8FDJhTvXiU5yDbrCR2eWtNBAKFN bLgJ1T8jicXImpA6g1Lt8o4fGfDK72CDUb4vMAL/nSi/tmG2SloBvicaq0UXivXFy4 DnyG4Ovj24vn6mgTgb09yM5YwVZrtu3V2eLmld+vPuphTDL9zkSojaf+whzZIb0TUv tj/mGPGrRMyq2hsY6A98qJHwa9nkCfQViQnXKfehcxbtBHXLfp3x25lTN7u9JglQ5u qyTiz1YN9aU8g== From: Rob Herring Date: Thu, 04 Apr 2024 09:15:11 -0500 Subject: [PATCH 2/3] of: Use scope based kfree() cleanups Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240404-dt-cleanup-free-v1-2-c60e6cba8da9@kernel.org> References: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> In-Reply-To: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> To: Saravana Kannan Cc: Jonathan Cameron , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13-dev Use the relatively new scope based kfree() cleanup to simplify error handling. Doing so reduces the chances of memory leaks and simplifies error paths by avoiding the need for goto statements. Signed-off-by: Rob Herring Reviewed-by: Jonathan Cameron Reviewed-by: Saravana Kannan --- drivers/of/base.c | 34 ++++++++-------------------------- drivers/of/dynamic.c | 11 ++++------- drivers/of/resolver.c | 35 +++++++++++++---------------------- 3 files changed, 25 insertions(+), 55 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index 8856c67c466a..20603d3c9931 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -16,6 +16,7 @@ =20 #define pr_fmt(fmt) "OF: " fmt =20 +#include #include #include #include @@ -1393,8 +1394,10 @@ int of_parse_phandle_with_args_map(const struct devi= ce_node *np, const char *stem_name, int index, struct of_phandle_args *out_args) { - char *cells_name, *map_name =3D NULL, *mask_name =3D NULL; - char *pass_name =3D NULL; + char *cells_name __free(kfree) =3D kasprintf(GFP_KERNEL, "#%s-cells", ste= m_name); + char *map_name __free(kfree) =3D kasprintf(GFP_KERNEL, "%s-map", stem_nam= e); + char *mask_name __free(kfree) =3D kasprintf(GFP_KERNEL, "%s-map-mask", st= em_name); + char *pass_name __free(kfree) =3D kasprintf(GFP_KERNEL, "%s-map-pass-thru= ", stem_name); struct device_node *cur, *new =3D NULL; const __be32 *map, *mask, *pass; static const __be32 dummy_mask[] =3D { [0 ... MAX_PHANDLE_ARGS] =3D cpu_t= o_be32(~0) }; @@ -1407,27 +1410,13 @@ int of_parse_phandle_with_args_map(const struct dev= ice_node *np, if (index < 0) return -EINVAL; =20 - cells_name =3D kasprintf(GFP_KERNEL, "#%s-cells", stem_name); - if (!cells_name) + if (!cells_name || !map_name || !mask_name || !pass_name) return -ENOMEM; =20 - ret =3D -ENOMEM; - map_name =3D kasprintf(GFP_KERNEL, "%s-map", stem_name); - if (!map_name) - goto free; - - mask_name =3D kasprintf(GFP_KERNEL, "%s-map-mask", stem_name); - if (!mask_name) - goto free; - - pass_name =3D kasprintf(GFP_KERNEL, "%s-map-pass-thru", stem_name); - if (!pass_name) - goto free; - ret =3D __of_parse_phandle_with_args(np, list_name, cells_name, -1, index, out_args); if (ret) - goto free; + return ret; =20 /* Get the #-cells property */ cur =3D out_args->np; @@ -1444,8 +1433,7 @@ int of_parse_phandle_with_args_map(const struct devic= e_node *np, /* Get the -map property */ map =3D of_get_property(cur, map_name, &map_len); if (!map) { - ret =3D 0; - goto free; + return 0; } map_len /=3D sizeof(u32); =20 @@ -1521,12 +1509,6 @@ int of_parse_phandle_with_args_map(const struct devi= ce_node *np, put: of_node_put(cur); of_node_put(new); -free: - kfree(mask_name); - kfree(map_name); - kfree(cells_name); - kfree(pass_name); - return ret; } EXPORT_SYMBOL(of_parse_phandle_with_args_map); diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index af7c57a7a25d..43f4e2c93bd2 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -9,6 +9,7 @@ =20 #define pr_fmt(fmt) "OF: " fmt =20 +#include #include #include #include @@ -1019,10 +1020,9 @@ int of_changeset_add_prop_u32_array(struct of_change= set *ocs, const u32 *array, size_t sz) { struct property prop; - __be32 *val; - int i, ret; + __be32 *val __free(kfree) =3D kcalloc(sz, sizeof(__be32), GFP_KERNEL); + int i; =20 - val =3D kcalloc(sz, sizeof(__be32), GFP_KERNEL); if (!val) return -ENOMEM; =20 @@ -1032,9 +1032,6 @@ int of_changeset_add_prop_u32_array(struct of_changes= et *ocs, prop.length =3D sizeof(u32) * sz; prop.value =3D (void *)val; =20 - ret =3D of_changeset_add_prop_helper(ocs, np, &prop); - kfree(val); - - return ret; + return of_changeset_add_prop_helper(ocs, np, &prop); } EXPORT_SYMBOL_GPL(of_changeset_add_prop_u32_array); diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c index b278ab4338ce..2780928764a4 100644 --- a/drivers/of/resolver.c +++ b/drivers/of/resolver.c @@ -8,6 +8,7 @@ =20 #define pr_fmt(fmt) "OF: resolver: " fmt =20 +#include #include #include #include @@ -74,11 +75,11 @@ static int update_usages_of_a_phandle_reference(struct = device_node *overlay, { struct device_node *refnode; struct property *prop; - char *value, *cur, *end, *node_path, *prop_name, *s; + char *value __free(kfree) =3D kmemdup(prop_fixup->value, prop_fixup->leng= th, GFP_KERNEL); + char *cur, *end, *node_path, *prop_name, *s; int offset, len; int err =3D 0; =20 - value =3D kmemdup(prop_fixup->value, prop_fixup->length, GFP_KERNEL); if (!value) return -ENOMEM; =20 @@ -89,23 +90,19 @@ static int update_usages_of_a_phandle_reference(struct = device_node *overlay, =20 node_path =3D cur; s =3D strchr(cur, ':'); - if (!s) { - err =3D -EINVAL; - goto err_fail; - } + if (!s) + return -EINVAL; *s++ =3D '\0'; =20 prop_name =3D s; s =3D strchr(s, ':'); - if (!s) { - err =3D -EINVAL; - goto err_fail; - } + if (!s) + return -EINVAL; *s++ =3D '\0'; =20 err =3D kstrtoint(s, 10, &offset); if (err) - goto err_fail; + return err; =20 refnode =3D __of_find_node_by_full_path(of_node_get(overlay), node_path); if (!refnode) @@ -117,22 +114,16 @@ static int update_usages_of_a_phandle_reference(struc= t device_node *overlay, } of_node_put(refnode); =20 - if (!prop) { - err =3D -ENOENT; - goto err_fail; - } + if (!prop) + return -ENOENT; =20 - if (offset < 0 || offset + sizeof(__be32) > prop->length) { - err =3D -EINVAL; - goto err_fail; - } + if (offset < 0 || offset + sizeof(__be32) > prop->length) + return -EINVAL; =20 *(__be32 *)(prop->value + offset) =3D cpu_to_be32(phandle); } =20 -err_fail: - kfree(value); - return err; + return 0; } =20 /* compare nodes taking into account that 'name' strips out the @ part */ --=20 2.43.0 From nobody Sun Feb 8 19:03:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB5C6129A9A; Thu, 4 Apr 2024 14:15:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240141; cv=none; b=DXR09WqZCqKgPi9LXmhUVEELEKO07Kw24Dd5O4Sv86eIkArbyKIJeQ8+zKrRB9fFebDfqNg9uLzBb/VUA4RuK06T7SnwWt+ZMlOtphJa9oDlx3Oy0PePMpr+OqV9LMgTNQBS6jzCZ4isOilS4eBWgTiwnz4fbObOG25An26CNWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712240141; c=relaxed/simple; bh=+tPhXsIiXNNLRaL9PO2nWdDpnfyN5wkWP/ceOwTMptM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OORWihrQyQsoanZvQ2xAUZ0GHGKTU3RxUenmo/7BAI6DrjPVEjD6TK5bXD+lqEZmLeNnnNaAf2x4XSZRph3CAuMaJMMnpOsb+o7YhxivcFT7ADo668QK82v6QRv27uQ24lkMJjuGi0b2vofSObuO9TePTVVfCz2rev9X5MjhYvo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eC98v50z; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eC98v50z" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 40579C433C7; Thu, 4 Apr 2024 14:15:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712240140; bh=+tPhXsIiXNNLRaL9PO2nWdDpnfyN5wkWP/ceOwTMptM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eC98v50zw8xKuQevrDgaMGLl7AICPcIgw1AGIP+N5S641/EZEN6DvSGgeg4IyQhOj wKXmV/GOGdWnHKGiK/kQlSfh+RflJWZBmfff1gGPBH067goHEhm8u37Bn8h9ev0SBj dakANYhkjCZ58h8X07U+DeuQn++dAAP/O8q9M4xA9ozXpUMAeNsSeInpVUESVFRmXV W5lhWYFlylXjh9kM+nNt6QuW7kdMO+aePArtvk4ddSqeO/v916BDzDGIW+vjQ++7nE E4Ur+BCZFPf83BKCQJKOeLJKJ004A3k3WplGXHp145FLNg/jTFjLJCQAYoZB59EgyJ s5B01R+uLk/FA== From: Rob Herring Date: Thu, 04 Apr 2024 09:15:12 -0500 Subject: [PATCH 3/3] of: Use scope based of_node_put() cleanups Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240404-dt-cleanup-free-v1-3-c60e6cba8da9@kernel.org> References: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> In-Reply-To: <20240404-dt-cleanup-free-v1-0-c60e6cba8da9@kernel.org> To: Saravana Kannan Cc: Jonathan Cameron , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13-dev Use the relatively new scope based of_node_put() cleanup to simplify function exit handling. Doing so reduces the chances of forgetting an of_node_put() and simplifies error paths by avoiding the need for goto statements. Signed-off-by: Rob Herring Reviewed-by: Saravana Kannan --- drivers/of/address.c | 60 ++++++++++++++++-------------------------------= ---- drivers/of/property.c | 22 ++++++------------- 2 files changed, 26 insertions(+), 56 deletions(-) diff --git a/drivers/of/address.c b/drivers/of/address.c index ae46a3605904..f7b2d535a6d1 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -491,7 +491,6 @@ static u64 __of_translate_address(struct device_node *d= ev, const __be32 *in_addr, const char *rprop, struct device_node **host) { - struct device_node *parent =3D NULL; struct of_bus *bus, *pbus; __be32 addr[OF_MAX_ADDR_CELLS]; int na, ns, pna, pns; @@ -504,7 +503,7 @@ static u64 __of_translate_address(struct device_node *d= ev, =20 *host =3D NULL; /* Get parent & match bus type */ - parent =3D get_parent(dev); + struct device_node *parent __free(device_node) =3D get_parent(dev); if (parent =3D=3D NULL) goto bail; bus =3D of_match_bus(parent); @@ -573,7 +572,6 @@ static u64 __of_translate_address(struct device_node *d= ev, of_dump_addr("one level translation:", addr, na); } bail: - of_node_put(parent); of_node_put(dev); =20 return result; @@ -654,19 +652,16 @@ EXPORT_SYMBOL(of_translate_dma_address); const __be32 *of_translate_dma_region(struct device_node *dev, const __be3= 2 *prop, phys_addr_t *start, size_t *length) { - struct device_node *parent; + struct device_node *parent __free(device_node) =3D __of_get_dma_parent(de= v); u64 address, size; int na, ns; =20 - parent =3D __of_get_dma_parent(dev); if (!parent) return NULL; =20 na =3D of_bus_n_addr_cells(parent); ns =3D of_bus_n_size_cells(parent); =20 - of_node_put(parent); - address =3D of_translate_dma_address(dev, prop); if (address =3D=3D OF_BAD_ADDR) return NULL; @@ -688,21 +683,19 @@ const __be32 *__of_get_address(struct device_node *de= v, int index, int bar_no, { const __be32 *prop; unsigned int psize; - struct device_node *parent; + struct device_node *parent __free(device_node) =3D of_get_parent(dev); struct of_bus *bus; int onesize, i, na, ns; =20 - /* Get parent & match bus type */ - parent =3D of_get_parent(dev); if (parent =3D=3D NULL) return NULL; + + /* match the parent's bus type */ bus =3D of_match_bus(parent); - if (strcmp(bus->name, "pci") && (bar_no >=3D 0)) { - of_node_put(parent); + if (strcmp(bus->name, "pci") && (bar_no >=3D 0)) return NULL; - } + bus->count_cells(dev, &na, &ns); - of_node_put(parent); if (!OF_CHECK_ADDR_COUNT(na)) return NULL; =20 @@ -888,14 +881,13 @@ static u64 of_translate_ioport(struct device_node *de= v, const __be32 *in_addr, */ int of_dma_get_range(struct device_node *np, const struct bus_dma_region *= *map) { - struct device_node *node =3D of_node_get(np); + struct device_node *node __free(device_node) =3D of_node_get(np); const __be32 *ranges =3D NULL; bool found_dma_ranges =3D false; struct of_range_parser parser; struct of_range range; struct bus_dma_region *r; int len, num_ranges =3D 0; - int ret =3D 0; =20 while (node) { ranges =3D of_get_property(node, "dma-ranges", &len); @@ -905,10 +897,9 @@ int of_dma_get_range(struct device_node *np, const str= uct bus_dma_region **map) break; =20 /* Once we find 'dma-ranges', then a missing one is an error */ - if (found_dma_ranges && !ranges) { - ret =3D -ENODEV; - goto out; - } + if (found_dma_ranges && !ranges) + return -ENODEV; + found_dma_ranges =3D true; =20 node =3D of_get_next_dma_parent(node); @@ -916,10 +907,8 @@ int of_dma_get_range(struct device_node *np, const str= uct bus_dma_region **map) =20 if (!node || !ranges) { pr_debug("no dma-ranges found for node(%pOF)\n", np); - ret =3D -ENODEV; - goto out; + return -ENODEV; } - of_dma_range_parser_init(&parser, node); for_each_of_range(&parser, &range) { if (range.cpu_addr =3D=3D OF_BAD_ADDR) { @@ -930,16 +919,12 @@ int of_dma_get_range(struct device_node *np, const st= ruct bus_dma_region **map) num_ranges++; } =20 - if (!num_ranges) { - ret =3D -EINVAL; - goto out; - } + if (!num_ranges) + return -EINVAL; =20 r =3D kcalloc(num_ranges + 1, sizeof(*r), GFP_KERNEL); - if (!r) { - ret =3D -ENOMEM; - goto out; - } + if (!r) + return -ENOMEM; =20 /* * Record all info in the generic DMA ranges array for struct device, @@ -957,9 +942,7 @@ int of_dma_get_range(struct device_node *np, const stru= ct bus_dma_region **map) r->size =3D range.size; r++; } -out: - of_node_put(node); - return ret; + return 0; } #endif /* CONFIG_HAS_DMA */ =20 @@ -1016,11 +999,9 @@ phys_addr_t __init of_dma_get_max_cpu_address(struct = device_node *np) */ bool of_dma_is_coherent(struct device_node *np) { - struct device_node *node; + struct device_node *node __free(device_node) =3D of_node_get(np); bool is_coherent =3D dma_default_coherent; =20 - node =3D of_node_get(np); - while (node) { if (of_property_read_bool(node, "dma-coherent")) { is_coherent =3D true; @@ -1032,7 +1013,6 @@ bool of_dma_is_coherent(struct device_node *np) } node =3D of_get_next_dma_parent(node); } - of_node_put(node); return is_coherent; } EXPORT_SYMBOL_GPL(of_dma_is_coherent); @@ -1049,19 +1029,17 @@ EXPORT_SYMBOL_GPL(of_dma_is_coherent); */ static bool of_mmio_is_nonposted(struct device_node *np) { - struct device_node *parent; bool nonposted; =20 if (!IS_ENABLED(CONFIG_ARCH_APPLE)) return false; =20 - parent =3D of_get_parent(np); + struct device_node *parent __free(device_node) =3D of_get_parent(np); if (!parent) return false; =20 nonposted =3D of_property_read_bool(parent, "nonposted-mmio"); =20 - of_node_put(parent); return nonposted; } =20 diff --git a/drivers/of/property.c b/drivers/of/property.c index a6358ee99b74..b73daf81c99d 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -40,15 +40,12 @@ */ bool of_graph_is_present(const struct device_node *node) { - struct device_node *ports, *port; + struct device_node *ports __free(device_node) =3D of_get_child_by_name(no= de, "ports"); =20 - ports =3D of_get_child_by_name(node, "ports"); if (ports) node =3D ports; =20 - port =3D of_get_child_by_name(node, "port"); - of_node_put(ports); - of_node_put(port); + struct device_node *port __free(device_node) =3D of_get_child_by_name(nod= e, "port"); =20 return !!port; } @@ -610,9 +607,9 @@ EXPORT_SYMBOL(of_graph_parse_endpoint); */ struct device_node *of_graph_get_port_by_id(struct device_node *parent, u3= 2 id) { - struct device_node *node, *port; + struct device_node *port; + struct device_node *node __free(device_node) =3D of_get_child_by_name(par= ent, "ports"); =20 - node =3D of_get_child_by_name(parent, "ports"); if (node) parent =3D node; =20 @@ -626,8 +623,6 @@ struct device_node *of_graph_get_port_by_id(struct devi= ce_node *parent, u32 id) break; } =20 - of_node_put(node); - return port; } EXPORT_SYMBOL(of_graph_get_port_by_id); @@ -655,14 +650,13 @@ struct device_node *of_graph_get_next_endpoint(const = struct device_node *parent, * parent port node. */ if (!prev) { - struct device_node *node; + struct device_node *node __free(device_node) =3D + of_get_child_by_name(parent, "ports"); =20 - node =3D of_get_child_by_name(parent, "ports"); if (node) parent =3D node; =20 port =3D of_get_child_by_name(parent, "port"); - of_node_put(node); =20 if (!port) { pr_debug("graph: no port node found in %pOF\n", parent); @@ -1052,15 +1046,13 @@ static int of_fwnode_graph_parse_endpoint(const str= uct fwnode_handle *fwnode, struct fwnode_endpoint *endpoint) { const struct device_node *node =3D to_of_node(fwnode); - struct device_node *port_node =3D of_get_parent(node); + struct device_node *port_node __free(device_node) =3D of_get_parent(node); =20 endpoint->local_fwnode =3D fwnode; =20 of_property_read_u32(port_node, "reg", &endpoint->port); of_property_read_u32(node, "reg", &endpoint->id); =20 - of_node_put(port_node); - return 0; } =20 --=20 2.43.0