Hi Sakari, Le 3 septembre 2025 09 h 18 min 32 s HAE, Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> a écrit : >Hi Jean-François, > >On Tue, Sep 02, 2025 at 03:04:39PM -0400, Jean-François Lessard wrote: >> Add scoped versions of fwnode child node iterators that automatically >> handle reference counting cleanup using the __free() attribute: >> >> - fwnode_for_each_child_node_scoped() >> - fwnode_for_each_available_child_node_scoped() >> >> These macros follow the same pattern as existing scoped iterators in the >> kernel, ensuring fwnode references are automatically released when the >> iterator variable goes out of scope. This prevents resource leaks and >> eliminates the need for manual cleanup in error paths. >> >> The implementation mirrors the non-scoped variants but uses >> __free(fwnode_handle) for automatic resource management, providing a >> safer and more convenient interface for drivers iterating over firmware >> node children. >> >> Signed-off-by: Jean-François Lessard <jefflessard3@xxxxxxxxx> >> --- >> >> Notes: >> checkpatch reports false positives that are intentionally ignored: >> MACRO_ARG_REUSE, MACRO_ARG_PRECEDENCE >> This is a standard iterator pattern following kernel conventions. >> >> include/linux/property.h | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/include/linux/property.h b/include/linux/property.h >> index 82f0cb3ab..862e20813 100644 >> --- a/include/linux/property.h >> +++ b/include/linux/property.h >> @@ -176,6 +176,16 @@ struct fwnode_handle *fwnode_get_next_available_child_node( >> for (child = fwnode_get_next_available_child_node(fwnode, NULL); child;\ >> child = fwnode_get_next_available_child_node(fwnode, child)) >> >> +#define fwnode_for_each_child_node_scoped(fwnode, child) \ >> + for (struct fwnode_handle *child __free(fwnode_handle) = \ >> + fwnode_get_next_child_node(fwnode, NULL); \ >> + child; child = fwnode_get_next_child_node(fwnode, child)) >> + >> +#define fwnode_for_each_available_child_node_scoped(fwnode, child) \ >> + for (struct fwnode_handle *child __free(fwnode_handle) = \ >> + fwnode_get_next_available_child_node(fwnode, NULL); \ >> + child; child = fwnode_get_next_available_child_node(fwnode, child)) >> + > >Do we really need the available variant? > >Please see ><URL:https://lore.kernel.org/linux-acpi/Zwj12J5bTNUEnxA0@kekkonen.localdomain/>. > >I'll post a patch to remove fwnode_get_next_available_child_node(), too. > Thanks for the link to the discussion. I see you're planning to remove fwnode_get_next_available_child_node() entirely. In that context, adding a scoped version doesn't make sense. For my driver use case, I can handle the status checking manually if the _available_ variant is being deprecated. Should I drop the _available_ variant and submit v5 with only fwnode_for_each_child_node_scoped()? >> struct fwnode_handle *device_get_next_child_node(const struct device *dev, >> struct fwnode_handle *child); >> >