device driver: cdesw questions?

Kostik Belousov kostikbel at gmail.com
Wed Jan 21 06:14:08 PST 2009


On Wed, Jan 21, 2009 at 04:07:54PM +0200, Andriy Gapon wrote:
> on 21/01/2009 15:55 Kostik Belousov said the following:
> > 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().
> 
> Kostik,
> 
> is the following true: if D_TRACKCLOSE is specified then a number of
> d_close() calls and a number of cdevpriv dtr calls are equal (provide
> each file gets cdevpriv data) ?
> If not, what is the case where one is called but not the other?

No, I already described this. See the note about vnode reclamation.
Also, d_close counter would have an interacation with destroy_dev().

To give you short summary, for D_TRACKCLOSE, d_close() may be called
less times then dtr.
-------------- 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/5b8f7de0/attachment.pgp


More information about the freebsd-hackers mailing list