Fix mutex assertion
authorSimon Wilkinson <sxw@your-file-system.com>
Sun, 21 Oct 2012 19:07:44 +0000 (20:07 +0100)
committerDerrick Brashear <shadow@your-file-system.com>
Tue, 30 Oct 2012 11:59:07 +0000 (04:59 -0700)
commit3898f4d20500fbdbe60e36ecaf6b80f96913b84c
treebeaa8b09d57beb41b6bd39da558ece2440571555
parentd287e816988a98654ba6e0fd3aa053b20fd14663
Fix mutex assertion

RX mutexes have two mechanisms for asserting ownership of a mutex:
MUTEX_ISMINE, which returns true if the caller is the owner of the
mutex in question, and osirx_AssertMutex which fires an assertion if
the calling thread doesn't own a specified mutex.

Neither of these work with pthread mutexes on all platforms, and the
kernel support for MUTEX_ISMINE is dubious in places. Because in some
implementations, MUTEX_ISMINE tries to lock the mutex in question, a
failing call to MUTEX_ISMINE can lead to the process holding an
additional, unexpected, lock.

This patch reworks all of this, and uses the new opr mutex framework
so that we can do mutex assertions in userspace, too. We remove the
unsafe MUTEX_ISMINE macro, and replace it with MUTEX_ASSERT which
simply asserts if the specified mutex is not held by the current
thread. osirx_AssertMutex is removed as it is now redundant.
MUTEX_ASSERT will always work in kernel code.

For userspace, we provide opr_mutex_assert, which is implemented using
POSIX error checking mutexes. As error checking mutexes have a runtime
overhead, this is only available when configured with
--enable-debug-locks, the rest of the time calls to opr_mutex_assert are
no-ops.

Change-Id: I285ee2b558389fa3d63b786e4bc4420fa2126c80
Reviewed-on: http://gerrit.openafs.org/8282
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
19 files changed:
acinclude.m4
src/opr/lockstub.h
src/opr/opr_lock.h
src/rx/AIX/rx_kmutex.h
src/rx/DARWIN/rx_kmutex.h
src/rx/FBSD/rx_kmutex.h
src/rx/HPUX/rx_kmutex.h
src/rx/IRIX/rx_kmutex.h
src/rx/LINUX/rx_kmutex.h
src/rx/LINUX24/rx_kmutex.h
src/rx/NBSD/rx_kmutex.h
src/rx/OBSD/rx_kmutex.h
src/rx/SOLARIS/rx_kmutex.h
src/rx/UKERNEL/rx_kmutex.h
src/rx/rx.c
src/rx/rx_lwp.h
src/rx/rx_prototypes.h
src/rx/rx_pthread.h
src/vol/vutil.c