On Wed, Jul 16, 2003 at 10:44:48AM +0200, Gerd Knorr wrote:
> > > Comments?
> > You _have_ to set up a release function for your class device. You
> > can't just kfree it like I think you are doing, otherwise any users of
> > the sysfs files will oops the kernel after the video class device is
> > gone.
> class_device_unregister() is called from video_unregister_device() which
> looks fine to me. Or do you talk about something else?
Heh, yes, that is correct. But then what do you do with the object that
had the class_device in it after class_device_unregister() returns? I
don't see you freeing the device directly, which is good, but who does?
You _have_ to let the structure that the kobject is in free itself in a
release() function, you can't guess at what the kobject reference count
is at any time and just assume you can throw it away at that moment.
LWN did an article about how to do this properly at:
But for some code that does this in a simple manner, look at
drivers/char/tty_io.c, the release_tty_dev() function. It's set up in
the tty_class to handle destroying the structure when the last reference
to the tty_dev structure goes away. Look at the
tty_remove_class_device() to see that the structure isn't kfreed on it's
It looks like the video drivers include a "struct video_device"
structure within their own structures, right? That will have to be
changed to a pointer to that structure in order for the lifetime rules
to work properly. I know Hanna is fighting this same battle with the
input layer right now...
Does this help out?
As an example of why you _have_ to do this, consider a user who opens a
sysfs file of a video device, and then removes the video device from the
system. Then they do a read on the sysfs file. Oops...
> > Other than that, how about exporting the dev_t value for the video
> > device? Then you automatically get udev support, and I don't have to go
> > add it to this code later :)
> Do you have a pointer to sample code for that?
Look at the dev file in /sys/class/tty/*, or in /sys/block/hd* or in
/sys/class/usb/*, and so on...
I need to make a general function to support this to make it easier for
everyone to export a dev_t to userspace, but until then, if you want to
look at the show_dev() function in drivers/usb/core/file.c it shows what
you need to do.
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to firstname.lastname@example.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Wed Jul 23 2003 - 22:00:25 EST