device driver: cdesw questions?

Andriy Gapon avg at icyb.net.ua
Wed Jan 21 06:08:01 PST 2009


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?


-- 
Andriy Gapon


More information about the freebsd-hackers mailing list