Module Name:    src
Committed By:   mrg
Date:           Sun Mar 29 01:02:51 UTC 2009

Modified Files:
        src/bin/csh: csh.1 func.c
        src/bin/ps: print.c ps.c
        src/bin/sh: miscbltin.c sh.1
        src/external/bsd/top/dist/machine: m_netbsd.c
        src/lib/libkvm: kvm_proc.c
        src/sys/arch/mips/mips: cpu_exec.c
        src/sys/compat/darwin: darwin_exec.c
        src/sys/compat/ibcs2: ibcs2_exec.c
        src/sys/compat/irix: irix_resource.c
        src/sys/compat/linux/arch/amd64: linux_exec_machdep.c
        src/sys/compat/linux/arch/i386: linux_exec_machdep.c
        src/sys/compat/linux/common: linux_limit.h
        src/sys/compat/osf1: osf1_resource.c
        src/sys/compat/svr4: svr4_resource.c
        src/sys/compat/svr4_32: svr4_32_resource.c
        src/sys/kern: exec_subr.c init_sysctl.c kern_exec.c kern_resource.c
        src/sys/sys: resource.h sysctl.h
        src/sys/uvm: uvm_extern.h uvm_glue.c uvm_mmap.c
        src/usr.bin/systat: ps.c

Log Message:
- 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 :-)


To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/bin/csh/csh.1
cvs rdiff -u -r1.36 -r1.37 src/bin/csh/func.c
cvs rdiff -u -r1.110 -r1.111 src/bin/ps/print.c
cvs rdiff -u -r1.73 -r1.74 src/bin/ps/ps.c
cvs rdiff -u -r1.37 -r1.38 src/bin/sh/miscbltin.c
cvs rdiff -u -r1.91 -r1.92 src/bin/sh/sh.1
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/top/dist/machine/m_netbsd.c
cvs rdiff -u -r1.81 -r1.82 src/lib/libkvm/kvm_proc.c
cvs rdiff -u -r1.54 -r1.55 src/sys/arch/mips/mips/cpu_exec.c
cvs rdiff -u -r1.56 -r1.57 src/sys/compat/darwin/darwin_exec.c
cvs rdiff -u -r1.72 -r1.73 src/sys/compat/ibcs2/ibcs2_exec.c
cvs rdiff -u -r1.14 -r1.15 src/sys/compat/irix/irix_resource.c
cvs rdiff -u -r1.15 -r1.16 \
    src/sys/compat/linux/arch/amd64/linux_exec_machdep.c
cvs rdiff -u -r1.11 -r1.12 \
    src/sys/compat/linux/arch/i386/linux_exec_machdep.c
cvs rdiff -u -r1.4 -r1.5 src/sys/compat/linux/common/linux_limit.h
cvs rdiff -u -r1.13 -r1.14 src/sys/compat/osf1/osf1_resource.c
cvs rdiff -u -r1.17 -r1.18 src/sys/compat/svr4/svr4_resource.c
cvs rdiff -u -r1.16 -r1.17 src/sys/compat/svr4_32/svr4_32_resource.c
cvs rdiff -u -r1.61 -r1.62 src/sys/kern/exec_subr.c
cvs rdiff -u -r1.159 -r1.160 src/sys/kern/init_sysctl.c
cvs rdiff -u -r1.287 -r1.288 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.150 -r1.151 src/sys/kern/kern_resource.c
cvs rdiff -u -r1.30 -r1.31 src/sys/sys/resource.h
cvs rdiff -u -r1.183 -r1.184 src/sys/sys/sysctl.h
cvs rdiff -u -r1.152 -r1.153 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.135 -r1.136 src/sys/uvm/uvm_glue.c
cvs rdiff -u -r1.127 -r1.128 src/sys/uvm/uvm_mmap.c
cvs rdiff -u -r1.31 -r1.32 src/usr.bin/systat/ps.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/bin/csh/csh.1
diff -u src/bin/csh/csh.1:1.45 src/bin/csh/csh.1:1.46
--- src/bin/csh/csh.1:1.45	Fri Mar 13 14:07:54 2009
+++ src/bin/csh/csh.1	Sun Mar 29 01:02:48 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: csh.1,v 1.45 2009/03/13 14:07:54 joerg Exp $
+.\"	$NetBSD: csh.1,v 1.46 2009/03/29 01:02:48 mrg Exp $
 .\"
 .\" Copyright (c) 1980, 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -1431,6 +1431,8 @@
 The maximum number of simultaneous open files for this user id.
 .It Ar sbsize
 The maximum socket buffer size of a process (in bytes).
+.It Ar vmemoryuse
+The maximum size (in bytes) which a process can obtain.
 .El
 .Pp
 The

Index: src/bin/csh/func.c
diff -u src/bin/csh/func.c:1.36 src/bin/csh/func.c:1.37
--- src/bin/csh/func.c:1.36	Sat Sep 15 14:33:05 2007
+++ src/bin/csh/func.c	Sun Mar 29 01:02:48 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.36 2007/09/15 14:33:05 ragge Exp $ */
+/* $NetBSD: func.c,v 1.37 2009/03/29 01:02:48 mrg Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)func.c	8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: func.c,v 1.36 2007/09/15 14:33:05 ragge Exp $");
+__RCSID("$NetBSD: func.c,v 1.37 2009/03/29 01:02:48 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -1106,6 +1106,7 @@
     { RLIMIT_NPROC,	"maxproc",	1,	"" },
     { RLIMIT_NOFILE,	"openfiles",	1,	"" },
     { RLIMIT_SBSIZE,	"sbsize",	1,	"bytes" },
+    { RLIMIT_AS,	"vmemoryuse",	1024,	"kbytes" },
     { -1,		NULL,		0,	NULL }
 };
 

Index: src/bin/ps/print.c
diff -u src/bin/ps/print.c:1.110 src/bin/ps/print.c:1.111
--- src/bin/ps/print.c:1.110	Sat Feb 14 08:04:09 2009
+++ src/bin/ps/print.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: print.c,v 1.110 2009/02/14 08:04:09 lukem Exp $	*/
+/*	$NetBSD: print.c,v 1.111 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*
  * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
 #if 0
 static char sccsid[] = "@(#)print.c	8.6 (Berkeley) 4/16/94";
 #else
-__RCSID("$NetBSD: print.c,v 1.110 2009/02/14 08:04:09 lukem Exp $");
+__RCSID("$NetBSD: print.c,v 1.111 2009/03/29 01:02:49 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -973,8 +973,7 @@
 
 	k = arg;
 	v = ve->var;
-	intprintorsetwidth(v,
-	    pgtok(k->p_vm_dsize + k->p_vm_ssize + k->p_vm_tsize), mode);
+	intprintorsetwidth(v, pgtok(k->p_vm_msize), mode);
 }
 
 void

Index: src/bin/ps/ps.c
diff -u src/bin/ps/ps.c:1.73 src/bin/ps/ps.c:1.74
--- src/bin/ps/ps.c:1.73	Sat Feb 14 08:04:10 2009
+++ src/bin/ps/ps.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ps.c,v 1.73 2009/02/14 08:04:10 lukem Exp $	*/
+/*	$NetBSD: ps.c,v 1.74 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*
  * Copyright (c) 2000-2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
 #if 0
 static char sccsid[] = "@(#)ps.c	8.4 (Berkeley) 4/2/94";
 #else
-__RCSID("$NetBSD: ps.c,v 1.73 2009/02/14 08:04:10 lukem Exp $");
+__RCSID("$NetBSD: ps.c,v 1.74 2009/03/29 01:02:49 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -585,7 +585,7 @@
 	struct varent *ve;
 	const sigset_t *sa, *sb;
 
-#define	V_SIZE(k) (k->p_vm_dsize + k->p_vm_ssize + k->p_vm_tsize)
+#define	V_SIZE(k) ((k)->p_vm_msize)
 #define	RDIFF_N(t, n) \
 	if (((const t *)((const char *)ka + v->off))[n] > ((const t *)((const char *)kb + v->off))[n]) \
 		return 1; \

Index: src/bin/sh/miscbltin.c
diff -u src/bin/sh/miscbltin.c:1.37 src/bin/sh/miscbltin.c:1.38
--- src/bin/sh/miscbltin.c:1.37	Sun Dec 28 19:53:37 2008
+++ src/bin/sh/miscbltin.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: miscbltin.c,v 1.37 2008/12/28 19:53:37 christos Exp $	*/
+/*	$NetBSD: miscbltin.c,v 1.38 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)miscbltin.c	8.4 (Berkeley) 5/4/95";
 #else
-__RCSID("$NetBSD: miscbltin.c,v 1.37 2008/12/28 19:53:37 christos Exp $");
+__RCSID("$NetBSD: miscbltin.c,v 1.38 2009/03/29 01:02:49 mrg Exp $");
 #endif
 #endif /* not lint */
 
@@ -360,7 +360,7 @@
 	struct rlimit	limit;
 
 	what = 'f';
-	while ((optc = nextopt("HSabtfdsmcnpl")) != '\0')
+	while ((optc = nextopt("HSabtfdsmcnplv")) != '\0')
 		switch (optc) {
 		case 'H':
 			how = HARD;

Index: src/bin/sh/sh.1
diff -u src/bin/sh/sh.1:1.91 src/bin/sh/sh.1:1.92
--- src/bin/sh/sh.1:1.91	Tue Mar 10 15:14:28 2009
+++ src/bin/sh/sh.1	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: sh.1,v 1.91 2009/03/10 15:14:28 joerg Exp $
+.\"	$NetBSD: sh.1,v 1.92 2009/03/29 01:02:49 mrg Exp $
 .\" Copyright (c) 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
 .\"
@@ -1699,7 +1699,7 @@
 For aliases the alias expansion is
 printed; for commands and tracked aliases the complete pathname of the
 command is printed.
-.It ulimit Oo Fl H \*(Ba Fl S Oc Oo Fl a \*(Ba Fl tfdscmlpn Oo Ar value Oc Oc
+.It ulimit Oo Fl H \*(Ba Fl S Oc Oo Fl a \*(Ba Fl tfdscmlpnv Oo Ar value Oc Oc
 Inquire about or set the hard or soft limits on processes or set new
 limits.
 The choice between hard limit (which no process is allowed to
@@ -1750,6 +1750,8 @@
 have at one time
 .It Fl n
 show or set the limit on the number of files a process can have open at once
+.It Fl v
+show or set the limit on how large a process address space can be
 .El
 .Pp
 If none of these is specified, it is the limit on file size that is shown

Index: src/external/bsd/top/dist/machine/m_netbsd.c
diff -u src/external/bsd/top/dist/machine/m_netbsd.c:1.6 src/external/bsd/top/dist/machine/m_netbsd.c:1.7
--- src/external/bsd/top/dist/machine/m_netbsd.c:1.6	Sun Mar  8 16:26:03 2009
+++ src/external/bsd/top/dist/machine/m_netbsd.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: m_netbsd.c,v 1.6 2009/03/08 16:26:03 ad Exp $	*/
+/*	$NetBSD: m_netbsd.c,v 1.7 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*
  * top - a top users display for Unix
@@ -37,12 +37,12 @@
  *		Andrew Doran <a...@netbsd.org>
  *
  *
- * $Id: m_netbsd.c,v 1.6 2009/03/08 16:26:03 ad Exp $
+ * $Id: m_netbsd.c,v 1.7 2009/03/29 01:02:49 mrg Exp $
  */
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: m_netbsd.c,v 1.6 2009/03/08 16:26:03 ad Exp $");
+__RCSID("$NetBSD: m_netbsd.c,v 1.7 2009/03/29 01:02:49 mrg Exp $");
 #endif
 
 #include <sys/param.h>
@@ -87,8 +87,14 @@
 			 ((pct) / (1.0 - exp((pp)->pfx ## swtime * logcpu))))
 
 /* what we consider to be process size: */
+/* NetBSD introduced p_vm_msize with RLIMIT_AS */
+#ifdef RLIMIT_AS
 #define PROCSIZE(pp) \
-	((pp)->p_vm_tsize + (pp)->p_vm_dsize + (pp)->p_vm_ssize)
+    ((pp)->p_vm_msize)
+#else
+#define PROCSIZE(pp) \
+    ((pp)->p_vm_tsize + (pp)->p_vm_dsize + (pp)->p_vm_ssize)
+#endif
 
 
 /*

Index: src/lib/libkvm/kvm_proc.c
diff -u src/lib/libkvm/kvm_proc.c:1.81 src/lib/libkvm/kvm_proc.c:1.82
--- src/lib/libkvm/kvm_proc.c:1.81	Sun Dec 28 19:49:26 2008
+++ src/lib/libkvm/kvm_proc.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: kvm_proc.c,v 1.81 2008/12/28 19:49:26 christos Exp $	*/
+/*	$NetBSD: kvm_proc.c,v 1.82 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 #if 0
 static char sccsid[] = "@(#)kvm_proc.c	8.3 (Berkeley) 9/23/93";
 #else
-__RCSID("$NetBSD: kvm_proc.c,v 1.81 2008/12/28 19:49:26 christos Exp $");
+__RCSID("$NetBSD: kvm_proc.c,v 1.82 2009/03/29 01:02:49 mrg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -99,6 +99,7 @@
 #include <kvm.h>
 
 #include <uvm/uvm_extern.h>
+#include <uvm/uvm_param.h>
 #include <uvm/uvm_amap.h>
 
 #include <sys/sysctl.h>
@@ -679,6 +680,12 @@
 			kp2p->p_vm_tsize = kp->kp_eproc.e_vm.vm_tsize;
 			kp2p->p_vm_dsize = kp->kp_eproc.e_vm.vm_dsize;
 			kp2p->p_vm_ssize = kp->kp_eproc.e_vm.vm_ssize;
+			kp2p->p_vm_vsize = kp->kp_eproc.e_vm.vm_map.size;
+			/* Adjust mapped size */
+			kp2p->p_vm_msize =
+			    (kp->kp_eproc.e_vm.vm_map.size / kd->nbpg) -
+			    kp->kp_eproc.e_vm.vm_issize +
+			    kp->kp_eproc.e_vm.vm_ssize;
 
 			kp2p->p_eflag = (int32_t)kp->kp_eproc.e_flag;
 

Index: src/sys/arch/mips/mips/cpu_exec.c
diff -u src/sys/arch/mips/mips/cpu_exec.c:1.54 src/sys/arch/mips/mips/cpu_exec.c:1.55
--- src/sys/arch/mips/mips/cpu_exec.c:1.54	Sat Mar 14 21:04:12 2009
+++ src/sys/arch/mips/mips/cpu_exec.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_exec.c,v 1.54 2009/03/14 21:04:12 dsl Exp $	*/
+/*	$NetBSD: cpu_exec.c,v 1.55 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_exec.c,v 1.54 2009/03/14 21:04:12 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_exec.c,v 1.55 2009/03/29 01:02:49 mrg Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_compat_ultrix.h"
@@ -284,12 +284,12 @@
 	 * note that in memory, things assumed to be: 0 ....... ep_maxsaddr
 	 * <stack> ep_minsaddr
 	 */
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero,
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero,
 	    ((epp->ep_minsaddr - epp->ep_ssize) - epp->ep_maxsaddr),
-	    epp->ep_maxsaddr, NULLVP, 0, VM_PROT_NONE);
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, epp->ep_ssize,
+	    epp->ep_maxsaddr, NULLVP, 0, VM_PROT_NONE, VMCMD_STACK);
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, epp->ep_ssize,
 	    (epp->ep_minsaddr - epp->ep_ssize), NULLVP, 0,
-	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
+	    VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE, VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/compat/darwin/darwin_exec.c
diff -u src/sys/compat/darwin/darwin_exec.c:1.56 src/sys/compat/darwin/darwin_exec.c:1.57
--- src/sys/compat/darwin/darwin_exec.c:1.56	Wed Nov 19 18:36:02 2008
+++ src/sys/compat/darwin/darwin_exec.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: darwin_exec.c,v 1.56 2008/11/19 18:36:02 ad Exp $ */
+/*	$NetBSD: darwin_exec.c,v 1.57 2009/03/29 01:02:49 mrg Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "opt_compat_darwin.h" /* For COMPAT_DARWIN in mach_port.h */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: darwin_exec.c,v 1.56 2008/11/19 18:36:02 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: darwin_exec.c,v 1.57 2009/03/29 01:02:49 mrg Exp $");
 
 #include "opt_syscall_debug.h"
 
@@ -426,12 +426,13 @@
 	noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 	if (noaccess_size > 0) {
-		NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
-		    noaccess_linear_min, NULL, 0, VM_PROT_NONE);
+		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
+		    noaccess_linear_min, NULL, 0, VM_PROT_NONE, VMCMD_STACK);
 	}
 	KASSERT(access_size > 0);
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
-	    access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE);
+	NEW_VMCMD(2&epp->ep_vmcmds, vmcmd_map_zero, access_size,
+	    access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE,
+	    VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/compat/ibcs2/ibcs2_exec.c
diff -u src/sys/compat/ibcs2/ibcs2_exec.c:1.72 src/sys/compat/ibcs2/ibcs2_exec.c:1.73
--- src/sys/compat/ibcs2/ibcs2_exec.c:1.72	Wed Nov 19 18:36:03 2008
+++ src/sys/compat/ibcs2/ibcs2_exec.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ibcs2_exec.c,v 1.72 2008/11/19 18:36:03 ad Exp $	*/
+/*	$NetBSD: ibcs2_exec.c,v 1.73 2009/03/29 01:02:49 mrg Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995, 1998 Scott Bartram
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ibcs2_exec.c,v 1.72 2008/11/19 18:36:03 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ibcs2_exec.c,v 1.73 2009/03/29 01:02:49 mrg Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_syscall_debug.h"
@@ -181,14 +181,14 @@
 	noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 	if (noaccess_size > 0) {
-		NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
-		    noaccess_linear_min, NULL, 0, VM_PROT_NONE);
+		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
+		    noaccess_linear_min, NULL, 0, VM_PROT_NONE, VMCMD_STACK);
 	}
 	KASSERT(access_size > 0);
 	/* XXX: some ibcs2 binaries need an executable stack. */
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
 	    access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE |
-	    VM_PROT_EXECUTE);
+	    VM_PROT_EXECUTE, VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/compat/irix/irix_resource.c
diff -u src/sys/compat/irix/irix_resource.c:1.14 src/sys/compat/irix/irix_resource.c:1.15
--- src/sys/compat/irix/irix_resource.c:1.14	Mon Apr 28 20:23:42 2008
+++ src/sys/compat/irix/irix_resource.c	Sun Mar 29 01:02:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: irix_resource.c,v 1.14 2008/04/28 20:23:42 martin Exp $ */
+/*	$NetBSD: irix_resource.c,v 1.15 2009/03/29 01:02:49 mrg Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_resource.c,v 1.14 2008/04/28 20:23:42 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_resource.c,v 1.15 2009/03/29 01:02:49 mrg Exp $");
 
 #include <sys/types.h>
 #include <sys/signal.h>
@@ -76,6 +76,8 @@
 		bsd_res = RLIMIT_NOFILE;
 		break;
 	case IRIX_RLIMIT_VMEM:
+		bsd_res = RLIMIT_AS;
+		break;
 	case IRIX_RLIMIT_RSS:
 		bsd_res = RLIMIT_RSS;
 		break;

Index: src/sys/compat/linux/arch/amd64/linux_exec_machdep.c
diff -u src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.15 src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.16
--- src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.15	Sun Mar 15 15:55:51 2009
+++ src/sys/compat/linux/arch/amd64/linux_exec_machdep.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_exec_machdep.c,v 1.15 2009/03/15 15:55:51 cegger Exp $ */
+/*	$NetBSD: linux_exec_machdep.c,v 1.16 2009/03/29 01:02:50 mrg Exp $ */
 
 /*-
  * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.15 2009/03/15 15:55:51 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.16 2009/03/29 01:02:50 mrg Exp $");
 
 #ifdef __amd64__
 #define ELFSIZE 64
@@ -113,12 +113,13 @@
 	noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 	if (noaccess_size > 0) {
-		NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
-		    noaccess_linear_min, NULLVP, 0, VM_PROT_NONE);
+		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
+		    noaccess_linear_min, NULLVP, 0, VM_PROT_NONE, VMCMD_STACK);
 	}
 	KASSERT(access_size > 0);
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
-	    access_linear_min, NULLVP, 0, VM_PROT_READ | VM_PROT_WRITE);
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
+	    access_linear_min, NULLVP, 0, VM_PROT_READ | VM_PROT_WRITE,
+	    VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/compat/linux/arch/i386/linux_exec_machdep.c
diff -u src/sys/compat/linux/arch/i386/linux_exec_machdep.c:1.11 src/sys/compat/linux/arch/i386/linux_exec_machdep.c:1.12
--- src/sys/compat/linux/arch/i386/linux_exec_machdep.c:1.11	Sun Oct 26 20:46:05 2008
+++ src/sys/compat/linux/arch/i386/linux_exec_machdep.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_exec_machdep.c,v 1.11 2008/10/26 20:46:05 christos Exp $	*/
+/*	$NetBSD: linux_exec_machdep.c,v 1.12 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.11 2008/10/26 20:46:05 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.12 2009/03/29 01:02:50 mrg Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -121,12 +121,13 @@
 	noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 	if (noaccess_size > 0) {
-		NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
-		    noaccess_linear_min, NULLVP, 0, VM_PROT_NONE);
+		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
+		    noaccess_linear_min, NULLVP, 0, VM_PROT_NONE, VMCMD_STACK);
 	}
 	KASSERT(access_size > 0);
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
-	    access_linear_min, NULLVP, 0, VM_PROT_READ | VM_PROT_WRITE);
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
+	    access_linear_min, NULLVP, 0, VM_PROT_READ | VM_PROT_WRITE,
+	    VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/compat/linux/common/linux_limit.h
diff -u src/sys/compat/linux/common/linux_limit.h:1.4 src/sys/compat/linux/common/linux_limit.h:1.5
--- src/sys/compat/linux/common/linux_limit.h:1.4	Sun Mar 15 15:55:51 2009
+++ src/sys/compat/linux/common/linux_limit.h	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/* 	$NetBSD: linux_limit.h,v 1.4 2009/03/15 15:55:51 cegger Exp $ */
+/* 	$NetBSD: linux_limit.h,v 1.5 2009/03/29 01:02:50 mrg Exp $ */
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -79,6 +79,7 @@
 	case LINUX_RLIMIT_MEMLOCK:
 		return RLIMIT_MEMLOCK;
 	case LINUX_RLIMIT_AS:
+		return RLIMIT_AS;
 	case LINUX_RLIMIT_LOCKS:
 		return -EOPNOTSUPP;
 	default:

Index: src/sys/compat/osf1/osf1_resource.c
diff -u src/sys/compat/osf1/osf1_resource.c:1.13 src/sys/compat/osf1/osf1_resource.c:1.14
--- src/sys/compat/osf1/osf1_resource.c:1.13	Thu Apr 24 18:39:23 2008
+++ src/sys/compat/osf1/osf1_resource.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: osf1_resource.c,v 1.13 2008/04/24 18:39:23 ad Exp $ */
+/* $NetBSD: osf1_resource.c,v 1.14 2009/03/29 01:02:50 mrg Exp $ */
 
 /*
  * Copyright (c) 1999 Christopher G. Demetriou.  All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: osf1_resource.c,v 1.13 2008/04/24 18:39:23 ad Exp $");
+__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>
@@ -72,7 +72,9 @@
 	case OSF1_RLIMIT_NOFILE:
 		SCARG(&a, which) = RLIMIT_NOFILE;
 		break;
-	case OSF1_RLIMIT_AS:		/* unhandled */
+	case OSF1_RLIMIT_AS:
+		SCARG(&a, which) = RLIMIT_AS;
+		break;
 	default:
 		return (EINVAL);
 	}
@@ -141,7 +143,9 @@
 	case OSF1_RLIMIT_NOFILE:
 		SCARG(&a, which) = RLIMIT_NOFILE;
 		break;
-	case OSF1_RLIMIT_AS:		/* unhandled */
+	case OSF1_RLIMIT_AS:
+		SCARG(&a, which) = RLIMIT_AS;
+		break;
 	default:
 		return (EINVAL);
 	}

Index: src/sys/compat/svr4/svr4_resource.c
diff -u src/sys/compat/svr4/svr4_resource.c:1.17 src/sys/compat/svr4/svr4_resource.c:1.18
--- src/sys/compat/svr4/svr4_resource.c:1.17	Sun Jan 11 02:45:50 2009
+++ src/sys/compat/svr4/svr4_resource.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_resource.c,v 1.17 2009/01/11 02:45:50 christos Exp $	 */
+/*	$NetBSD: svr4_resource.c,v 1.18 2009/03/29 01:02:50 mrg Exp $	 */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_resource.c,v 1.17 2009/01/11 02:45:50 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_resource.c,v 1.18 2009/03/29 01:02:50 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -66,7 +66,7 @@
 	case SVR4_RLIMIT_NOFILE:
 		return RLIMIT_NOFILE;
 	case SVR4_RLIMIT_VMEM:
-		return RLIMIT_RSS;
+		return RLIMIT_AS;
 	default:
 		return -1;
 	}

Index: src/sys/compat/svr4_32/svr4_32_resource.c
diff -u src/sys/compat/svr4_32/svr4_32_resource.c:1.16 src/sys/compat/svr4_32/svr4_32_resource.c:1.17
--- src/sys/compat/svr4_32/svr4_32_resource.c:1.16	Sun Jan 11 13:14:15 2009
+++ src/sys/compat/svr4_32/svr4_32_resource.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_32_resource.c,v 1.16 2009/01/11 13:14:15 nakayama Exp $	 */
+/*	$NetBSD: svr4_32_resource.c,v 1.17 2009/03/29 01:02:50 mrg Exp $	 */
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_resource.c,v 1.16 2009/01/11 13:14:15 nakayama Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_resource.c,v 1.17 2009/03/29 01:02:50 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -68,7 +68,7 @@
 	case SVR4_RLIMIT_NOFILE:
 		return RLIMIT_NOFILE;
 	case SVR4_RLIMIT_VMEM:
-		return RLIMIT_RSS;
+		return RLIMIT_AS;
 	default:
 		return -1;
 	}

Index: src/sys/kern/exec_subr.c
diff -u src/sys/kern/exec_subr.c:1.61 src/sys/kern/exec_subr.c:1.62
--- src/sys/kern/exec_subr.c:1.61	Mon Jun  2 16:16:27 2008
+++ src/sys/kern/exec_subr.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_subr.c,v 1.61 2008/06/02 16:16:27 ad Exp $	*/
+/*	$NetBSD: exec_subr.c,v 1.62 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*
  * Copyright (c) 1993, 1994, 1996 Christopher G. Demetriou
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.61 2008/06/02 16:16:27 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exec_subr.c,v 1.62 2009/03/29 01:02:50 mrg Exp $");
 
 #include "opt_pax.h"
 
@@ -327,6 +327,8 @@
 			UVM_MAPFLAG(prot, maxprot, UVM_INH_COPY,
 			UVM_ADV_NORMAL,
 			UVM_FLAG_FIXED|UVM_FLAG_COPYONW));
+	if (cmd->ev_flags & VMCMD_STACK)
+		curproc->p_vmspace->vm_issize += atop(round_page(cmd->ev_len));
 	return error;
 }
 
@@ -409,12 +411,13 @@
 	noaccess_linear_min = (u_long)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
 	    access_size), noaccess_size);
 	if (noaccess_size > 0) {
-		NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
-		    noaccess_linear_min, NULL, 0, VM_PROT_NONE);
+		NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, noaccess_size,
+		    noaccess_linear_min, NULL, 0, VM_PROT_NONE, VMCMD_STACK);
 	}
 	KASSERT(access_size > 0);
-	NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
-	    access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE);
+	NEW_VMCMD2(&epp->ep_vmcmds, vmcmd_map_zero, access_size,
+	    access_linear_min, NULL, 0, VM_PROT_READ | VM_PROT_WRITE,
+	    VMCMD_STACK);
 
 	return 0;
 }

Index: src/sys/kern/init_sysctl.c
diff -u src/sys/kern/init_sysctl.c:1.159 src/sys/kern/init_sysctl.c:1.160
--- src/sys/kern/init_sysctl.c:1.159	Wed Mar 11 05:55:22 2009
+++ src/sys/kern/init_sysctl.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: init_sysctl.c,v 1.159 2009/03/11 05:55:22 mrg Exp $ */
+/*	$NetBSD: init_sysctl.c,v 1.160 2009/03/29 01:02:50 mrg Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.159 2009/03/11 05:55:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.160 2009/03/29 01:02:50 mrg Exp $");
 
 #include "opt_sysv.h"
 #include "opt_compat_netbsd32.h"
@@ -3031,6 +3031,14 @@
 		ki->p_vm_tsize = vm->vm_tsize;
 		ki->p_vm_dsize = vm->vm_dsize;
 		ki->p_vm_ssize = vm->vm_ssize;
+		ki->p_vm_vsize = vm->vm_map.size;
+		/*
+		 * Since the stack is initially mapped mostly with
+		 * PROT_NONE and grown as needed, adjust the "mapped size"
+		 * to skip the unused stack portion.
+		 */
+		ki->p_vm_msize =
+		    atop(vm->vm_map.size) - vm->vm_issize + vm->vm_ssize;
 
 		/* Pick the primary (first) LWP */
 		l = proc_active_lwp(p);
@@ -3201,6 +3209,7 @@
 		ep->e_vm.vm_tsize = vm->vm_tsize;
 		ep->e_vm.vm_dsize = vm->vm_dsize;
 		ep->e_vm.vm_ssize = vm->vm_ssize;
+		ep->e_vm.vm_map.size = vm->vm_map.size;
 
 		/* Pick the primary (first) LWP */
 		l = proc_active_lwp(p);

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.287 src/sys/kern/kern_exec.c:1.288
--- src/sys/kern/kern_exec.c:1.287	Tue Mar 24 21:00:05 2009
+++ src/sys/kern/kern_exec.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.287 2009/03/24 21:00:05 christos Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.288 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.287 2009/03/24 21:00:05 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.288 2009/03/29 01:02:50 mrg Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_modular.h"
@@ -776,6 +776,7 @@
 	vm->vm_daddr = (void*)pack.ep_daddr;
 	vm->vm_dsize = btoc(pack.ep_dsize);
 	vm->vm_ssize = btoc(pack.ep_ssize);
+	vm->vm_issize = 0;
 	vm->vm_maxsaddr = (void *)pack.ep_maxsaddr;
 	vm->vm_minsaddr = (void *)pack.ep_minsaddr;
 

Index: src/sys/kern/kern_resource.c
diff -u src/sys/kern/kern_resource.c:1.150 src/sys/kern/kern_resource.c:1.151
--- src/sys/kern/kern_resource.c:1.150	Mon Feb  9 11:13:20 2009
+++ src/sys/kern/kern_resource.c	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_resource.c,v 1.150 2009/02/09 11:13:20 rmind Exp $	*/
+/*	$NetBSD: kern_resource.c,v 1.151 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1991, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_resource.c,v 1.150 2009/02/09 11:13:20 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_resource.c,v 1.151 2009/03/29 01:02:50 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -999,6 +999,7 @@
 	create_proc_plimit("maxproc",		PROC_PID_LIMIT_NPROC);
 	create_proc_plimit("descriptors",	PROC_PID_LIMIT_NOFILE);
 	create_proc_plimit("sbsize",		PROC_PID_LIMIT_SBSIZE);
+	create_proc_plimit("vmemoryuse",	PROC_PID_LIMIT_AS);
 
 #undef create_proc_plimit
 

Index: src/sys/sys/resource.h
diff -u src/sys/sys/resource.h:1.30 src/sys/sys/resource.h:1.31
--- src/sys/sys/resource.h:1.30	Sun Jan 11 02:45:55 2009
+++ src/sys/sys/resource.h	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: resource.h,v 1.30 2009/01/11 02:45:55 christos Exp $	*/
+/*	$NetBSD: resource.h,v 1.31 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -88,9 +88,11 @@
 #define	RLIMIT_NPROC	7		/* number of processes */
 #define	RLIMIT_NOFILE	8		/* number of open files */
 #define	RLIMIT_SBSIZE	9		/* maximum size of all socket buffers */
+#define	RLIMIT_AS	10		/* virtual process size (inclusive of mmap) */
+#define	RLIMIT_VMEM	RLIMIT_AS	/* common alias */
 
 #if defined(_NETBSD_SOURCE)
-#define	RLIM_NLIMITS	10		/* number of resource limits */
+#define	RLIM_NLIMITS	11		/* number of resource limits */
 #endif
 
 #define	RLIM_INFINITY	(~((u_quad_t)1 << 63))	/* no limit */

Index: src/sys/sys/sysctl.h
diff -u src/sys/sys/sysctl.h:1.183 src/sys/sys/sysctl.h:1.184
--- src/sys/sys/sysctl.h:1.183	Tue Jan 20 18:20:48 2009
+++ src/sys/sys/sysctl.h	Sun Mar 29 01:02:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysctl.h,v 1.183 2009/01/20 18:20:48 drochner Exp $	*/
+/*	$NetBSD: sysctl.h,v 1.184 2009/03/29 01:02:50 mrg Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -587,6 +587,8 @@
 	uint32_t p_svuid;		/* UID_T: saved user id */
 	uint32_t p_svgid;		/* GID_T: saved group id */
 	char p_ename[KI_MAXEMULLEN];	/* emulation name */
+	int64_t	p_vm_vsize;		/* SEGSZ_T: total map size (pages) */
+	int64_t	p_vm_msize;		/* SEGSZ_T: stack-adjusted map size (pages) */
 };
 
 /*
@@ -956,6 +958,7 @@
 #define PROC_PID_LIMIT_NPROC	(RLIMIT_NPROC+1)
 #define	PROC_PID_LIMIT_NOFILE	(RLIMIT_NOFILE+1)
 #define	PROC_PID_LIMIT_SBSIZE	(RLIMIT_SBSIZE+1)
+#define	PROC_PID_LIMIT_AS	(RLIMIT_AS+1)
 #define	PROC_PID_LIMIT_MAXID 	(RLIM_NLIMITS+1)
 
 #define	PROC_PID_LIMIT_NAMES { \
@@ -970,6 +973,7 @@
 	{ "maxproc", CTLTYPE_NODE }, \
 	{ "descriptors", CTLTYPE_NODE }, \
 	{ "sbsize", CTLTYPE_NODE }, \
+	{ "vmemoryuse", CTLTYPE_NODE }, \
 }
 /* for each type, either hard or soft value */
 #define	PROC_PID_LIMIT_TYPE_SOFT	1

Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.152 src/sys/uvm/uvm_extern.h:1.153
--- src/sys/uvm/uvm_extern.h:1.152	Thu Mar 12 12:55:16 2009
+++ src/sys/uvm/uvm_extern.h	Sun Mar 29 01:02:51 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_extern.h,v 1.152 2009/03/12 12:55:16 abs Exp $	*/
+/*	$NetBSD: uvm_extern.h,v 1.153 2009/03/29 01:02:51 mrg Exp $	*/
 
 /*
  *
@@ -502,6 +502,7 @@
 	segsz_t vm_tsize;	/* text size (pages) XXX */
 	segsz_t vm_dsize;	/* data size (pages) XXX */
 	segsz_t vm_ssize;	/* stack size (pages) */
+	segsz_t vm_issize;	/* initial unmapped stack size (pages) */
 	void *	vm_taddr;	/* user virtual address of text XXX */
 	void *	vm_daddr;	/* user virtual address of data XXX */
 	void *vm_maxsaddr;	/* user VA at max stack growth */

Index: src/sys/uvm/uvm_glue.c
diff -u src/sys/uvm/uvm_glue.c:1.135 src/sys/uvm/uvm_glue.c:1.136
--- src/sys/uvm/uvm_glue.c:1.135	Sat Jan 31 09:13:09 2009
+++ src/sys/uvm/uvm_glue.c	Sun Mar 29 01:02:51 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_glue.c,v 1.135 2009/01/31 09:13:09 yamt Exp $	*/
+/*	$NetBSD: uvm_glue.c,v 1.136 2009/03/29 01:02:51 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.135 2009/01/31 09:13:09 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_glue.c,v 1.136 2009/03/29 01:02:51 mrg Exp $");
 
 #include "opt_kgdb.h"
 #include "opt_kstack.h"
@@ -425,6 +425,8 @@
 	p->p_rlimit[RLIMIT_STACK].rlim_max = maxsmap;
 	p->p_rlimit[RLIMIT_DATA].rlim_cur = DFLDSIZ;
 	p->p_rlimit[RLIMIT_DATA].rlim_max = maxdmap;
+	p->p_rlimit[RLIMIT_AS].rlim_cur = RLIM_INFINITY;
+	p->p_rlimit[RLIMIT_AS].rlim_max = RLIM_INFINITY;
 	p->p_rlimit[RLIMIT_RSS].rlim_cur = ptoa(uvmexp.free);
 }
 

Index: src/sys/uvm/uvm_mmap.c
diff -u src/sys/uvm/uvm_mmap.c:1.127 src/sys/uvm/uvm_mmap.c:1.128
--- src/sys/uvm/uvm_mmap.c:1.127	Sat Mar 14 21:04:26 2009
+++ src/sys/uvm/uvm_mmap.c	Sun Mar 29 01:02:51 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_mmap.c,v 1.127 2009/03/14 21:04:26 dsl Exp $	*/
+/*	$NetBSD: uvm_mmap.c,v 1.128 2009/03/29 01:02:51 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -51,7 +51,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.127 2009/03/14 21:04:26 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.128 2009/03/29 01:02:51 mrg Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_pax.h"
@@ -502,24 +502,6 @@
 		pos = 0;
 	}
 
-	/*
-	 * XXX (in)sanity check.  We don't do proper datasize checking
-	 * XXX for anonymous (or private writable) mmap().  However,
-	 * XXX know that if we're trying to allocate more than the amount
-	 * XXX remaining under our current data size limit, _that_ should
-	 * XXX be disallowed.
-	 */
-	if ((flags & MAP_ANON) != 0 ||
-	    ((flags & MAP_PRIVATE) != 0 && (prot & PROT_WRITE) != 0)) {
-		if (size >
-		    (p->p_rlimit[RLIMIT_DATA].rlim_cur -
-		     ctob(p->p_vmspace->vm_dsize))) {
-		     	if (fp != NULL)
-				fd_putfile(fd);
-			return (ENOMEM);
-		}
-	}
-
 #if NVERIEXEC > 0
 	if (handle != NULL) {
 		/*
@@ -1115,6 +1097,15 @@
 	}
 
 	/*
+	 * check resource limits
+	 */
+
+	if (!VM_MAP_IS_KERNEL(map) &&
+	    (((rlim_t)curproc->p_vmspace->vm_map.size + (rlim_t)size) >
+	    curproc->p_rlimit[RLIMIT_AS].rlim_cur))
+		return ENOMEM;
+
+	/*
 	 * handle anon vs. non-anon mappings.   for non-anon mappings attach
 	 * to underlying vm object.
 	 */

Index: src/usr.bin/systat/ps.c
diff -u src/usr.bin/systat/ps.c:1.31 src/usr.bin/systat/ps.c:1.32
--- src/usr.bin/systat/ps.c:1.31	Mon Dec 29 01:48:19 2008
+++ src/usr.bin/systat/ps.c	Sun Mar 29 01:02:51 2009
@@ -1,4 +1,4 @@
-/*      $NetBSD: ps.c,v 1.31 2008/12/29 01:48:19 christos Exp $  */
+/*      $NetBSD: ps.c,v 1.32 2009/03/29 01:02:51 mrg Exp $  */
 
 /*-
  * Copyright (c) 1999
@@ -45,7 +45,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ps.c,v 1.31 2008/12/29 01:48:19 christos Exp $");
+__RCSID("$NetBSD: ps.c,v 1.32 2009/03/29 01:02:51 mrg Exp $");
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -247,7 +247,7 @@
 {
 	int     i;
 
-	i = pgtok(kp->p_vm_dsize + kp->p_vm_ssize + kp->p_vm_tsize);
+	i = pgtok(kp->p_vm_msize);
 
 	return ((i < 0) ? 0 : i);
 }

Reply via email to