Date: Sat, 10 Feb 1996 15:19:44 -0700 (MST) From: Terry Lambert <terry@lambert.org> To: nwestfal@Vorlon.odc.net (Neal Westfall) Cc: hackers@FreeBSD.org Subject: Re: can't free vnode Message-ID: <199602102219.PAA16797@phaeton.artisoft.com> In-Reply-To: <199602102055.MAA07072@Vorlon.odc.net> from "Neal Westfall" at Feb 10, 96 12:55:32 pm
next in thread | previous in thread | raw e-mail | index | archive | help
> I have a news server here running FreeBSD-stable and INN 1.4-unoff and I
> am having a consistent problem of kernel panics. The reason for the
> panic is usually something to the effect of "can't free vnode; free vnode
> isn't".
>
> This has been a problem ever since we first installed FreeBSD 2.0.5 on
> the machine and we have tried upgrading everything, even to the point
> of downloading the src tree for -stable and all the ctm deltas and
> running a make world. All to no avail, we still have the same
> problems as before.
[ ... ]
> We have heard that FreeBSD is a more appropriate operating system
> for a news server than Linux because of performance and stability
> issues. However, if we can't figure out what is causing these
> problems, we will have to switch to Linux because this occurs
> almost every day.
>
> Any help is appreciated.
There are two occasions when this happens; the first is in a very low
RAM condition when you fill up swap. The fix is to add more swap.
The second is when numvnodes == desiredvnodes and a vgone occurs
when a recursive lock is held and you get a page fault for the same
vnode in the middle of a read or a write.
This is actually an endemic problem in the use if the ihash code
itself. The fix is to change the vp lock operation to a counting
semaphore, and either move the directory cache code up above the
lookup instead of doing it per FS (and treat a cache refrence as
a reference count), or to actually get rid of the ihash abstraction
entirely (some non-trival VM cache index changes are necessary).
The easiest workaround for now is to make sure you have sufficient
free vnodes by jacking up the desiredvnodes.
A less easy workaround would be to call VOP_ISLOCKED() on the vp in
vrele() in /sys/kern/vfs_subr.c, and if it is, go to sleep on the
address until it isn't. This would be something like:
while( VOP_ISLOCKED(vp)) {
(void) tsleep( (caddr_t)vp->v_data, PINOD, "vfslk", 0);
}
This is gross, but works because vp->v_data is the same address as the
inode that VOP_UNLOCK(vp) calls the wakeup on in the FS's that use the
recursion semantics for potential dissociation of the vnode from the
underlying FS (see the vclean() comments in vfs_subr.c)... the address
of the per FS inode data.
Terry Lambert
terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199602102219.PAA16797>
