Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Mar 2008 13:47:59 +0100
From:      Ed Schouten <ed@80386.nl>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        Kostik Belousov <kostikbel@gmail.com>, FreeBSD Arch <arch@freebsd.org>
Subject:   Re: vgone() calling VOP_CLOSE() -> blocked threads?
Message-ID:  <20080319124759.GB51074@hoeg.nl>
In-Reply-To: <20080316133138.J41270@delplex.bde.org>
References:  <20080315124008.GF80576@hoeg.nl> <20080316015903.N39516@delplex.bde.org> <20080315194809.GN10374@deviant.kiev.zoral.com.ua> <20080316133138.J41270@delplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--yNb1oOkm5a9FJOVX
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hello Bruce,

* Bruce Evans <brde@optusnet.com.au> wrote:
> On Sat, 15 Mar 2008, Kostik Belousov wrote:
>
>> On Sun, Mar 16, 2008 at 03:55:18AM +1100, Bruce Evans wrote:
>>> Other problems near here:
>>> - neither vfs nor drivers currently know how many threads are in a
>>>   driver.  vfs uses vp->v_rdev->si_usecount, but this doesn't quite work
>> This is provided by si_threadcount.
>> See the dev(vn)_refthread and it usage in the devfs vnops and fops.
>
> So why doesn't reovoke() use it? :-).  All uses of si_usecount, which
> normally happen via vcount() and count_dev(), are suspect, especially
> the latter.
>
> vcount() is only used in revoke(), in svr4_fcntl.c to handle another
> revoke(), and for FreeBSD < 6 in reiserfs for an old multiple-mount
> check.
>
> count_dev() is only used in ata-tape.c (to decide in the same broken
> way as vfs if a close is the last one -- this driver uses D_TRACKCLOSE
> to get d_close() called on all closes.  This gives it the burden of
> deciding whether the close is the last one, and it can't do this any
> better than vfs.  D_TRACKCLOSE is used in a few other drivers which
> don't call count_dev()), in devfs_close() (to decide whether to release
> the controlling terminal and to decide when to call d_close()).
>
> Hmm, it seems to be not vfs but only devfs which handles last-close
> specially.  devfs is closer to devices, so it should know how to use
> si_threadcount here.  Hopefully si_threadcount counts threads sleeping
> in open or close, although si_usecount doesn't.  d_close (or something)
> should be called to wake up these threads even if si_usecount is 0.
> Drivers which support sleeping in open or close must support d_close
> (or something) being called to forcibly end such sleeps.  revoke()
> should forcibly end such sleeps, so it needs to check si_threadcount
> too.  si_usecount in its current form might end up being unused, so
> si_threadcount could be renamed back to it.

I just changed my TTY code to perform some garbage collecting on TTY's.
It now only performs a device cleanup when si_threadcount =3D=3D 1 and
TF_OPENED is unset. Unfortunately, I'm checking for these conditions in
all the cdev ops, which is quite expensive.

It does the trick, but if someone has a better idea, I'm willing to
implement it.

Thanks!

--=20
 Ed Schouten <ed@80386.nl>
 WWW: http://g-rave.nl/

--yNb1oOkm5a9FJOVX
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (FreeBSD)

iEYEARECAAYFAkfhC38ACgkQ52SDGA2eCwWzhQCZAfkFEA+m0cZVS4782P9Bwnot
r3YAn3oGxzHPffeV0t+wxKHzTuGIdcSh
=XhOz
-----END PGP SIGNATURE-----

--yNb1oOkm5a9FJOVX--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080319124759.GB51074>