Message ID | 20240216175221.900565-5-jic23@kernel.org |
---|---|
State | Superseded |
Headers | show |
Series | device property / IIO: Use cleanup.h magic for fwnode_handle_put() handling. | expand |
On Fri, Feb 16, 2024 at 05:52:10PM +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. ... > +#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)) You haven't changed the indentation of backslashes...
On Fri, 16 Feb 2024 20:02:49 +0200 Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > On Fri, Feb 16, 2024 at 05:52:10PM +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. > > ... > > > +#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)) > > You haven't changed the indentation of backslashes... > I've managed to send out a stale version as definitely did update that. Sorry for the noise! Ah found it - I managed to commit it on patch 15 not this one. Will move it and send a v4.
diff --git a/include/linux/property.h b/include/linux/property.h index 9e67c3c4df6e..421ccfd43fb1 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,