[PATCH v2 2/4] software node: allow passing reference args to PROPERTY_ENTRY_REF

Dmitry Torokhov posted 4 patches 3 days, 5 hours ago
[PATCH v2 2/4] software node: allow passing reference args to PROPERTY_ENTRY_REF
Posted by Dmitry Torokhov 3 days, 5 hours ago
When dynamically creating software nodes and properties for subsequent
use with software_node_register() current implementation of
PROPERTY_ENTRY_REF is not suitable because it creates a temporary
instance of struct software_node_ref_args on stack which will later
disappear, and software_node_register() only does shallow copy of
properties.

Fix this by allowing to pass address of reference arguments structure
directly into PROPERTY_ENTRY_REF(), so that caller can manage lifetime
of the object properly.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 include/linux/property.h | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/linux/property.h b/include/linux/property.h
index e30ef23a9af3..942657e76993 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -471,12 +471,19 @@ struct property_entry {
 #define PROPERTY_ENTRY_STRING(_name_, _val_)				\
 	__PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
 
+#define __PROPERTY_ENTRY_REF_ARGS(_ref_, ...)				\
+	_Generic(_ref_,							\
+		 const struct software_node_ref_args *: _ref_,		\
+		 struct software_node_ref_args *: _ref_,		\
+		 default: &SOFTWARE_NODE_REFERENCE(_ref_,		\
+						   ##__VA_ARGS__))
+
 #define PROPERTY_ENTRY_REF(_name_, _ref_, ...)				\
 (struct property_entry) {						\
 	.name = _name_,							\
 	.length = sizeof(struct software_node_ref_args),		\
 	.type = DEV_PROP_REF,						\
-	{ .pointer = &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__), },	\
+	{ .pointer = __PROPERTY_ENTRY_REF_ARGS(_ref_, ##__VA_ARGS__) },	\
 }
 
 #define PROPERTY_ENTRY_BOOL(_name_)		\

-- 
2.53.0.1018.g2bb0e51243-goog
Re: [PATCH v2 2/4] software node: allow passing reference args to PROPERTY_ENTRY_REF
Posted by Andy Shevchenko 2 days, 21 hours ago
On Sun, Mar 29, 2026 at 07:27:49PM -0700, Dmitry Torokhov wrote:
> When dynamically creating software nodes and properties for subsequent
> use with software_node_register() current implementation of
> PROPERTY_ENTRY_REF is not suitable because it creates a temporary

PROPERTY_ENTRY_REF()

> instance of struct software_node_ref_args on stack which will later
> disappear, and software_node_register() only does shallow copy of
> properties.
> 
> Fix this by allowing to pass address of reference arguments structure
> directly into PROPERTY_ENTRY_REF(), so that caller can manage lifetime
> of the object properly.

...

> +#define __PROPERTY_ENTRY_REF_ARGS(_ref_, ...)				\
> +	_Generic(_ref_,							\
> +		 const struct software_node_ref_args *: _ref_,		\
> +		 struct software_node_ref_args *: _ref_,		\
> +		 default: &SOFTWARE_NODE_REFERENCE(_ref_,		\
> +						   ##__VA_ARGS__))

Make it a single line

		 default: &SOFTWARE_NODE_REFERENCE(_ref_, ##__VA_ARGS__))

AFAICS it has no continuation and fits the given format well.

-- 
With Best Regards,
Andy Shevchenko