Skip site navigation (1)Skip section navigation (2)
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>