All of lore.kernel.org
 help / color / mirror / Atom feed
* kobj_to_dev ?
@ 2004-01-16 23:32 Hollis Blanchard
  2004-01-17  0:17 ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Hollis Blanchard @ 2004-01-16 23:32 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel

Hi Greg, could this be added to device.h:

--- 1.112/include/linux/device.h        Wed Jan  7 23:58:16 2004
+++ edited/include/linux/device.h       Fri Jan 16 17:35:04 2004
@@ -279,6 +279,8 @@
         void    (*release)(struct device * dev);
  };

+#define kobj_to_dev(k) container_of((k), struct device, kobj)
+
  static inline struct device *
  list_to_dev(struct list_head *node)
  {

I'm using it as the following (inspired by find_bus), and it seems like 
it would make sense to put in device.h.

struct vio_dev *vio_find_device(const char *name)
{
	struct kobject *kobj;

	kobj = kset_find_obj(&vio_bus_type.devices, name);
	if (!kobj)
		return NULL;

	return to_vio_dev(kobj_to_dev(kobj));
}

As a side node, since those #defines don't to type-checking, would it 
make sense to name them with both types? E.g. "kobj_to_dev" instead of 
just "to_dev"?

-- 
Hollis Blanchard
IBM Linux Technology Center


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

* Re: kobj_to_dev ?
  2004-01-16 23:32 kobj_to_dev ? Hollis Blanchard
@ 2004-01-17  0:17 ` Greg KH
  2004-01-19 20:26   ` Hollis Blanchard
  0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2004-01-17  0:17 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: Greg KH, linux-kernel

On Fri, Jan 16, 2004 at 05:32:29PM -0600, Hollis Blanchard wrote:
> Hi Greg, could this be added to device.h:
> 
> --- 1.112/include/linux/device.h        Wed Jan  7 23:58:16 2004
> +++ edited/include/linux/device.h       Fri Jan 16 17:35:04 2004
> @@ -279,6 +279,8 @@
>         void    (*release)(struct device * dev);
>  };
> 
> +#define kobj_to_dev(k) container_of((k), struct device, kobj)
> +
>  static inline struct device *
>  list_to_dev(struct list_head *node)
>  {
> 
> I'm using it as the following (inspired by find_bus), and it seems like 
> it would make sense to put in device.h.

How about just adding a find_device() function to the driver core, where
you pass in a name and a type, so that others can use it?

> As a side node, since those #defines don't to type-checking, would it 
> make sense to name them with both types? E.g. "kobj_to_dev" instead of 
> just "to_dev"?

The compiler does the typechecking for you :)

thanks,

greg k-h

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

* Re: kobj_to_dev ?
  2004-01-17  0:17 ` Greg KH
@ 2004-01-19 20:26   ` Hollis Blanchard
  2004-01-20  0:04     ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Hollis Blanchard @ 2004-01-19 20:26 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel

Greg KH wrote:
> 
> How about just adding a find_device() function to the driver core, where
> you pass in a name and a type, so that others can use it?

Something like this?

===== include/linux/device.h 1.111 vs edited =====
--- 1.111/include/linux/device.h        Mon Dec 29 15:38:10 2003
+++ edited/include/linux/device.h       Mon Jan 19 14:25:26 2004
@@ -354,6 +354,7 @@
   */
  extern struct device * get_device(struct device * dev);
  extern void put_device(struct device * dev);
+extern struct device *find_device(const char *name, struct bus_type *bus);


  /* drivers/base/platform.c */
===== drivers/base/core.c 1.78 vs edited =====
--- 1.78/drivers/base/core.c    Mon Sep 29 16:20:44 2003
+++ edited/drivers/base/core.c  Mon Jan 19 14:33:42 2004
@@ -400,6 +400,14 @@
         return error;
  }

+struct device *find_device(const char *name, struct bus_type *bus)
+{
+       struct kobject *k = kset_find_obj(&bus->devices, name);
+       if (k)
+               return to_dev(k);
+       return NULL;
+}
+
  int __init devices_init(void)
  {
         return subsystem_register(&devices_subsys);
@@ -416,6 +424,7 @@
  EXPORT_SYMBOL(device_unregister_wait);
  EXPORT_SYMBOL(get_device);
  EXPORT_SYMBOL(put_device);
+EXPORT_SYMBOL(find_device);

  EXPORT_SYMBOL(device_create_file);
  EXPORT_SYMBOL(device_remove_file);


-- 
Hollis Blanchard
IBM Linux Technology Center

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

* Re: kobj_to_dev ?
  2004-01-19 20:26   ` Hollis Blanchard
@ 2004-01-20  0:04     ` Greg KH
  2004-01-20  0:25       ` Hollis Blanchard
  0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2004-01-20  0:04 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: linux-kernel

On Mon, Jan 19, 2004 at 02:26:47PM -0600, Hollis Blanchard wrote:
> Greg KH wrote:
> >
> >How about just adding a find_device() function to the driver core, where
> >you pass in a name and a type, so that others can use it?
> 
> Something like this?

Very nice, yes.  But I'll rename it to device_find() to keep the
namespace sane.  Sound ok?

thanks,

greg k-h

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

* Re: kobj_to_dev ?
  2004-01-20  0:04     ` Greg KH
@ 2004-01-20  0:25       ` Hollis Blanchard
  2004-01-20  0:53         ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Hollis Blanchard @ 2004-01-20  0:25 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel


On Jan 19, 2004, at 6:04 PM, Greg KH wrote:

> On Mon, Jan 19, 2004 at 02:26:47PM -0600, Hollis Blanchard wrote:
>> Greg KH wrote:
>>>
>>> How about just adding a find_device() function to the driver core, 
>>> where
>>> you pass in a name and a type, so that others can use it?
>>
>> Something like this?
>
> Very nice, yes.  But I'll rename it to device_find() to keep the
> namespace sane.  Sound ok?

Sure. I'm having a problem inside kset_find_obj() when actually using 
it though, and I'm not sure if it's my fault or not. It seems there are 
kobjects present for which kobject_name() returns NULL.

kset_find_obj:
	list_for_each(entry,&kset->list) {
		struct kobject * k = to_kobj(entry);
		if (!strcmp(kobject_name(k),name)) {
			ret = k;
			break;
		}
	}

where "kset" above is "&my_bus_type.devices". strcmp doesn't like NULL 
and panics. I've registered 11 devices in my_bus_type, and all of them 
have names (device_add() makes sure of that).

Does this sound like my fault?

-- 
Hollis Blanchard
IBM Linux Technology Center


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

* Re: kobj_to_dev ?
  2004-01-20  0:25       ` Hollis Blanchard
@ 2004-01-20  0:53         ` Greg KH
  2004-01-20  3:18           ` Hollis Blanchard
  0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2004-01-20  0:53 UTC (permalink / raw)
  To: Hollis Blanchard; +Cc: linux-kernel

On Mon, Jan 19, 2004 at 06:25:14PM -0600, Hollis Blanchard wrote:
> 
> On Jan 19, 2004, at 6:04 PM, Greg KH wrote:
> 
> >On Mon, Jan 19, 2004 at 02:26:47PM -0600, Hollis Blanchard wrote:
> >>Greg KH wrote:
> >>>
> >>>How about just adding a find_device() function to the driver core, 
> >>>where
> >>>you pass in a name and a type, so that others can use it?
> >>
> >>Something like this?
> >
> >Very nice, yes.  But I'll rename it to device_find() to keep the
> >namespace sane.  Sound ok?
> 
> Sure. I'm having a problem inside kset_find_obj() when actually using 
> it though, and I'm not sure if it's my fault or not. It seems there are 
> kobjects present for which kobject_name() returns NULL.

Hm, we should probably fix that oops up too.  I'll go do that.

> kset_find_obj:
> 	list_for_each(entry,&kset->list) {
> 		struct kobject * k = to_kobj(entry);
> 		if (!strcmp(kobject_name(k),name)) {
> 			ret = k;
> 			break;
> 		}
> 	}
> 
> where "kset" above is "&my_bus_type.devices". strcmp doesn't like NULL 
> and panics. I've registered 11 devices in my_bus_type, and all of them 
> have names (device_add() makes sure of that).
> 
> Does this sound like my fault?

I don't know.  If you enable debugging for kobjects (in kobject.c) do
you see any kobjects getting added to your bus with no name?

thanks,

greg k-h

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

* Re: kobj_to_dev ?
  2004-01-20  0:53         ` Greg KH
@ 2004-01-20  3:18           ` Hollis Blanchard
  0 siblings, 0 replies; 7+ messages in thread
From: Hollis Blanchard @ 2004-01-20  3:18 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-kernel

On Jan 19, 2004, at 6:53 PM, Greg KH wrote:

 > I don't know.  If you enable debugging for kobjects (in kobject.c) do
 > you see any kobjects getting added to your bus with no name?

Sigh, that took too long.

c000000001d29828 -- address of the struct device I register
c000000001d29818 -- address present in vio_bus_type.devices.list

I think the problem is that bus_add_device() adds a struct device to 
bus_type.devices.list, but that's a a kset! So it contains a list of 
kobjects, not devices. The obvious fix doesn't work because 
driver_attach() got it wrong too. However it seems bus_for_each_dev() 
got it right.

This patch compiles but I haven't tested the driver_attach() part yet. 
Oh also to_dev is different in bus.c than in core.c, so I don't think it 
will work here. I'm going home... I have a vague feeling that some other 
language might work better for all this list stuff..

-- 
Hollis Blanchard
IBM Linux Technology Center

===== drivers/base/bus.c 1.52 vs edited =====
--- 1.52/drivers/base/bus.c     Tue Sep 30 10:59:35 2003
+++ edited/drivers/base/bus.c   Mon Jan 19 21:19:18 2004
@@ -337,7 +337,12 @@
                 return;

         list_for_each(entry,&bus->devices.list) {
-               struct device * dev = container_of(entry,struct 
device,bus_list);
+               struct kobject * kobj = container_of(entry,struct 
kobject,entry);
+               struct device * dev;
+
+               if (!kobj)
+                       return;
+               dev = container_of(kobj,struct device,kobj);
                 if (!dev->driver) {
                         error = bus_match(dev,drv);
                         if (error && (error != -ENODEV))
@@ -405,7 +410,7 @@
         if (bus) {
                 down_write(&dev->bus->subsys.rwsem);
                 pr_debug("bus %s: add device %s\n",bus->name,dev->bus_id);
-               list_add_tail(&dev->bus_list,&dev->bus->devices.list);
+               list_add_tail(&dev->kobj.entry,&dev->bus->devices.list);
                 device_attach(dev);
                 up_write(&dev->bus->subsys.rwsem);
 
sysfs_create_link(&bus->devices.kobj,&dev->kobj,dev->bus_id);


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

end of thread, other threads:[~2004-01-20  3:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-01-16 23:32 kobj_to_dev ? Hollis Blanchard
2004-01-17  0:17 ` Greg KH
2004-01-19 20:26   ` Hollis Blanchard
2004-01-20  0:04     ` Greg KH
2004-01-20  0:25       ` Hollis Blanchard
2004-01-20  0:53         ` Greg KH
2004-01-20  3:18           ` Hollis Blanchard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.