linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] device property: Add scoped fwnode child node iterators
@ 2025-08-29 13:00 Jean-François Lessard
  2025-09-01  9:18 ` Andy Shevchenko
  0 siblings, 1 reply; 3+ messages in thread
From: Jean-François Lessard @ 2025-08-29 13:00 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.
    
v2 changelog:
- replace manual __free(fwnode_handle) of i2c-core-slave.c with
  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(-)

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", &reg);
 			if (reg & I2C_OWN_SLAVE_ADDRESS)
 				return true;
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] 3+ messages in thread

* Re: [PATCH v2] device property: Add scoped fwnode child node iterators
  2025-08-29 13:00 [PATCH v2] device property: Add scoped fwnode child node iterators Jean-François Lessard
@ 2025-09-01  9:18 ` Andy Shevchenko
  2025-09-01 14:05   ` Jean-François Lessard
  0 siblings, 1 reply; 3+ messages in thread
From: Andy Shevchenko @ 2025-09-01  9:18 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 Fri, Aug 29, 2025 at 09:00:08AM -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_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.

The problem is that these two are not coupled, means there is no need to send
a single patch, so, please split to a series of two.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] device property: Add scoped fwnode child node iterators
  2025-09-01  9:18 ` Andy Shevchenko
@ 2025-09-01 14:05   ` Jean-François Lessard
  0 siblings, 0 replies; 3+ messages in thread
From: Jean-François Lessard @ 2025-09-01 14:05 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 1 septembre 2025 05 h 18 min 41 s HAE, Andy Shevchenko <andriy.shevchenko@linux.intel.com> a écrit :
>On Fri, Aug 29, 2025 at 09:00:08AM -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_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.
>
>The problem is that these two are not coupled, means there is no need to send
>a single patch, so, please split to a series of two.
>

Understood. I'll submit v3 splitted in a series of two.



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-09-01 14:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-29 13:00 [PATCH v2] device property: Add scoped fwnode child node iterators Jean-François Lessard
2025-09-01  9:18 ` Andy Shevchenko
2025-09-01 14:05   ` 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).