NetBSD/sys/compat/osf1/osf1_resource.c
mrg fcc023545e - add new RLIMIT_AS (aka RLIMIT_VMEM) resource that limits the total
address space available to processes.  this limit exists in most other
modern unix variants, and like most of them, our defaults are unlimited.
remove the old mmap / rlimit.datasize hack.

- adds the VMCMD_STACK flag to all the stack-creation vmcmd callers.
it is currently unused, but was added a few years ago.

- add a pair of new process size values to kinfo_proc2{}. one is the
total size of the process memory map, and the other is the total size
adjusted for unused stack space (since most processes have a lot of
this...)

- patch sh, and csh to notice RLIMIT_AS.  (in some cases, the alias
RLIMIT_VMEM was already present and used if availble.)

- patch ps, top and systat to notice the new k_vm_vsize member of
kinfo_proc2{}.

- update irix, svr4, svr4_32, linux and osf1 emulations to support
this information.  (freebsd could be done, but that it's best left
as part of the full-update of compat/freebsd.)


this addresses PR 7897.  it also gives correct memory usage values,
which have never been entirely correct (since mmap), and have been
very incorrect since jemalloc() was enabled.

tested on i386 and sparc64, build tested on several other platforms.

thanks to many folks for feedback and testing but most espcially
chuq and yamt for critical suggestions that lead to this patch not
having a special ugliness i wasn't happy with anyway :-)
2009-03-29 01:02:48 +00:00

158 lines
4.4 KiB
C

/* $NetBSD: osf1_resource.c,v 1.14 2009/03/29 01:02:50 mrg Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Christopher G. Demetriou
* for the NetBSD Project.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: osf1_resource.c,v 1.14 2009/03/29 01:02:50 mrg Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/mount.h>
#include <sys/syscallargs.h>
#include <sys/resource.h>
#include <sys/resourcevar.h>
#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
#include <compat/osf1/osf1_cvt.h>
int
osf1_sys_getrlimit(struct lwp *l, const struct osf1_sys_getrlimit_args *uap, register_t *retval)
{
struct sys_getrlimit_args a;
switch (SCARG(uap, which)) {
case OSF1_RLIMIT_CPU:
SCARG(&a, which) = RLIMIT_CPU;
break;
case OSF1_RLIMIT_FSIZE:
SCARG(&a, which) = RLIMIT_FSIZE;
break;
case OSF1_RLIMIT_DATA:
SCARG(&a, which) = RLIMIT_DATA;
break;
case OSF1_RLIMIT_STACK:
SCARG(&a, which) = RLIMIT_STACK;
break;
case OSF1_RLIMIT_CORE:
SCARG(&a, which) = RLIMIT_CORE;
break;
case OSF1_RLIMIT_RSS:
SCARG(&a, which) = RLIMIT_RSS;
break;
case OSF1_RLIMIT_NOFILE:
SCARG(&a, which) = RLIMIT_NOFILE;
break;
case OSF1_RLIMIT_AS:
SCARG(&a, which) = RLIMIT_AS;
break;
default:
return (EINVAL);
}
/* XXX should translate */
SCARG(&a, rlp) = SCARG(uap, rlp);
return sys_getrlimit(l, &a, retval);
}
int
osf1_sys_getrusage(struct lwp *l, const struct osf1_sys_getrusage_args *uap, register_t *retval)
{
struct osf1_rusage osf1_rusage;
struct rusage ru;
struct proc *p = l->l_proc;
switch (SCARG(uap, who)) {
case OSF1_RUSAGE_SELF:
mutex_enter(p->p_lock);
ru = p->p_stats->p_ru;
calcru(p, &ru.ru_utime, &ru.ru_stime, NULL, NULL);
rulwps(p, &ru);
mutex_exit(p->p_lock);
break;
case OSF1_RUSAGE_CHILDREN:
ru = p->p_stats->p_cru;
break;
case OSF1_RUSAGE_THREAD: /* XXX not supported */
default:
return (EINVAL);
}
osf1_cvt_rusage_from_native(&ru, &osf1_rusage);
return copyout(&osf1_rusage, SCARG(uap, rusage), sizeof osf1_rusage);
}
int
osf1_sys_setrlimit(struct lwp *l, const struct osf1_sys_setrlimit_args *uap, register_t *retval)
{
struct sys_setrlimit_args a;
switch (SCARG(uap, which)) {
case OSF1_RLIMIT_CPU:
SCARG(&a, which) = RLIMIT_CPU;
break;
case OSF1_RLIMIT_FSIZE:
SCARG(&a, which) = RLIMIT_FSIZE;
break;
case OSF1_RLIMIT_DATA:
SCARG(&a, which) = RLIMIT_DATA;
break;
case OSF1_RLIMIT_STACK:
SCARG(&a, which) = RLIMIT_STACK;
break;
case OSF1_RLIMIT_CORE:
SCARG(&a, which) = RLIMIT_CORE;
break;
case OSF1_RLIMIT_RSS:
SCARG(&a, which) = RLIMIT_RSS;
break;
case OSF1_RLIMIT_NOFILE:
SCARG(&a, which) = RLIMIT_NOFILE;
break;
case OSF1_RLIMIT_AS:
SCARG(&a, which) = RLIMIT_AS;
break;
default:
return (EINVAL);
}
/* XXX should translate */
SCARG(&a, rlp) = SCARG(uap, rlp);
return sys_setrlimit(l, &a, retval);
}