Re: [PATCH v4 04/15] device property: Introduce device_for_each_child_node_scoped()

Greg Kroah-Hartman
2024-02-19T08:56:15Z

On Sat, Feb 17, 2024 at 04:42:38PM +0000, Jonathan Cameron wrote:
> From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>
> Similar to recently propose for_each_child_of_node_scoped() this
> new version of the loop macro instantiates a new local
> struct fwnode_handle * that uses the __free(fwnode_handle) auto
> cleanup handling so that if a reference to a node is held on early
> exit from the loop the reference will be released. If the loop
> runs to completion, the child pointer will be NULL and no action will
> be taken.
>
> The reason this is useful is that it removes the need for
> fwnode_handle_put() on early loop exits. If there is a need
> to retain the reference, then return_ptr(child) or no_free_ptr(child)
> may be used to safely disable the auto cleanup.
>
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---
> v4: Include the alignement changes that were in patch 15 of v3 with
> a tweak as I missed the first line. Thanks Andy!
>
> include/linux/property.h | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/include/linux/property.h b/include/linux/property.h
> index 9e67c3c4df6e..eefd662a2f9d 100644
> --- a/include/linux/property.h
> +++ b/include/linux/property.h
> @@ -182,6 +182,11 @@ struct fwnode_handle *device_get_next_child_node(const struct device *dev,
> for (child = device_get_next_child_node(dev, NULL); child; \
> child = device_get_next_child_node(dev, child))
>
> +#define device_for_each_child_node_scoped(dev, child) \
> + for (struct fwnode_handle *child __free(fwnode_handle) = \
> + device_get_next_child_node(dev, NULL); \
> + child; child = device_get_next_child_node(dev, child))
> +
> struct fwnode_handle *fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
> const char *childname);
> struct fwnode_handle *device_get_named_child_node(const struct device *dev,

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>