Module Name:    src
Committed By:   snj
Date:           Sat Jan 13 21:57:11 UTC 2018

Modified Files:
        src/lib/librumpuser [netbsd-8]: rumpfiber.c rumpuser_pth.c
            rumpuser_pth_dummy.c
        src/sys/kern [netbsd-8]: kern_condvar.c kern_lock.c kern_mutex.c
            kern_rwlock.c
        src/sys/rump/include/rump [netbsd-8]: rumpuser.h
        src/sys/rump/librump/rumpkern [netbsd-8]: locks.c

Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #495):
        lib/librumpuser/rumpfiber.c: revision 1.13
        lib/librumpuser/rumpuser_pth.c: revision 1.46
        lib/librumpuser/rumpuser_pth_dummy.c: revision 1.18
        sys/kern/kern_condvar.c: revision 1.40
        sys/kern/kern_lock.c: revision 1.161
        sys/kern/kern_mutex.c: revision 1.68
        sys/kern/kern_rwlock.c: revision 1.48
        sys/rump/include/rump/rumpuser.h: revision 1.115
        sys/rump/librump/rumpkern/locks.c: revision 1.76-1.79
Apply C99-style struct initialization to lockops_t
--
Tweak LOCKDEBUG macros (NFC)
--
Distinguish spin mutex and adaptive mutex on rump kernels for LOCKDEBUG
Formerly rump kernels treated the two types of mutexes as both adaptive for
LOCKDEBUG for some reasons.
Now we can detect violations of mutex restrictions on rump kernels such as
taking an adaptive mutex with holding a spin mutex as well as normal kernels.
--
rump: check if the mutex is surely owned by the caller in mutex_exit
Unlocking a not-owned mutex wasn't detected well (it could detect if the mutex
is not held by anyone but that's not enough). Let's check it (the check is the
same as normal kernel's mutex).
If LOCKDEBUG is enabled, give the check over LOCKDEBUG because it can provide
better debugging information.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.12.8.1 src/lib/librumpuser/rumpfiber.c
cvs rdiff -u -r1.45 -r1.45.8.1 src/lib/librumpuser/rumpuser_pth.c
cvs rdiff -u -r1.17 -r1.17.16.1 src/lib/librumpuser/rumpuser_pth_dummy.c
cvs rdiff -u -r1.35 -r1.35.10.1 src/sys/kern/kern_condvar.c
cvs rdiff -u -r1.158.6.1 -r1.158.6.2 src/sys/kern/kern_lock.c
cvs rdiff -u -r1.65 -r1.65.2.1 src/sys/kern/kern_mutex.c
cvs rdiff -u -r1.46 -r1.46.6.1 src/sys/kern/kern_rwlock.c
cvs rdiff -u -r1.114 -r1.114.10.1 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.74 -r1.74.2.1 src/sys/rump/librump/rumpkern/locks.c

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

Modified files:

Index: src/lib/librumpuser/rumpfiber.c
diff -u src/lib/librumpuser/rumpfiber.c:1.12 src/lib/librumpuser/rumpfiber.c:1.12.8.1
--- src/lib/librumpuser/rumpfiber.c:1.12	Sun Feb 15 00:54:32 2015
+++ src/lib/librumpuser/rumpfiber.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpfiber.c,v 1.12 2015/02/15 00:54:32 justin Exp $	*/
+/*	$NetBSD: rumpfiber.c,v 1.12.8.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*
  * Copyright (c) 2007-2013 Antti Kantee.  All Rights Reserved.
@@ -68,7 +68,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpfiber.c,v 1.12 2015/02/15 00:54:32 justin Exp $");
+__RCSID("$NetBSD: rumpfiber.c,v 1.12.8.1 2018/01/13 21:57:11 snj Exp $");
 #endif /* !lint */
 
 #include <sys/mman.h>
@@ -693,6 +693,13 @@ rumpuser_mutex_init(struct rumpuser_mtx 
 	*mtxp = mtx;
 }
 
+int
+rumpuser_mutex_spin_p(struct rumpuser_mtx *mtx)
+{
+
+	return (mtx->flags & RUMPUSER_MTX_SPIN) != 0;
+}
+
 void
 rumpuser_mutex_enter(struct rumpuser_mtx *mtx)
 {

Index: src/lib/librumpuser/rumpuser_pth.c
diff -u src/lib/librumpuser/rumpuser_pth.c:1.45 src/lib/librumpuser/rumpuser_pth.c:1.45.8.1
--- src/lib/librumpuser/rumpuser_pth.c:1.45	Fri Sep 18 10:56:25 2015
+++ src/lib/librumpuser/rumpuser_pth.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_pth.c,v 1.45 2015/09/18 10:56:25 pooka Exp $	*/
+/*	$NetBSD: rumpuser_pth.c,v 1.45.8.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth.c,v 1.45 2015/09/18 10:56:25 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_pth.c,v 1.45.8.1 2018/01/13 21:57:11 snj Exp $");
 #endif /* !lint */
 
 #include <sys/queue.h>
@@ -159,6 +159,13 @@ rumpuser_mutex_init(struct rumpuser_mtx 
 	*mtxp = mtx;
 }
 
+int
+rumpuser_mutex_spin_p(struct rumpuser_mtx *mtx)
+{
+
+	return (mtx->flags & RUMPUSER_MTX_SPIN) != 0;
+}
+
 static void
 mtxenter(struct rumpuser_mtx *mtx)
 {

Index: src/lib/librumpuser/rumpuser_pth_dummy.c
diff -u src/lib/librumpuser/rumpuser_pth_dummy.c:1.17 src/lib/librumpuser/rumpuser_pth_dummy.c:1.17.16.1
--- src/lib/librumpuser/rumpuser_pth_dummy.c:1.17	Tue Jun 17 06:43:21 2014
+++ src/lib/librumpuser/rumpuser_pth_dummy.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_pth_dummy.c,v 1.17 2014/06/17 06:43:21 alnsn Exp $	*/
+/*	$NetBSD: rumpuser_pth_dummy.c,v 1.17.16.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth_dummy.c,v 1.17 2014/06/17 06:43:21 alnsn Exp $");
+__RCSID("$NetBSD: rumpuser_pth_dummy.c,v 1.17.16.1 2018/01/13 21:57:11 snj Exp $");
 #endif /* !lint */
 
 #include <sys/time.h>
@@ -98,6 +98,13 @@ rumpuser_mutex_init(struct rumpuser_mtx 
 	*mtx = calloc(1, sizeof(struct rumpuser_mtx));
 }
 
+int
+rumpuser_mutex_spin_p(struct rumpuser_mtx *mtx)
+{
+
+	return false; /* XXX */
+}
+
 void
 rumpuser_mutex_enter(struct rumpuser_mtx *mtx)
 {

Index: src/sys/kern/kern_condvar.c
diff -u src/sys/kern/kern_condvar.c:1.35 src/sys/kern/kern_condvar.c:1.35.10.1
--- src/sys/kern/kern_condvar.c:1.35	Fri Aug  7 06:22:12 2015
+++ src/sys/kern/kern_condvar.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_condvar.c,v 1.35 2015/08/07 06:22:12 uebayasi Exp $	*/
+/*	$NetBSD: kern_condvar.c,v 1.35.10.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.35 2015/08/07 06:22:12 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.35.10.1 2018/01/13 21:57:11 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -78,9 +78,9 @@ static syncobj_t cv_syncobj = {
 };
 
 lockops_t cv_lockops = {
-	"Condition variable",
-	LOCKOPS_CV,
-	NULL
+	.lo_name = "Condition variable",
+	.lo_type = LOCKOPS_CV,
+	.lo_dump = NULL,
 };
 
 static const char deadcv[] = "deadcv";

Index: src/sys/kern/kern_lock.c
diff -u src/sys/kern/kern_lock.c:1.158.6.1 src/sys/kern/kern_lock.c:1.158.6.2
--- src/sys/kern/kern_lock.c:1.158.6.1	Thu Nov 30 14:40:46 2017
+++ src/sys/kern/kern_lock.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lock.c,v 1.158.6.1 2017/11/30 14:40:46 martin Exp $	*/
+/*	$NetBSD: kern_lock.c,v 1.158.6.2 2018/01/13 21:57:11 snj Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.158.6.1 2017/11/30 14:40:46 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lock.c,v 1.158.6.2 2018/01/13 21:57:11 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -120,9 +120,9 @@ do {									\
 void	_kernel_lock_dump(volatile void *);
 
 lockops_t _kernel_lock_ops = {
-	"Kernel lock",
-	LOCKOPS_SPIN,
-	_kernel_lock_dump
+	.lo_name = "Kernel lock",
+	.lo_type = LOCKOPS_SPIN,
+	.lo_dump = _kernel_lock_dump,
 };
 
 /*

Index: src/sys/kern/kern_mutex.c
diff -u src/sys/kern/kern_mutex.c:1.65 src/sys/kern/kern_mutex.c:1.65.2.1
--- src/sys/kern/kern_mutex.c:1.65	Mon May  1 21:35:25 2017
+++ src/sys/kern/kern_mutex.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_mutex.c,v 1.65 2017/05/01 21:35:25 pgoyette Exp $	*/
+/*	$NetBSD: kern_mutex.c,v 1.65.2.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
 #define	__MUTEX_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.65 2017/05/01 21:35:25 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.65.2.1 2018/01/13 21:57:11 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -268,15 +268,15 @@ static void	mutex_abort(const char *, si
 static void	mutex_dump(volatile void *);
 
 lockops_t mutex_spin_lockops = {
-	"Mutex",
-	LOCKOPS_SPIN,
-	mutex_dump
+	.lo_name = "Mutex",
+	.lo_type = LOCKOPS_SPIN,
+	.lo_dump = mutex_dump,
 };
 
 lockops_t mutex_adaptive_lockops = {
-	"Mutex",
-	LOCKOPS_SLEEP,
-	mutex_dump
+	.lo_name = "Mutex",
+	.lo_type = LOCKOPS_SLEEP,
+	.lo_dump = mutex_dump,
 };
 
 syncobj_t mutex_syncobj = {

Index: src/sys/kern/kern_rwlock.c
diff -u src/sys/kern/kern_rwlock.c:1.46 src/sys/kern/kern_rwlock.c:1.46.6.1
--- src/sys/kern/kern_rwlock.c:1.46	Thu Jan 26 04:11:56 2017
+++ src/sys/kern/kern_rwlock.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_rwlock.c,v 1.46 2017/01/26 04:11:56 christos Exp $	*/
+/*	$NetBSD: kern_rwlock.c,v 1.46.6.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.46 2017/01/26 04:11:56 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rwlock.c,v 1.46.6.1 2018/01/13 21:57:11 snj Exp $");
 
 #define	__RWLOCK_PRIVATE
 
@@ -148,9 +148,9 @@ __strong_alias(rw_tryenter,rw_vector_try
 #endif
 
 lockops_t rwlock_lockops = {
-	"Reader / writer lock",
-	LOCKOPS_SLEEP,
-	rw_dump
+	.lo_name = "Reader / writer lock",
+	.lo_type = LOCKOPS_SLEEP,
+	.lo_dump = rw_dump,
 };
 
 syncobj_t rw_syncobj = {

Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.114 src/sys/rump/include/rump/rumpuser.h:1.114.10.1
--- src/sys/rump/include/rump/rumpuser.h:1.114	Sat Jan  3 17:24:20 2015
+++ src/sys/rump/include/rump/rumpuser.h	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.h,v 1.114 2015/01/03 17:24:20 pooka Exp $	*/
+/*	$NetBSD: rumpuser.h,v 1.114.10.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*
  * Copyright (c) 2007-2013 Antti Kantee.  All Rights Reserved.
@@ -194,6 +194,7 @@ int  rumpuser_mutex_tryenter(struct rump
 void rumpuser_mutex_exit(struct rumpuser_mtx *);
 void rumpuser_mutex_destroy(struct rumpuser_mtx *);
 void rumpuser_mutex_owner(struct rumpuser_mtx *, struct lwp **);
+int  rumpuser_mutex_spin_p(struct rumpuser_mtx *);
 
 struct rumpuser_rw;
 enum rumprwlock { RUMPUSER_RW_READER, RUMPUSER_RW_WRITER };

Index: src/sys/rump/librump/rumpkern/locks.c
diff -u src/sys/rump/librump/rumpkern/locks.c:1.74 src/sys/rump/librump/rumpkern/locks.c:1.74.2.1
--- src/sys/rump/librump/rumpkern/locks.c:1.74	Mon May  1 21:35:26 2017
+++ src/sys/rump/librump/rumpkern/locks.c	Sat Jan 13 21:57:11 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: locks.c,v 1.74 2017/05/01 21:35:26 pgoyette Exp $	*/
+/*	$NetBSD: locks.c,v 1.74.2.1 2018/01/13 21:57:11 snj Exp $	*/
 
 /*
  * Copyright (c) 2007-2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.74 2017/05/01 21:35:26 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.74.2.1 2018/01/13 21:57:11 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -50,40 +50,45 @@ const int rump_lockdebug = 0;
 #ifdef LOCKDEBUG
 #include <sys/lockdebug.h>
 
-static lockops_t mutex_lockops = {
-	"mutex",
-	LOCKOPS_SLEEP,
-	NULL
+static lockops_t mutex_spin_lockops = {
+	.lo_name = "mutex",
+	.lo_type = LOCKOPS_SPIN,
+	.lo_dump = NULL,
+};
+static lockops_t mutex_adaptive_lockops = {
+	.lo_name = "mutex",
+	.lo_type = LOCKOPS_SLEEP,
+	.lo_dump = NULL,
 };
 static lockops_t rw_lockops = {
-	"rwlock",
-	LOCKOPS_SLEEP,
-	NULL
+	.lo_name = "rwlock",
+	.lo_type = LOCKOPS_SLEEP,
+	.lo_dump = NULL,
 };
 
 #define ALLOCK(lock, ops)				\
-    lockdebug_alloc(__func__, __LINE__, lock, ops,	\
-    (uintptr_t)__builtin_return_address(0))
-#define FREELOCK(lock)			\
-    lockdebug_free(__func__, __LINE__, lock)
+	lockdebug_alloc(__func__, __LINE__, lock, ops,	\
+	    (uintptr_t)__builtin_return_address(0))
+#define FREELOCK(lock)					\
+	lockdebug_free(__func__, __LINE__, lock)
 #define WANTLOCK(lock, shar)				\
-    lockdebug_wantlock(__func__, __LINE__, lock,	\
-    (uintptr_t)__builtin_return_address(0), shar)
+	lockdebug_wantlock(__func__, __LINE__, lock,	\
+	    (uintptr_t)__builtin_return_address(0), shar)
 #define LOCKED(lock, shar)				\
-    lockdebug_locked(__func__, __LINE__, lock, NULL,	\
-    (uintptr_t)__builtin_return_address(0), shar)
-#define UNLOCKED(lock, shar)		\
-    lockdebug_unlocked(__func__, __LINE__, lock,	\
-    (uintptr_t)__builtin_return_address(0), shar)
-#define BARRIER(lock, slp)		\
-    lockdebug_barrier(__func__, __LINE__, lock, slp)
+	lockdebug_locked(__func__, __LINE__, lock, NULL,\
+	    (uintptr_t)__builtin_return_address(0), shar)
+#define UNLOCKED(lock, shar)				\
+	lockdebug_unlocked(__func__, __LINE__, lock,	\
+	    (uintptr_t)__builtin_return_address(0), shar)
+#define BARRIER(lock, slp)				\
+	lockdebug_barrier(__func__, __LINE__, lock, slp)
 #else
-#define ALLOCK(a, b)
-#define FREELOCK(a)
-#define WANTLOCK(a, b)
-#define LOCKED(a, b)
-#define UNLOCKED(a, b)
-#define BARRIER(a, b)
+#define ALLOCK(a, b)	do {} while (0)
+#define FREELOCK(a)	do {} while (0)
+#define WANTLOCK(a, b)	do {} while (0)
+#define LOCKED(a, b)	do {} while (0)
+#define UNLOCKED(a, b)	do {} while (0)
+#define BARRIER(a, b)	do {} while (0)
 #endif
 
 /*
@@ -129,7 +134,10 @@ mutex_init(kmutex_t *mtx, kmutex_type_t 
 	if (isspin)
 		ruflags |= RUMPUSER_MTX_SPIN;
 	rumpuser_mutex_init((struct rumpuser_mtx **)mtx, ruflags);
-	ALLOCK(mtx, &mutex_lockops);
+	if (isspin)
+		ALLOCK(mtx, &mutex_spin_lockops);
+	else
+		ALLOCK(mtx, &mutex_adaptive_lockops);
 }
 
 void
@@ -145,7 +153,8 @@ mutex_enter(kmutex_t *mtx)
 {
 
 	WANTLOCK(mtx, 0);
-	BARRIER(mtx, 1);
+	if (!rumpuser_mutex_spin_p(RUMPMTX(mtx)))
+		BARRIER(mtx, 1);
 	rumpuser_mutex_enter(RUMPMTX(mtx));
 	LOCKED(mtx, false);
 }
@@ -154,8 +163,8 @@ void
 mutex_spin_enter(kmutex_t *mtx)
 {
 
+	KASSERT(rumpuser_mutex_spin_p(RUMPMTX(mtx)));
 	WANTLOCK(mtx, 0);
-	BARRIER(mtx, 1);
 	rumpuser_mutex_enter_nowrap(RUMPMTX(mtx));
 	LOCKED(mtx, false);
 }
@@ -177,6 +186,9 @@ void
 mutex_exit(kmutex_t *mtx)
 {
 
+#ifndef LOCKDEBUG
+	KASSERT(mutex_owned(mtx));
+#endif
 	UNLOCKED(mtx, false);
 	rumpuser_mutex_exit(RUMPMTX(mtx));
 }

Reply via email to