Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 04 Mar 2004 16:21:29 -0800
From:      Cy Schubert <Cy.Schubert@komquats.com>
To:        Don Lewis <truckman@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: sysctl spinning (was: Re: ps Causes Hard Hang) 
Message-ID:  <200403050021.i250LU0f015396@cwsys.cwsent.com>
In-Reply-To: Your message of "Thu, 04 Mar 2004 13:42:28 PST." <200403042142.i24LgS7E005323@gw.catspoiler.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
In message <200403042142.i24LgS7E005323@gw.catspoiler.org>, Don Lewis 
writes:
> On  5 Mar, Bruce Evans wrote:
> > On Thu, 4 Mar 2004, Don Lewis wrote:
> > 
> >> I just checked the mlock() man page in the Single UNIX Specification
> >> Version 3.  Our mlock() implementation is broken.  We should be
> >> returning ENOMEM here, though this will result in some sort of user
> >> visible sysctl breakage instead of a tight loop.
> > 
> > POSIX is more authoritative.  It says that ENOMEM may be returned if
> > an implementation-defined limit would be exceeded, and that EAGAIN
> > shall be returned if some or all of the memory could not be locked
> > when the call was made.  So it literally requires returning EAGAIN
> > even when the limit would be exceeded, but it doesn't mean to require
> > that.
> 
> That's the same as SUSv3.
> 
> I was pretty frazzled when I sent my previous message and was thinking
> the test was something like:
> 	if (atop(size) > vm_page_max_wired)
> 
> The following patch is probably better.
> 
> Index: sys/vm/vm_mmap.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/vm/vm_mmap.c,v
> retrieving revision 1.181
> diff -u -r1.181 vm_mmap.c
> --- sys/vm/vm_mmap.c	1 Mar 2004 02:44:33 -0000	1.181
> +++ sys/vm/vm_mmap.c	4 Mar 2004 21:24:29 -0000
> @@ -923,8 +923,8 @@
>  	if (addr + size < addr)
>  		return (EINVAL);
>  
> -	if (atop(size) + cnt.v_wire_count > vm_page_max_wired)
> -		return (EAGAIN);
> +	if (atop(size) > vm_page_max_wired)
> +		return (ENOMEM);
>  
>  	PROC_LOCK(proc);
>  	if (size + ptoa(pmap_wired_count(vm_map_pmap(&proc->p_vmspace->vm_map))
> ) >
> @@ -933,6 +933,9 @@
>  		return (ENOMEM);
>  	}
>  	PROC_UNLOCK(proc);
> +
> +	if (atop(size) + cnt.v_wire_count > vm_page_max_wired)
> +		return (EAGAIN);
>  
>  	error = vm_map_wire(&proc->p_vmspace->vm_map, addr,
>  		     addr + size, VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES);
> 

I'll give this a try tonight after my buildworld completes. I'll keep you 
posted.


Cheers,
--
Cy Schubert <Cy.Schubert@komquats.com>        http://www.komquats.com/
BC Government                     .                       FreeBSD UNIX
Cy.Schubert@osg.gov.bc.ca         .                     cy@FreeBSD.org
http://www.gov.bc.ca/             .            http://www.FreeBSD.org/




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