Re: PPC64: vio_find_node removal?

Dmitry Torokhov
2004-07-04T02:27:55Z

On Friday 02 July 2004 09:28 am, Hollis Blanchard wrote:
> On Jul 1, 2004, at 5:51 PM, Dmitry Torokhov wrote:
> >
> > Ok, so if we add call to kobject_get in kset_find_obj we can just add
> > kobject_put right in vio_find_name because there can be only one-to-one
> > match between a slot and a vio device and we don't need refcounting
> > there,
> > right?
>
> Hmm. Yes, I agree that we need kobject_get and _put between
> kset_find_obj() and vio_find_name().

I tried putting kobject_put in vio_find_name but it felt extremely dirty.
So I moved it to the caller - rpaphp_vio::register_vio_slot(). What do
you think? (I am also CC-ing Greg KH so he can apply if there is an
agreement.)

===================================================================

ChangeSet@1.1778.5.4, 2004-07-03 21:19:34-05:00, dtor_core@ameritech.net
Driver core: kset_find_obj should increment refcount of the found object
so users of the function can safely use returned object

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

drivers/base/bus.c | 2 ++
drivers/base/core.c | 10 ++++++++++
drivers/pci/hotplug/rpaphp_vio.c | 9 ++++++++-
lib/kobject.c | 7 ++++---
4 files changed, 24 insertions(+), 4 deletions(-)

===================================================================

diff -Nru a/drivers/base/bus.c b/drivers/base/bus.c
--- a/drivers/base/bus.c 2004-07-03 21:25:37 -05:00
+++ b/drivers/base/bus.c 2004-07-03 21:25:37 -05:00
@@ -607,6 +607,8 @@
*
* Call kset_find_obj() to iterate over list of buses to
* find a bus by name. Return bus if found.
+ *
+ * Note that kset_find_obj increments bus' reference count.
*/

struct bus_type * find_bus(char * name)
diff -Nru a/drivers/base/core.c b/drivers/base/core.c
--- a/drivers/base/core.c 2004-07-03 21:25:37 -05:00
+++ b/drivers/base/core.c 2004-07-03 21:25:37 -05:00
@@ -378,6 +378,16 @@
return error;
}

+/**
+ * device_find - locate device on a bus by name.
+ * @name: name of the device.
+ * @bus: bus to scan for the device.
+ *
+ * Call kset_find_obj() to iterate over list of devices on
+ * a bus to find device by name. Return device if found.
+ *
+ * Note that kset_find_obj increments device's reference count.
+ */
struct device *device_find(const char *name, struct bus_type *bus)
{
struct kobject *k = kset_find_obj(&bus->devices, name);
diff -Nru a/drivers/pci/hotplug/rpaphp_vio.c b/drivers/pci/hotplug/rpaphp_vio.c
--- a/drivers/pci/hotplug/rpaphp_vio.c 2004-07-03 21:25:37 -05:00
+++ b/drivers/pci/hotplug/rpaphp_vio.c 2004-07-03 21:25:37 -05:00
@@ -86,7 +86,14 @@
}
slot->dev_type = VIO_DEV;
slot->dev.vio_dev = vio_find_node(dn);
- if (!slot->dev.vio_dev)
+ if (slot->dev.vio_dev) {
+ /*
+ * rpaphp is the only owner of vio devices and
+ * does not need extra reference taken by
+ * vio_find_node
+ */
+ put_device(&slot->dev.vio_dev->dev);
+ } else
slot->dev.vio_dev = vio_register_device_node(dn);
if (slot->dev.vio_dev)
slot->state = CONFIGURED;
diff -Nru a/lib/kobject.c b/lib/kobject.c
--- a/lib/kobject.c 2004-07-03 21:25:37 -05:00
+++ b/lib/kobject.c 2004-07-03 21:25:37 -05:00
@@ -537,7 +537,8 @@
* @name: object's name.
*
* Lock kset via @kset->subsys, and iterate over @kset->list,
- * looking for a matching kobject. Return object if found.
+ * looking for a matching kobject. If matching object is found
+ * take a reference and return the object.
*/

struct kobject * kset_find_obj(struct kset * kset, const char * name)
@@ -548,8 +549,8 @@
down_read(&kset->subsys->rwsem);
list_for_each(entry,&kset->list) {
struct kobject * k = to_kobj(entry);
- if (kobject_name(k) && (!strcmp(kobject_name(k),name))) {
- ret = k;
+ if (kobject_name(k) && !strcmp(kobject_name(k),name)) {
+ ret = kobject_get(k);
break;
}
}