Module Name: src Committed By: pgoyette Date: Mon May 1 21:35:26 UTC 2017
Modified Files: src/sys/kern: kern_mutex.c subr_lockdebug.c src/sys/rump/librump/rumpkern: locks.c src/sys/sys: mutex.h Log Message: Introduce mutex_ownable() to determine if it is possible for the current process to acquire a mutex. To generate a diff of this commit: cvs rdiff -u -r1.64 -r1.65 src/sys/kern/kern_mutex.c cvs rdiff -u -r1.55 -r1.56 src/sys/kern/subr_lockdebug.c cvs rdiff -u -r1.73 -r1.74 src/sys/rump/librump/rumpkern/locks.c cvs rdiff -u -r1.20 -r1.21 src/sys/sys/mutex.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_mutex.c diff -u src/sys/kern/kern_mutex.c:1.64 src/sys/kern/kern_mutex.c:1.65 --- src/sys/kern/kern_mutex.c:1.64 Thu Jan 26 04:11:56 2017 +++ src/sys/kern/kern_mutex.c Mon May 1 21:35:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_mutex.c,v 1.64 2017/01/26 04:11:56 christos Exp $ */ +/* $NetBSD: kern_mutex.c,v 1.65 2017/05/01 21:35:25 pgoyette 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.64 2017/01/26 04:11:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_mutex.c,v 1.65 2017/05/01 21:35:25 pgoyette Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -75,6 +75,9 @@ __KERNEL_RCSID(0, "$NetBSD: kern_mutex.c #define MUTEX_WANTLOCK(mtx) \ LOCKDEBUG_WANTLOCK(MUTEX_DEBUG_P(mtx), (mtx), \ (uintptr_t)__builtin_return_address(0), 0) +#define MUTEX_TESTLOCK(mtx) \ + LOCKDEBUG_WANTLOCK(MUTEX_DEBUG_P(mtx), (mtx), \ + (uintptr_t)__builtin_return_address(0), -1) #define MUTEX_LOCKED(mtx) \ LOCKDEBUG_LOCKED(MUTEX_DEBUG_P(mtx), (mtx), NULL, \ (uintptr_t)__builtin_return_address(0), 0) @@ -831,6 +834,23 @@ mutex_owner(kmutex_t *mtx) } /* + * mutex_ownable: + * + * When compiled with DEBUG and LOCKDEBUG defined, ensure that + * the mutex is available. We cannot use !mutex_owned() since + * that won't work correctly for spin mutexes. + */ +int +mutex_ownable(kmutex_t *mtx) +{ + +#ifdef LOCKDEBUG + MUTEX_TESTLOCK(mtx); +#endif + return 1; +} + +/* * mutex_tryenter: * * Try to acquire the mutex; return non-zero if we did. Index: src/sys/kern/subr_lockdebug.c diff -u src/sys/kern/subr_lockdebug.c:1.55 src/sys/kern/subr_lockdebug.c:1.56 --- src/sys/kern/subr_lockdebug.c:1.55 Thu Jan 26 04:11:56 2017 +++ src/sys/kern/subr_lockdebug.c Mon May 1 21:35:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_lockdebug.c,v 1.55 2017/01/26 04:11:56 christos Exp $ */ +/* $NetBSD: subr_lockdebug.c,v 1.56 2017/05/01 21:35:26 pgoyette Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.55 2017/01/26 04:11:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.56 2017/05/01 21:35:26 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -417,7 +417,9 @@ lockdebug_more(int s) /* * lockdebug_wantlock: * - * Process the preamble to a lock acquire. + * Process the preamble to a lock acquire. The "shared" + * parameter controls which ld_{ex,sh}want counter is + * updated; a negative value of shared updates neither. */ void lockdebug_wantlock(const char *func, size_t line, @@ -454,9 +456,9 @@ lockdebug_wantlock(const char *func, siz return; } } - if (shared) + if (shared > 0) ld->ld_shwant++; - else + else if (shared == 0) ld->ld_exwant++; if (recurse) { lockdebug_abort1(func, line, ld, s, "locking against myself", Index: src/sys/rump/librump/rumpkern/locks.c diff -u src/sys/rump/librump/rumpkern/locks.c:1.73 src/sys/rump/librump/rumpkern/locks.c:1.74 --- src/sys/rump/librump/rumpkern/locks.c:1.73 Fri Jan 27 09:50:47 2017 +++ src/sys/rump/librump/rumpkern/locks.c Mon May 1 21:35:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: locks.c,v 1.73 2017/01/27 09:50:47 ozaki-r Exp $ */ +/* $NetBSD: locks.c,v 1.74 2017/05/01 21:35:26 pgoyette 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.73 2017/01/27 09:50:47 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.74 2017/05/01 21:35:26 pgoyette Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -183,6 +183,16 @@ mutex_exit(kmutex_t *mtx) __strong_alias(mutex_spin_exit,mutex_exit); int +mutex_ownable(kmutex_t *mtx) +{ + +#ifdef LOCKDEBUG + WANTLOCK(mtx, -1); +#endif + return 1; +} + +int mutex_owned(kmutex_t *mtx) { Index: src/sys/sys/mutex.h diff -u src/sys/sys/mutex.h:1.20 src/sys/sys/mutex.h:1.21 --- src/sys/sys/mutex.h:1.20 Mon Feb 8 09:54:27 2010 +++ src/sys/sys/mutex.h Mon May 1 21:35:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mutex.h,v 1.20 2010/02/08 09:54:27 skrll Exp $ */ +/* $NetBSD: mutex.h,v 1.21 2017/05/01 21:35:26 pgoyette Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -204,6 +204,7 @@ void mutex_spin_exit(kmutex_t *); int mutex_tryenter(kmutex_t *); int mutex_owned(kmutex_t *); +int mutex_ownable(kmutex_t *); lwp_t *mutex_owner(kmutex_t *); void mutex_obj_init(void);