Date: Tue, 22 May 2001 01:32:16 -0400 From: "Brian F. Feldman" <green@FreeBSD.ORG> To: Matt Dillon <dillon@earth.backplane.com> Cc: hackers@FreeBSD.ORG Subject: Re: vmspace leak (+ tentative fix) Message-ID: <200105220532.f4M5WGF13507@green.bikeshed.org> In-Reply-To: Message from Matt Dillon <dillon@earth.backplane.com> of "Mon, 21 May 2001 11:12:05 PDT." <200105211812.f4LIC5t03635@earth.backplane.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Matt Dillon <dillon@earth.backplane.com> wrote:
> This could explain a few bug reports I've had over the years in regards
> to systems leaking swap space. Good find!
>
> Hmmm. May I suggest an alternative?
>
> * Keep the part that changes vm->vm_refcnt == 1 to
> --vm->vm_refcnt == 0 when checking whether to free
> the underlying resources or not. This introduces one
> extra ref count decrement.
>
> * Instead of breaking out the vmspace freeing code or adding
> any check fields, simply change the way vmspace_free() operates
> so instead of checking --vm->vm_refcnt == 0, it instead checks
> for vm->vm_refcnt == -1.
That sounds like a perfectly good way to do it. When I was thinking of just
doing that simple solution, I for some reason dismissed it immediately
because I didn't like the idea of the refcnt being anything < 0. However,
as a less complex solution, it should likely be fine.
> Old vmspace_free() code:
>
> if (vm->vm_refcnt == 0)
> panic(...)
>
> if (--vm->vm_refcnt == 0) {
> ...
> }
>
> Suggested fix (pseudo code / incomplete):
>
> /*
> * One extra refcnt decrement occurs before freeing. The
> * process that takes responsibility for releasing the
> * vmspace resources decrements refcnt to 0, then the vmspace
> * is further decremented when released from cpu_wait().
> */
> if (vm->vm_refcnt <= -1)
> panic(...)
>
> if (--vm->vm_refcnt == -1) {
> ...
> }
Well, it doesn't particularly matter on whose behalf specifically the
vmspace is freed, only that it's one and only one time... As long as the
access here to vm->vm_refcnt is locked (it was by Giant the last time I had
looked...), I suppose this could easily be the simplest solution. It still
feels a tiny bit hackish that the refcnt should go negative, but the
behavior you propose seems correct.
Now, just to decide if it's ncessary having a separate vmspace_exitfree() to
separate the two... I don't think it should be now, but I'll need to review
the current vmspace_free() callers to make sure.
> You might have to make other adjustments in the codebase, since there
> are a couple of other places where vm_refcnt is used
> (fgrep vm_refcnt */*.c). This is only a suggestion. I have not
> tested it in any way. We use a similar trick for the vnode ref count.
From a casual perusal, I don't really see where this kind of behavior is
implemented wrt vput()/vrele().
> I would be happy to review and test your final solution.
Wunderbar =)
--
Brian Fundakowski Feldman \ FreeBSD: The Power to Serve! /
green@FreeBSD.org `------------------------------'
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105220532.f4M5WGF13507>
