From owner-freebsd-hackers@FreeBSD.ORG Wed Jan 21 13:55:15 2009 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D1111106568F for ; Wed, 21 Jan 2009 13:55:15 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.terabit.net.ua (mail.terabit.net.ua [195.137.202.147]) by mx1.freebsd.org (Postfix) with ESMTP id 710278FC30 for ; Wed, 21 Jan 2009 13:55:15 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from skuns.zoral.com.ua ([91.193.166.194] helo=mail.zoral.com.ua) by mail.terabit.net.ua with esmtps (TLSv1:AES256-SHA:256) (Exim 4.63 (FreeBSD)) (envelope-from ) id 1LPdY1-00096l-Ma; Wed, 21 Jan 2009 15:55:13 +0200 Received: from deviant.kiev.zoral.com.ua (root@deviant.kiev.zoral.com.ua [10.1.1.148]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id n0LDtAmw010184 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 21 Jan 2009 15:55:10 +0200 (EET) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.3/8.14.3) with ESMTP id n0LDtAOX012964; Wed, 21 Jan 2009 15:55:10 +0200 (EET) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.3/8.14.3/Submit) id n0LDtAGG012963; Wed, 21 Jan 2009 15:55:10 +0200 (EET) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Wed, 21 Jan 2009 15:55:10 +0200 From: Kostik Belousov To: Andriy Gapon Message-ID: <20090121135510.GL58517@deviant.kiev.zoral.com.ua> References: <49770513.8090203@icyb.net.ua> <20090121133520.GK58517@deviant.kiev.zoral.com.ua> <497725C8.4010101@icyb.net.ua> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="XRwESHC7KXlqFpSs" Content-Disposition: inline In-Reply-To: <497725C8.4010101@icyb.net.ua> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.4 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua X-Virus-Scanned: mail.terabit.net.ua 1LPdY1-00096l-Ma 7b2b9b149c763bf614376891bcc6db09 X-Terabit: YES Cc: freebsd-hackers@freebsd.org Subject: Re: device driver: cdesw questions? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jan 2009 13:55:21 -0000 --XRwESHC7KXlqFpSs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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. >=20 > Kostik, >=20 > 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. >=20 > >> 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 progr= am > >> 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] \ / =20 --------->----- 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(). --XRwESHC7KXlqFpSs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEARECAAYFAkl3KT0ACgkQC3+MBN1Mb4jR6QCeNk+fmzMnXWS1B7dOZdNqXWJ7 cZYAoN5qGFKNOtzlKiqA4S5AQJn2Bod8 =EUOr -----END PGP SIGNATURE----- --XRwESHC7KXlqFpSs--