Module Name:    src
Committed By:   martin
Date:           Tue Jun  5 08:44:22 UTC 2012

Modified Files:
        src/tests/lib/libc/sys: Makefile t_mincore.c

Log Message:
Try to estimate the number of locked pages the mincore() test will need and
check it against resource limits, skipping the tests if it probably is too
low.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/tests/lib/libc/sys/Makefile
cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libc/sys/t_mincore.c

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

Modified files:

Index: src/tests/lib/libc/sys/Makefile
diff -u src/tests/lib/libc/sys/Makefile:1.23 src/tests/lib/libc/sys/Makefile:1.24
--- src/tests/lib/libc/sys/Makefile:1.23	Mon May 21 14:15:19 2012
+++ src/tests/lib/libc/sys/Makefile	Tue Jun  5 08:44:21 2012
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.23 2012/05/21 14:15:19 martin Exp $
+# $NetBSD: Makefile,v 1.24 2012/06/05 08:44:21 martin Exp $
 
 MKMAN=	no
 
@@ -66,6 +66,7 @@ SRCS.t_mprotect=	t_mprotect.c ${SRCS_EXE
 
 LDADD.t_getpid+=        -lpthread
 LDADD.t_posix_fadvise+= -lrumpvfs -lrump -lrumpuser -lpthread
+LDADD.t_mincore+=	-lkvm
 
 WARNS=			4
 

Index: src/tests/lib/libc/sys/t_mincore.c
diff -u src/tests/lib/libc/sys/t_mincore.c:1.5 src/tests/lib/libc/sys/t_mincore.c:1.6
--- src/tests/lib/libc/sys/t_mincore.c:1.5	Wed May 23 16:08:32 2012
+++ src/tests/lib/libc/sys/t_mincore.c	Tue Jun  5 08:44:21 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: t_mincore.c,v 1.5 2012/05/23 16:08:32 martin Exp $ */
+/* $NetBSD: t_mincore.c,v 1.6 2012/06/05 08:44:21 martin Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_mincore.c,v 1.5 2012/05/23 16:08:32 martin Exp $");
+__RCSID("$NetBSD: t_mincore.c,v 1.6 2012/06/05 08:44:21 martin Exp $");
 
 #include <sys/mman.h>
 #include <sys/shm.h>
@@ -67,10 +67,13 @@ __RCSID("$NetBSD: t_mincore.c,v 1.5 2012
 #include <atf-c.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <kvm.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/resource.h>
+#include <sys/sysctl.h>
 
 static long		page = 0;
 static const char	path[] = "mincore";
@@ -101,6 +104,28 @@ check_residency(void *addr, size_t npgs)
 	return resident;
 }
 
+/*
+ * Get an estimate of the current VM size
+ */
+static size_t
+vm_cur_pages(void)
+{
+	size_t res = 0;
+	kvm_t *kvm;
+	struct kinfo_proc2 *pi;
+	int cnt;
+
+	kvm = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, getprogname());
+	if (kvm == NULL)
+		return 0;
+	pi = kvm_getproc2(kvm, KERN_PROC_PID, getpid(), sizeof(*pi), &cnt);
+	if (pi && cnt >= 1)
+		res = pi[0].p_vm_vsize;
+	kvm_close(kvm);
+
+	return res;
+}
+
 ATF_TC(mincore_err);
 ATF_TC_HEAD(mincore_err, tc)
 {
@@ -142,6 +167,25 @@ ATF_TC_BODY(mincore_resid, tc)
 	size_t npgs = 0;
 	struct stat st;
 	int fd, rv;
+	struct rlimit rlim;
+	size_t needed_pages, limit_pages;
+
+	ATF_REQUIRE(getrlimit(RLIMIT_MEMLOCK, &rlim) == 0);
+	limit_pages = rlim.rlim_cur / page;
+	/*
+	 * We can not exactly predict the number of pages resulting from
+	 * the test and the mlockall() call below.
+	 * Get a safe upper bound instead...
+	 */
+	needed_pages = vm_cur_pages();
+	/* we certainly will gow  by 128 pages */
+	needed_pages += 128;
+	/* add a bit of safety room */
+	needed_pages += 12;
+
+	if (needed_pages >= limit_pages)
+		atf_tc_skip("too low limits on locked memory (may need %zu "
+		    "pages, limit is %zu pages)", needed_pages, limit_pages);
 
 	(void)memset(&st, 0, sizeof(struct stat));
 

Reply via email to