* [PATCH v3 0/2] device property: Add scoped fwnode child node iterators @ 2025-09-01 16:36 Jean-François Lessard 2025-09-01 16:36 ` [PATCH v3 1/2] " Jean-François Lessard 2025-09-01 16:36 ` [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() Jean-François Lessard 0 siblings, 2 replies; 9+ messages in thread From: Jean-François Lessard @ 2025-09-01 16:36 UTC (permalink / raw) To: Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich Cc: linux-i2c, linux-kernel, linux-acpi This series adds scoped versions of fwnode iterator macros and converts existing manual implementation to use them. The first patch adds the infrastructure macros following existing patterns for scoped iterators in the kernel. The second patch demonstrates their usage by converting existing manual __free() usage in i2c-core-slave.c. Changes in v3: - Split into separate patches as requested - Infrastructure addition in patch 1/2 - Usage example in patch 2/2 Changes in v2: - replace manual __free(fwnode_handle) of i2c-core-slave.c with fwnode_for_each_child_node_scoped Jean-François Lessard (2): device property: Add scoped fwnode child node iterators i2c: core: Use fwnode_for_each_child_node_scoped() drivers/i2c/i2c-core-slave.c | 3 +-- include/linux/property.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/2] device property: Add scoped fwnode child node iterators 2025-09-01 16:36 [PATCH v3 0/2] device property: Add scoped fwnode child node iterators Jean-François Lessard @ 2025-09-01 16:36 ` Jean-François Lessard 2025-09-01 17:48 ` Danilo Krummrich 2025-09-01 16:36 ` [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() Jean-François Lessard 1 sibling, 1 reply; 9+ messages in thread From: Jean-François Lessard @ 2025-09-01 16:36 UTC (permalink / raw) To: Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich Cc: linux-i2c, linux-kernel, linux-acpi 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_named_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@gmail.com> --- Notes: checkpatch reports false positives that are intentionally ignored: COMPLEX_MACRO, MACRO_ARG_REUSE, MACRO_ARG_PRECEDENCE This is a standard iterator pattern following kernel conventions. include/linux/property.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/linux/property.h b/include/linux/property.h index 82f0cb3ab..279c244db 100644 --- a/include/linux/property.h +++ b/include/linux/property.h @@ -176,6 +176,20 @@ 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_named_child_node_scoped(fwnode, child, name) \ + fwnode_for_each_child_node_scoped(fwnode, child) \ + for_each_if(fwnode_name_eq(child, name)) + +#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)) + struct fwnode_handle *device_get_next_child_node(const struct device *dev, struct fwnode_handle *child); -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] device property: Add scoped fwnode child node iterators 2025-09-01 16:36 ` [PATCH v3 1/2] " Jean-François Lessard @ 2025-09-01 17:48 ` Danilo Krummrich 2025-09-01 18:16 ` Jean-François Lessard 0 siblings, 1 reply; 9+ messages in thread From: Danilo Krummrich @ 2025-09-01 17:48 UTC (permalink / raw) To: Jean-François Lessard Cc: Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-i2c, linux-kernel, linux-acpi On 9/1/25 6:36 PM, 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_named_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@gmail.com> Thanks for adding a user and splitting it up (Andy was a bit faster than me :). > diff --git a/include/linux/property.h b/include/linux/property.h > index 82f0cb3ab..279c244db 100644 > --- a/include/linux/property.h > +++ b/include/linux/property.h > @@ -176,6 +176,20 @@ 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_named_child_node_scoped(fwnode, child, name) \ > + fwnode_for_each_child_node_scoped(fwnode, child) \ > + for_each_if(fwnode_name_eq(child, name)) IIRC, your first patch mentioned that your driver series would only use fwnode_for_each_available_child_node_scoped(). And this series adds a user for fwnode_for_each_child_node_scoped(); do you also have a user for fwnode_for_each_named_child_node_scoped()? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] device property: Add scoped fwnode child node iterators 2025-09-01 17:48 ` Danilo Krummrich @ 2025-09-01 18:16 ` Jean-François Lessard 2025-09-02 4:50 ` Greg Kroah-Hartman 0 siblings, 1 reply; 9+ messages in thread From: Jean-François Lessard @ 2025-09-01 18:16 UTC (permalink / raw) To: Danilo Krummrich Cc: Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, linux-i2c, linux-kernel, linux-acpi Le 1 septembre 2025 13 h 48 min 14 s HAE, Danilo Krummrich <dakr@kernel.org> a écrit : >On 9/1/25 6:36 PM, 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_named_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@gmail.com> > >Thanks for adding a user and splitting it up (Andy was a bit faster than me :). > Very welcome! Thanks for reviewing. >> diff --git a/include/linux/property.h b/include/linux/property.h >> index 82f0cb3ab..279c244db 100644 >> --- a/include/linux/property.h >> +++ b/include/linux/property.h >> @@ -176,6 +176,20 @@ 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_named_child_node_scoped(fwnode, child, name) \ >> + fwnode_for_each_child_node_scoped(fwnode, child) \ >> + for_each_if(fwnode_name_eq(child, name)) > >IIRC, your first patch mentioned that your driver series would only use >fwnode_for_each_available_child_node_scoped(). You are correct. Next version of TM16XX driver patch series will use fwnode_for_each_available_child_node_scoped() > >And this series adds a user for fwnode_for_each_child_node_scoped(); do you also have a user for fwnode_for_each_named_child_node_scoped()? No, I haven't found an existing user that requires the scoped version. The only usage I found of the non-scoped fwnode_for_each_named_child_node() is in drivers/base/property.c in fwnode_get_named_child_node_count(), which doesn't need to put the fwnode. I included it for consistency since the header defines all three non-scoped variants, but I understand the "no dead code" policy concern. Would you prefer I drop the fwnode_for_each_named_child_node_scoped() variant and submit a v4 with only the two variants that have real users? Regards, Jean-François Lessard ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] device property: Add scoped fwnode child node iterators 2025-09-01 18:16 ` Jean-François Lessard @ 2025-09-02 4:50 ` Greg Kroah-Hartman 2025-09-02 16:54 ` Jean-François Lessard 0 siblings, 1 reply; 9+ messages in thread From: Greg Kroah-Hartman @ 2025-09-02 4:50 UTC (permalink / raw) To: Jean-François Lessard Cc: Danilo Krummrich, Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Rafael J. Wysocki, linux-i2c, linux-kernel, linux-acpi On Mon, Sep 01, 2025 at 02:16:35PM -0400, Jean-François Lessard wrote: > Le 1 septembre 2025 13 h 48 min 14 s HAE, Danilo Krummrich <dakr@kernel.org> a écrit : > >On 9/1/25 6:36 PM, 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_named_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@gmail.com> > > > >Thanks for adding a user and splitting it up (Andy was a bit faster than me :). > > > > Very welcome! Thanks for reviewing. > > >> diff --git a/include/linux/property.h b/include/linux/property.h > >> index 82f0cb3ab..279c244db 100644 > >> --- a/include/linux/property.h > >> +++ b/include/linux/property.h > >> @@ -176,6 +176,20 @@ 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_named_child_node_scoped(fwnode, child, name) \ > >> + fwnode_for_each_child_node_scoped(fwnode, child) \ > >> + for_each_if(fwnode_name_eq(child, name)) > > > >IIRC, your first patch mentioned that your driver series would only use > >fwnode_for_each_available_child_node_scoped(). > > You are correct. Next version of TM16XX driver patch series will use > fwnode_for_each_available_child_node_scoped() > > > > >And this series adds a user for fwnode_for_each_child_node_scoped(); do you also have a user for fwnode_for_each_named_child_node_scoped()? > > No, I haven't found an existing user that requires the scoped version. The only > usage I found of the non-scoped fwnode_for_each_named_child_node() is in > drivers/base/property.c in fwnode_get_named_child_node_count(), which doesn't > need to put the fwnode. > > I included it for consistency since the header defines all three non-scoped > variants, but I understand the "no dead code" policy concern. > > Would you prefer I drop the fwnode_for_each_named_child_node_scoped() > variant and submit a v4 with only the two variants that have real users? Yes please. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] device property: Add scoped fwnode child node iterators 2025-09-02 4:50 ` Greg Kroah-Hartman @ 2025-09-02 16:54 ` Jean-François Lessard 0 siblings, 0 replies; 9+ messages in thread From: Jean-François Lessard @ 2025-09-02 16:54 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Danilo Krummrich, Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Rafael J. Wysocki, linux-i2c, linux-kernel, linux-acpi Le 2 septembre 2025 00 h 50 min 08 s HAE, Greg Kroah-Hartman <gregkh@linuxfoundation.org> a écrit : >On Mon, Sep 01, 2025 at 02:16:35PM -0400, Jean-François Lessard wrote: >> Le 1 septembre 2025 13 h 48 min 14 s HAE, Danilo Krummrich <dakr@kernel.org> a écrit : >> >On 9/1/25 6:36 PM, 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_named_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@gmail.com> >> > >> >Thanks for adding a user and splitting it up (Andy was a bit faster than me :). >> > >> >> Very welcome! Thanks for reviewing. >> >> >> diff --git a/include/linux/property.h b/include/linux/property.h >> >> index 82f0cb3ab..279c244db 100644 >> >> --- a/include/linux/property.h >> >> +++ b/include/linux/property.h >> >> @@ -176,6 +176,20 @@ 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_named_child_node_scoped(fwnode, child, name) \ >> >> + fwnode_for_each_child_node_scoped(fwnode, child) \ >> >> + for_each_if(fwnode_name_eq(child, name)) >> > >> >IIRC, your first patch mentioned that your driver series would only use >> >fwnode_for_each_available_child_node_scoped(). >> >> You are correct. Next version of TM16XX driver patch series will use >> fwnode_for_each_available_child_node_scoped() >> >> > >> >And this series adds a user for fwnode_for_each_child_node_scoped(); do you also have a user for fwnode_for_each_named_child_node_scoped()? >> >> No, I haven't found an existing user that requires the scoped version. The only >> usage I found of the non-scoped fwnode_for_each_named_child_node() is in >> drivers/base/property.c in fwnode_get_named_child_node_count(), which doesn't >> need to put the fwnode. >> >> I included it for consistency since the header defines all three non-scoped >> variants, but I understand the "no dead code" policy concern. >> >> Would you prefer I drop the fwnode_for_each_named_child_node_scoped() >> variant and submit a v4 with only the two variants that have real users? > >Yes please. Understood. I will do so. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() 2025-09-01 16:36 [PATCH v3 0/2] device property: Add scoped fwnode child node iterators Jean-François Lessard 2025-09-01 16:36 ` [PATCH v3 1/2] " Jean-François Lessard @ 2025-09-01 16:36 ` Jean-François Lessard 2025-09-02 9:44 ` Andy Shevchenko 1 sibling, 1 reply; 9+ messages in thread From: Jean-François Lessard @ 2025-09-01 16:36 UTC (permalink / raw) To: Wolfram Sang, Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich Cc: linux-i2c, linux-kernel, linux-acpi Replace the manual __free(fwnode_handle) iterator declaration with the new scoped iterator macro for cleaner, less error-prone code. This eliminates the need for explicit iterator variable declaration with the cleanup attribute, making the code more consistent with other scoped iterator usage patterns in the kernel. Signed-off-by: Jean-François Lessard <jefflessard3@gmail.com> --- drivers/i2c/i2c-core-slave.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/i2c/i2c-core-slave.c b/drivers/i2c/i2c-core-slave.c index 7ee6b992b..02ca55c22 100644 --- a/drivers/i2c/i2c-core-slave.c +++ b/drivers/i2c/i2c-core-slave.c @@ -112,10 +112,9 @@ bool i2c_detect_slave_mode(struct device *dev) struct fwnode_handle *fwnode = dev_fwnode(dev); if (is_of_node(fwnode)) { - struct fwnode_handle *child __free(fwnode_handle) = NULL; u32 reg; - fwnode_for_each_child_node(fwnode, child) { + fwnode_for_each_child_node_scoped(fwnode, child) { fwnode_property_read_u32(child, "reg", ®); if (reg & I2C_OWN_SLAVE_ADDRESS) return true; -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() 2025-09-01 16:36 ` [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() Jean-François Lessard @ 2025-09-02 9:44 ` Andy Shevchenko 2025-09-02 16:56 ` Jean-François Lessard 0 siblings, 1 reply; 9+ messages in thread From: Andy Shevchenko @ 2025-09-02 9:44 UTC (permalink / raw) To: Jean-François Lessard Cc: Wolfram Sang, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-i2c, linux-kernel, linux-acpi On Mon, Sep 01, 2025 at 12:36:45PM -0400, Jean-François Lessard wrote: > Replace the manual __free(fwnode_handle) iterator declaration with the > new scoped iterator macro for cleaner, less error-prone code. > > This eliminates the need for explicit iterator variable declaration with > the cleanup attribute, making the code more consistent with other scoped > iterator usage patterns in the kernel. Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() 2025-09-02 9:44 ` Andy Shevchenko @ 2025-09-02 16:56 ` Jean-François Lessard 0 siblings, 0 replies; 9+ messages in thread From: Jean-François Lessard @ 2025-09-02 16:56 UTC (permalink / raw) To: Andy Shevchenko Cc: Wolfram Sang, Daniel Scally, Heikki Krogerus, Sakari Ailus, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-i2c, linux-kernel, linux-acpi Le 2 septembre 2025 05 h 44 min 52 s HAE, Andy Shevchenko <andriy.shevchenko@linux.intel.com> a écrit : >On Mon, Sep 01, 2025 at 12:36:45PM -0400, Jean-François Lessard wrote: >> Replace the manual __free(fwnode_handle) iterator declaration with the >> new scoped iterator macro for cleaner, less error-prone code. >> >> This eliminates the need for explicit iterator variable declaration with >> the cleanup attribute, making the code more consistent with other scoped >> iterator usage patterns in the kernel. > >Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > Acknowledged with thanks. Will add this tag in the next submission. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-09-02 16:56 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-09-01 16:36 [PATCH v3 0/2] device property: Add scoped fwnode child node iterators Jean-François Lessard 2025-09-01 16:36 ` [PATCH v3 1/2] " Jean-François Lessard 2025-09-01 17:48 ` Danilo Krummrich 2025-09-01 18:16 ` Jean-François Lessard 2025-09-02 4:50 ` Greg Kroah-Hartman 2025-09-02 16:54 ` Jean-François Lessard 2025-09-01 16:36 ` [PATCH v3 2/2] i2c: core: Use fwnode_for_each_child_node_scoped() Jean-François Lessard 2025-09-02 9:44 ` Andy Shevchenko 2025-09-02 16:56 ` Jean-François Lessard
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).