Messages in this thread | | | Date | Fri, 3 Feb 2006 09:08:46 -0800 | From | Greg KH <> | Subject | Re: [QUESTION/sysfs] strange refcounting |
| |
On Fri, Feb 03, 2006 at 05:16:22PM +0300, Artem B. Bityutskiy wrote: > Hello folks, > > I'm writing a simple device driver and want to expose some of its > attributes to userspace via sysfs. > > As usually, I have main device description structure "struct > mydev_info". I've embedded a struct device object there. What I do is: > > struct mydev_info mydev > { > struct device *dev;
First off, this should not be a pointer, but rather: struct device dev;
That properly embedds the struct device into your object.
> ... bla bla bla ... > } mydev; > > > mydev->dev=kzalloc(sizeof(struct device), GFP_KERNEL); > mydev->dev->bus_id = "mydev"; > mydev->dev->release = mydev_release; > err = device_register(&mydev->dev);
What type of bus does this device live on? You should not be calling device_register() on your own directly. Either use a bus, and be a device of it, or use the platform_device() interface.
> Then, I see /sys/devices/mydev/ in sysfs. I open pre-defined > /sys/devices/mydev/power/state in userspace and don't close it. > > Then I run lsmod, and see zero refcount to my module. Well, I run rmmod > mymod, module is unloaded.
Yup.
> Then I close /sys/devices/mydev/power/state, and enjoy segfault.
What is the backtrace?
> I thought sysfs subsystem have to increase module refcount when one > opens its sysfs files. Well, there is a release function, but it is also > unloaded with the module.
Again, register with a bus or use the platform_device() interface, and this should work properly.
> May be there is a problem because of I have mydev->dev->parent == NULL, > mydev->dev->bus == NULL, mydev->dev->driver == NULL? But I really don't > have any bus, any parent and I don't want to introduce struct > device_driver ...
Yes, you kind of need all of that :)
Make the above changes and let us know if that helps things.
thanks,
greg k-h - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |