Module Name: src Committed By: ozaki-r Date: Wed Dec 27 09:01:53 UTC 2017
Modified Files: src/lib/librumpuser: rumpfiber.c rumpuser_pth.c rumpuser_pth_dummy.c src/sys/rump/include/rump: rumpuser.h src/sys/rump/librump/rumpkern: locks.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/lib/librumpuser/rumpfiber.c cvs rdiff -u -r1.45 -r1.46 src/lib/librumpuser/rumpuser_pth.c cvs rdiff -u -r1.17 -r1.18 src/lib/librumpuser/rumpuser_pth_dummy.c cvs rdiff -u -r1.114 -r1.115 src/sys/rump/include/rump/rumpuser.h cvs rdiff -u -r1.77 -r1.78 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.13 --- src/lib/librumpuser/rumpfiber.c:1.12 Sun Feb 15 00:54:32 2015 +++ src/lib/librumpuser/rumpfiber.c Wed Dec 27 09:01:53 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfiber.c,v 1.12 2015/02/15 00:54:32 justin Exp $ */ +/* $NetBSD: rumpfiber.c,v 1.13 2017/12/27 09:01:53 ozaki-r 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.13 2017/12/27 09:01:53 ozaki-r 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.46 --- src/lib/librumpuser/rumpuser_pth.c:1.45 Fri Sep 18 10:56:25 2015 +++ src/lib/librumpuser/rumpuser_pth.c Wed Dec 27 09:01:53 2017 @@ -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.46 2017/12/27 09:01:53 ozaki-r 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.46 2017/12/27 09:01:53 ozaki-r 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.18 --- src/lib/librumpuser/rumpuser_pth_dummy.c:1.17 Tue Jun 17 06:43:21 2014 +++ src/lib/librumpuser/rumpuser_pth_dummy.c Wed Dec 27 09:01:53 2017 @@ -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.18 2017/12/27 09:01:53 ozaki-r 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.18 2017/12/27 09:01:53 ozaki-r 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/rump/include/rump/rumpuser.h diff -u src/sys/rump/include/rump/rumpuser.h:1.114 src/sys/rump/include/rump/rumpuser.h:1.115 --- src/sys/rump/include/rump/rumpuser.h:1.114 Sat Jan 3 17:24:20 2015 +++ src/sys/rump/include/rump/rumpuser.h Wed Dec 27 09:01:53 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpuser.h,v 1.114 2015/01/03 17:24:20 pooka Exp $ */ +/* $NetBSD: rumpuser.h,v 1.115 2017/12/27 09:01:53 ozaki-r 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.77 src/sys/rump/librump/rumpkern/locks.c:1.78 --- src/sys/rump/librump/rumpkern/locks.c:1.77 Wed Dec 27 08:45:45 2017 +++ src/sys/rump/librump/rumpkern/locks.c Wed Dec 27 09:01:53 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: locks.c,v 1.77 2017/12/27 08:45:45 ozaki-r Exp $ */ +/* $NetBSD: locks.c,v 1.78 2017/12/27 09:01:53 ozaki-r 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.77 2017/12/27 08:45:45 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.78 2017/12/27 09:01:53 ozaki-r Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -50,7 +50,12 @@ const int rump_lockdebug = 0; #ifdef LOCKDEBUG #include <sys/lockdebug.h> -static lockops_t mutex_lockops = { +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, @@ -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); }