Linux driver-core infrastructure
 help / color / mirror / Atom feed
* [PATCH v2] software node: provide wrappers around kobject_get/put()
@ 2026-04-27 13:18 Bartosz Golaszewski
  2026-05-08 18:47 ` Rafael J. Wysocki
  2026-05-09 18:29 ` Danilo Krummrich
  0 siblings, 2 replies; 3+ messages in thread
From: Bartosz Golaszewski @ 2026-04-27 13:18 UTC (permalink / raw)
  To: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
	Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich
  Cc: linux-acpi, driver-core, linux-kernel, brgl, Bartosz Golaszewski

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@oss.qualcomm.com>
---
Changes in v2:
- Make swnode_get() return the address of the swnode whose refcount it
  bumps and use that fact in software_node_get()

 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


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

* Re: [PATCH v2] software node: provide wrappers around kobject_get/put()
  2026-04-27 13:18 [PATCH v2] software node: provide wrappers around kobject_get/put() Bartosz Golaszewski
@ 2026-05-08 18:47 ` Rafael J. Wysocki
  2026-05-09 18:29 ` Danilo Krummrich
  1 sibling, 0 replies; 3+ messages in thread
From: Rafael J. Wysocki @ 2026-05-08 18:47 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
	Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich,
	linux-acpi, driver-core, linux-kernel, brgl

On Mon, Apr 27, 2026 at 3:18 PM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> 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@oss.qualcomm.com>
> ---
> 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@kernel.org>

>  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
>

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

* Re: [PATCH v2] software node: provide wrappers around kobject_get/put()
  2026-04-27 13:18 [PATCH v2] software node: provide wrappers around kobject_get/put() Bartosz Golaszewski
  2026-05-08 18:47 ` Rafael J. Wysocki
@ 2026-05-09 18:29 ` Danilo Krummrich
  1 sibling, 0 replies; 3+ messages in thread
From: Danilo Krummrich @ 2026-05-09 18:29 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Andy Shevchenko, Daniel Scally, Heikki Krogerus, Sakari Ailus,
	Greg Kroah-Hartman, Rafael J . Wysocki, Danilo Krummrich,
	linux-acpi, driver-core, linux-kernel, brgl

On Mon, 27 Apr 2026 15:18:25 +0200, Bartosz Golaszewski wrote:
> [PATCH v2] software node: provide wrappers around kobject_get/put()

Applied, thanks!

  Branch: driver-core-testing
  Tree:   git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git

[1/1] software node: provide wrappers around kobject_get/put()
      commit: c393ef0741d4

The patch will appear in the next linux-next integration (typically within 24
hours on weekdays).

The patch is in the driver-core-testing branch and will be promoted to
driver-core-next after validation.

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

end of thread, other threads:[~2026-05-09 18:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-27 13:18 [PATCH v2] software node: provide wrappers around kobject_get/put() Bartosz Golaszewski
2026-05-08 18:47 ` Rafael J. Wysocki
2026-05-09 18:29 ` Danilo Krummrich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox