device driver: cdesw questions?

Kostik Belousov kostikbel at gmail.com
Wed Jan 21 05:55:21 PST 2009


On Wed, Jan 21, 2009 at 03:40:24PM +0200, Andriy Gapon wrote:
> on 21/01/2009 15:35 Kostik Belousov said the following:
> > On Wed, Jan 21, 2009 at 01:20:51PM +0200, Andriy Gapon wrote:
> >> Question 1:
> >> I am writing a driver that would use per-open private data (among other
> >> features).
> >> Do I have to use D_TRACKCLOSE flag in this case?
> > No, the dtr registered with devfs_set_cdevpriv(), is called exactly once
> > when the last close is performed, or the device is destroyed.
> 
> Kostik,
> 
> thanks a lot for the explanation!
> I am still a little bit confused about the term "last close" - what is
> it? I.e. I'd like to get an answer to the below question.
> 
> >> In general I am a little bit confused about when d_close is invoked.
> >> Supposing D_TRACKCLOSE is not set and multiple programs concurrently
> >> open, use and close a device - when d_close is called - when one program
> >> closes its last descriptor tied to the device or when the system-wide
> >> last such descriptor is closed?

The kernel data structures for the opened device are as follows:

filedesc ---> struct file ---> vnode ---> cdev
	    [cdevpriv]	 \               /      
			  --------->-----

Each -> arrow represents a "many to one" relation. There may be zero
or one cdevpriv datum associated with struct file.

cdev maintains the si_usecount, that is an accumulation of the vref
counters for all devfs vnodes that are attached to the cdev.
devfs_close() vop is called when the struct file is released.
When D_TRACKCLOSE is specified, d_close driver method will be
called unconditionally.
When D_TRACKCLOSE is not specified, d_close is called when si_usecount
is exactly 1, to become zero after the last close of the file that
opened a vnode referencing cdev.
Also, d_close() is called if the vnode is being reclaimed. Possible
causes are revoke(2) call or forced devfs mp unmount. This interferes
with close counting.

cdevpriv dtr is called when either struct file is released, or
device is destroyed by the destroy_dev().
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20090121/bbaa9af2/attachment.pgp


More information about the freebsd-hackers mailing list