Re: [PATCH v2] software node: provide wrappers around kobject_get/put()

From: Rafael J. Wysocki

Date: Fri May 08 2026 - 14:48:00 EST


On Mon, Apr 27, 2026 at 3:18 PM Bartosz Golaszewski
<bartosz.golaszewski@xxxxxxxxxxxxxxxx> wrote:
>
> Make the code more readable by avoid constant dereferencing of the
> swnode's kobject when managing references. Provide wrappers that take
> struct swnode * as argument and make them hide that logic.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxxxxxxxx>
> ---
> Changes in v2:
> - Make swnode_get() return the address of the swnode whose refcount it
> bumps and use that fact in software_node_get()

No issues found, so

Reviewed-by: Rafael J. Wysocki (Intel) <rafael@xxxxxxxxxx>

> drivers/base/swnode.c | 40 ++++++++++++++++++++++++----------------
> 1 file changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
> index a19f8f722bc8e..869228a65cb36 100644
> --- a/drivers/base/swnode.c
> +++ b/drivers/base/swnode.c
> @@ -374,20 +374,28 @@ EXPORT_SYMBOL_GPL(property_entries_free);
> /* -------------------------------------------------------------------------- */
> /* fwnode operations */
>
> -static struct fwnode_handle *software_node_get(struct fwnode_handle *fwnode)
> +static struct swnode *swnode_get(struct swnode *swnode)
> {
> - struct swnode *swnode = to_swnode(fwnode);
> -
> kobject_get(&swnode->kobj);
>
> + return swnode;
> +}
> +
> +static void swnode_put(struct swnode *swnode)
> +{
> + kobject_put(&swnode->kobj);
> +}
> +
> +static struct fwnode_handle *software_node_get(struct fwnode_handle *fwnode)
> +{
> + struct swnode *swnode = swnode_get(to_swnode(fwnode));
> +
> return &swnode->fwnode;
> }
>
> static void software_node_put(struct fwnode_handle *fwnode)
> {
> - struct swnode *swnode = to_swnode(fwnode);
> -
> - kobject_put(&swnode->kobj);
> + swnode_put(to_swnode(fwnode));
> }
>
> static bool software_node_property_present(const struct fwnode_handle *fwnode,
> @@ -493,7 +501,7 @@ software_node_get_named_child_node(const struct fwnode_handle *fwnode,
>
> list_for_each_entry(child, &swnode->children, entry) {
> if (!strcmp(childname, kobject_name(&child->kobj))) {
> - kobject_get(&child->kobj);
> + swnode_get(child);
> return &child->fwnode;
> }
> }
> @@ -737,7 +745,7 @@ software_node_find_by_name(const struct software_node *parent, const char *name)
> swnode = kobj_to_swnode(k);
> if (parent == swnode->node->parent && swnode->node->name &&
> !strcmp(name, swnode->node->name)) {
> - kobject_get(&swnode->kobj);
> + swnode_get(swnode);
> break;
> }
> swnode = NULL;
> @@ -835,13 +843,13 @@ swnode_register(const struct software_node *node, struct swnode *parent,
> parent ? &parent->kobj : NULL,
> "node%d", swnode->id);
> if (ret) {
> - kobject_put(&swnode->kobj);
> + swnode_put(swnode);
> return ERR_PTR(ret);
> }
>
> /*
> * Assign the flag only in the successful case, so
> - * the above kobject_put() won't mess up with properties.
> + * the above swnode_put() won't mess up with properties.
> */
> swnode->allocated = allocated;
>
> @@ -978,7 +986,7 @@ void fwnode_remove_software_node(struct fwnode_handle *fwnode)
> if (!swnode)
> return;
>
> - kobject_put(&swnode->kobj);
> + swnode_put(swnode);
> }
> EXPORT_SYMBOL_GPL(fwnode_remove_software_node);
>
> @@ -1002,7 +1010,7 @@ int device_add_software_node(struct device *dev, const struct software_node *nod
>
> swnode = software_node_to_swnode(node);
> if (swnode) {
> - kobject_get(&swnode->kobj);
> + swnode_get(swnode);
> } else {
> ret = software_node_register(node);
> if (ret)
> @@ -1044,7 +1052,7 @@ void device_remove_software_node(struct device *dev)
> software_node_notify_remove(dev);
>
> set_secondary_fwnode(dev, NULL);
> - kobject_put(&swnode->kobj);
> + swnode_put(swnode);
> }
> EXPORT_SYMBOL_GPL(device_remove_software_node);
>
> @@ -1097,7 +1105,7 @@ void software_node_notify(struct device *dev)
> if (!swnode)
> return;
>
> - kobject_get(&swnode->kobj);
> + swnode_get(swnode);
> ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node");
> if (ret)
> return;
> @@ -1119,11 +1127,11 @@ void software_node_notify_remove(struct device *dev)
>
> sysfs_remove_link(&swnode->kobj, dev_name(dev));
> sysfs_remove_link(&dev->kobj, "software_node");
> - kobject_put(&swnode->kobj);
> + swnode_put(swnode);
>
> if (swnode->managed) {
> set_secondary_fwnode(dev, NULL);
> - kobject_put(&swnode->kobj);
> + swnode_put(swnode);
> }
> }
>
> --
> 2.47.3
>