Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/rump Add some tests for lock errors. Notably, some of...



details:   https://anonhg.NetBSD.org/src/rev/11de70bd26ac
branches:  trunk
changeset: 760509:11de70bd26ac
user:      pooka <pooka%NetBSD.org@localhost>
date:      Thu Jan 06 13:12:52 2011 +0000

description:
Add some tests for lock errors.  Notably, some of them fare nicely
with just the pthread consistency checks (which are enabled by
default in rumpuser), but others require real LOCKDEBUG.

diffstat:

 tests/rump/kernspace/Makefile    |    4 +-
 tests/rump/kernspace/kernspace.h |    7 ++-
 tests/rump/kernspace/lockme.c    |   92 +++++++++++++++++++++++++++++++++++
 tests/rump/rumpkern/Makefile     |    3 +-
 tests/rump/rumpkern/t_kern.c     |  100 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 202 insertions(+), 4 deletions(-)

diffs (257 lines):

diff -r 27386367a1bc -r 11de70bd26ac tests/rump/kernspace/Makefile
--- a/tests/rump/kernspace/Makefile     Thu Jan 06 13:09:17 2011 +0000
+++ b/tests/rump/kernspace/Makefile     Thu Jan 06 13:12:52 2011 +0000
@@ -1,10 +1,10 @@
-#      $NetBSD: Makefile,v 1.3 2010/06/14 21:06:09 pooka Exp $
+#      $NetBSD: Makefile,v 1.4 2011/01/06 13:12:52 pooka Exp $
 #
 
 .include <bsd.own.mk>
 
 LIB=   kernspace
-SRCS=  thread.c busypage.c tsleep.c alloc.c
+SRCS=  thread.c busypage.c tsleep.c alloc.c lockme.c
 
 RUMPTOP=${NETBSDSRCDIR}/sys/rump
 
diff -r 27386367a1bc -r 11de70bd26ac tests/rump/kernspace/kernspace.h
--- a/tests/rump/kernspace/kernspace.h  Thu Jan 06 13:09:17 2011 +0000
+++ b/tests/rump/kernspace/kernspace.h  Thu Jan 06 13:12:52 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kernspace.h,v 1.2 2010/06/14 21:06:09 pooka Exp $      */
+/*     $NetBSD: kernspace.h,v 1.3 2011/01/06 13:12:52 pooka Exp $      */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,10 +30,15 @@
 #ifndef _TESTS_RUMP_KERNSPACE_KERNSPACE_H_
 #define _TESTS_RUMP_KERNSPACE_KERNSPACE_H_
 
+enum locktest { LOCKME_MTX, LOCKME_RWDOUBLEX, LOCKME_RWRX, LOCKME_RWXR,
+       LOCKME_DESTROYHELD, LOCKME_DOUBLEINIT, LOCKME_DOUBLEFREE,
+       LOCKME_MEMFREE };
+
 void rumptest_busypage(void);
 void rumptest_threadjoin(void);
 void rumptest_thread(void);
 void rumptest_tsleep(void);
 void rumptest_alloc(size_t);
+void rumptest_lockme(enum locktest);
 
 #endif /* _TESTS_RUMP_KERNSPACE_KERNSPACE_H_ */
diff -r 27386367a1bc -r 11de70bd26ac tests/rump/kernspace/lockme.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/rump/kernspace/lockme.c     Thu Jan 06 13:12:52 2011 +0000
@@ -0,0 +1,92 @@
+/*     $NetBSD: lockme.c,v 1.1 2011/01/06 13:12:52 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``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 FOUNDATION OR CONTRIBUTORS 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>
+#if !defined(lint)
+__RCSID("$NetBSD: lockme.c,v 1.1 2011/01/06 13:12:52 pooka Exp $");
+#endif /* !lint */
+
+#include <sys/param.h>
+#include <sys/kmem.h>
+#include <sys/mutex.h>
+#include <sys/rwlock.h>
+
+#include "kernspace.h"
+
+struct somemem {
+       char foo;
+       kmutex_t mutexetum;
+       char oof;
+};
+
+void
+rumptest_lockme(enum locktest what)
+{
+       struct somemem *some;
+       kmutex_t mtx;
+       krwlock_t rw;
+
+       rw_init(&rw);
+       mutex_init(&mtx, MUTEX_DEFAULT, IPL_NONE);
+
+       switch (what) {
+       case LOCKME_MTX:
+               mutex_enter(&mtx);
+               mutex_enter(&mtx);
+               break;
+       case LOCKME_RWDOUBLEX:
+               rw_enter(&rw, RW_WRITER);
+               rw_enter(&rw, RW_WRITER);
+               break;
+       case LOCKME_RWRX:
+               rw_enter(&rw, RW_READER);
+               rw_enter(&rw, RW_WRITER);
+               break;
+       case LOCKME_RWXR:
+               rw_enter(&rw, RW_WRITER);
+               rw_enter(&rw, RW_READER);
+               break;
+       case LOCKME_DOUBLEINIT:
+               mutex_init(&mtx, MUTEX_DEFAULT, IPL_NONE);
+               break;
+       case LOCKME_DOUBLEFREE:
+               mutex_destroy(&mtx);
+               mutex_destroy(&mtx);
+               break;
+       case LOCKME_DESTROYHELD:
+               mutex_enter(&mtx);
+               mutex_destroy(&mtx);
+               break;
+       case LOCKME_MEMFREE:
+               some = kmem_alloc(sizeof(*some), KM_SLEEP);
+               mutex_init(&some->mutexetum, MUTEX_DEFAULT, IPL_NONE);
+               kmem_free(some, sizeof(*some));
+               break;
+       }
+}
diff -r 27386367a1bc -r 11de70bd26ac tests/rump/rumpkern/Makefile
--- a/tests/rump/rumpkern/Makefile      Thu Jan 06 13:09:17 2011 +0000
+++ b/tests/rump/rumpkern/Makefile      Thu Jan 06 13:12:52 2011 +0000
@@ -1,10 +1,11 @@
-# $NetBSD: Makefile,v 1.11 2010/12/13 13:39:42 pooka Exp $
+# $NetBSD: Makefile,v 1.12 2011/01/06 13:12:52 pooka Exp $
 
 .include <bsd.own.mk>
 
 TESTSDIR=      ${TESTSBASE}/rump/rumpkern
 
 TESTS_C=       t_copy
+TESTS_C+=      t_kern
 TESTS_C+=      t_lwproc
 TESTS_C+=      t_modcmd
 TESTS_C+=      t_modlinkset
diff -r 27386367a1bc -r 11de70bd26ac tests/rump/rumpkern/t_kern.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/rump/rumpkern/t_kern.c      Thu Jan 06 13:12:52 2011 +0000
@@ -0,0 +1,100 @@
+/*     $NetBSD: t_kern.c,v 1.1 2011/01/06 13:12:52 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``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 FOUNDATION OR CONTRIBUTORS 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/types.h>
+#include <sys/signal.h>
+#include <sys/wait.h>
+
+#include <rump/rump.h>
+
+#include <atf-c.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "../../h_macros.h"
+#include "../kernspace/kernspace.h"
+
+#define LOCKFUN(_name_, _descr_,_needld_)                              \
+       ATF_TC(lockme_##_name_);                                        \
+       ATF_TC_HEAD(lockme_##_name_, tc) {                              \
+               atf_tc_set_md_var(tc, "descr", _descr_);                \
+       }                                                               \
+       ATF_TC_BODY(lockme_##_name_, tc) {                              \
+               locktest(tc, LOCKME_##_name_, _needld_);                \
+       }
+
+static void
+locktest(const atf_tc_t *tc, enum locktest lt, int needld)
+{
+       extern const int rump_lockdebug;
+       int status;
+
+       if (needld && !rump_lockdebug)
+               atf_tc_skip("test requires LOCKDEBUG kernel");
+
+       switch (fork()) {
+       case 0:
+               rump_init();
+               rump_schedule();
+               rumptest_lockme(lt);
+               rump_unschedule();
+               break;
+       default:
+               RL(wait(&status));
+               ATF_REQUIRE(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT);
+               break;
+       case -1:
+               atf_tc_fail("fork");
+       }
+}
+
+LOCKFUN(DESTROYHELD, "destroy lock while held", 0);
+LOCKFUN(DOUBLEFREE, "free lock twice", 0);
+LOCKFUN(DOUBLEINIT, "init lock twice", 1);
+LOCKFUN(MEMFREE, "free memory active lock is in", 1);
+LOCKFUN(MTX, "locking-against-self mutex", 0);
+LOCKFUN(RWDOUBLEX, "locking-against-self exclusive rwlock", 0);
+LOCKFUN(RWRX, "rw: first shared, then exclusive", 1);
+LOCKFUN(RWXR, "rw: first execusive, then shared", 0);
+
+ATF_TP_ADD_TCS(tp)
+{
+
+       ATF_TP_ADD_TC(tp, lockme_MTX);
+       ATF_TP_ADD_TC(tp, lockme_RWDOUBLEX);
+       ATF_TP_ADD_TC(tp, lockme_RWRX);
+       ATF_TP_ADD_TC(tp, lockme_RWXR);
+       ATF_TP_ADD_TC(tp, lockme_DOUBLEINIT);
+       ATF_TP_ADD_TC(tp, lockme_DOUBLEFREE);
+       ATF_TP_ADD_TC(tp, lockme_DESTROYHELD);
+       ATF_TP_ADD_TC(tp, lockme_MEMFREE);
+
+       return atf_no_error();
+}



Home | Main Index | Thread Index | Old Index