From owner-freebsd-arch@FreeBSD.ORG Sun Mar 16 03:21:11 2008 Return-Path: Delivered-To: arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 229EF1065670 for ; Sun, 16 Mar 2008 03:21:11 +0000 (UTC) (envelope-from brde@optusnet.com.au) Received: from mail35.syd.optusnet.com.au (mail35.syd.optusnet.com.au [211.29.133.51]) by mx1.freebsd.org (Postfix) with ESMTP id C0C088FC16 for ; Sun, 16 Mar 2008 03:21:10 +0000 (UTC) (envelope-from brde@optusnet.com.au) Received: from c220-239-252-11.carlnfd3.nsw.optusnet.com.au (c220-239-252-11.carlnfd3.nsw.optusnet.com.au [220.239.252.11]) by mail35.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id m2G3KteC026280 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 16 Mar 2008 14:21:01 +1100 Date: Sun, 16 Mar 2008 14:20:55 +1100 (EST) From: Bruce Evans X-X-Sender: bde@delplex.bde.org To: Kostik Belousov In-Reply-To: <20080315194809.GN10374@deviant.kiev.zoral.com.ua> Message-ID: <20080316133138.J41270@delplex.bde.org> References: <20080315124008.GF80576@hoeg.nl> <20080316015903.N39516@delplex.bde.org> <20080315194809.GN10374@deviant.kiev.zoral.com.ua> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: Ed Schouten , FreeBSD Arch Subject: Re: vgone() calling VOP_CLOSE() -> blocked threads? X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Mar 2008 03:21:11 -0000 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. Bruce