OpenZFS on Linux and FreeBSD
Go to file
Brian Behlendorf ede0bdffb6 Treat mutex->owner as volatile
When HAVE_MUTEX_OWNER is defined and we are directly accessing
mutex->owner treat is as volative with the ACCESS_ONCE() helper.
Without this you may get a stale cached value when accessing it
from different cpus.  This can result in incorrect behavior from
mutex_owned() and mutex_owner().  This is not a problem for the
!HAVE_MUTEX_OWNER case because in this case all the accesses
are covered by a spin lock which similarly gaurentees we will
not be accessing stale data.

Secondly, check CONFIG_SMP before allowing access to mutex->owner.
I see that for non-SMP setups the kernel does not track the owner
so we cannot rely on it.

Thirdly, check CONFIG_MUTEX_DEBUG when this is defined and the
HAVE_MUTEX_OWNER is defined surprisingly the mutex->owner will
not be cleared on mutex_exit().  When this is the case the SPL
needs to make sure to do it to ensure MUTEX_HELD() behaves as
expected or you will certainly assert in mutex_destroy().

Finally, improve the mutex regression tests.  For mutex_owned() we
now minimally check that it behaves correctly when checked from the
owner thread or the non-owner thread.  This subtle behaviour has bit
me before and I'd like to catch it early next time if it reappears.

As for mutex_owned() regression test additonally verify that
mutex->owner is always cleared on mutex_exit().
2010-06-28 16:02:57 -07:00
cmd Refresh autogen.sh products with automake 1.11.1. 2010-05-21 15:52:06 -07:00
config Add kmem_asprintf(), strfree(), strdup(), and minor cleanup. 2010-06-11 15:57:25 -07:00
include Treat mutex->owner as volatile 2010-06-28 16:02:57 -07:00
lib Refresh autogen.sh products with automake 1.11.1. 2010-05-21 15:52:06 -07:00
module Treat mutex->owner as volatile 2010-06-28 16:02:57 -07:00
patches Reimplement rwlocks for Linux lock profiling/analysis. 2009-09-18 16:09:47 -07:00
scripts Refresh autogen.sh products with automake 1.11.1. 2010-05-21 15:52:06 -07:00
.gitignore Ignore unsigned module build products 2010-03-11 14:29:17 -08:00
AUTHORS Public Release Prep 2010-05-17 15:18:00 -07:00
COPYING Public Release Prep 2010-05-17 15:18:00 -07:00
ChangeLog Re-Prep for 0.4.9 tag with a few more fixes and updated ChangeLog 2010-05-21 14:17:44 -07:00
DISCLAIMER Public Release Prep 2010-05-17 15:18:00 -07:00
INSTALL Public Release Prep 2010-05-17 15:18:00 -07:00
META Update META to version 0.5.0 2010-06-11 15:57:25 -07:00
Makefile.am Allow spl_config.h to be included by dependant packages (updated) 2010-03-22 14:45:33 -07:00
Makefile.in Refresh autogen.sh products with automake 1.11.1. 2010-05-21 15:52:06 -07:00
autogen.sh Public Release Prep 2010-05-17 15:18:00 -07:00
configure Add kmem_asprintf(), strfree(), strdup(), and minor cleanup. 2010-06-11 15:57:25 -07:00
configure.ac Public Release Prep 2010-05-17 15:18:00 -07:00
spl-modules.spec.in Minor spec file cleanup for RHEL6 package dependency. 2010-05-21 11:53:49 -07:00
spl.spec.in Remove usage of the __id_u macro for portability. 2009-10-05 12:51:58 -07:00
spl_config.h.in Add kmem_asprintf(), strfree(), strdup(), and minor cleanup. 2010-06-11 15:57:25 -07:00