Revert "Remove misguided HAVE_MUTEX_OWNER check"
This reverts commit d89616fda8
which
introduced some build failures which need to be resolved before
this can be merged.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #633
This commit is contained in:
parent
d89616fda8
commit
549423c0d4
|
@ -49,6 +49,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
|||
SPL_AC_USLEEP_RANGE
|
||||
SPL_AC_KMEM_CACHE_ALLOCFLAGS
|
||||
SPL_AC_WAIT_ON_BIT
|
||||
SPL_AC_MUTEX_OWNER
|
||||
SPL_AC_INODE_LOCK
|
||||
SPL_AC_GROUP_INFO_GID
|
||||
SPL_AC_KMEM_CACHE_CREATE_USERCOPY
|
||||
|
@ -1561,6 +1562,35 @@ AC_DEFUN([SPL_AC_WAIT_ON_BIT], [
|
|||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check whether mutex has owner with task_struct type.
|
||||
dnl #
|
||||
dnl # Note that before Linux 3.0, mutex owner is of type thread_info.
|
||||
dnl #
|
||||
dnl # Note that in Linux 3.18, the condition for owner is changed from
|
||||
dnl # defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP) to
|
||||
dnl # defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)
|
||||
dnl #
|
||||
AC_DEFUN([SPL_AC_MUTEX_OWNER], [
|
||||
AC_MSG_CHECKING([whether mutex has owner])
|
||||
tmp_flags="$EXTRA_KCFLAGS"
|
||||
EXTRA_KCFLAGS="-Werror"
|
||||
SPL_LINUX_TRY_COMPILE([
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/spinlock.h>
|
||||
],[
|
||||
DEFINE_MUTEX(m);
|
||||
struct task_struct *t __attribute__ ((unused));
|
||||
t = m.owner;
|
||||
],[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_MUTEX_OWNER, 1, [yes])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
EXTRA_KCFLAGS="$tmp_flags"
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 4.7 API change
|
||||
dnl # i_mutex is changed to i_rwsem. Instead of directly using
|
||||
|
|
|
@ -40,8 +40,10 @@ typedef enum {
|
|||
typedef struct {
|
||||
struct mutex m_mutex;
|
||||
spinlock_t m_lock; /* used for serializing mutex_exit */
|
||||
#ifndef HAVE_MUTEX_OWNER
|
||||
/* only when kernel doesn't have owner */
|
||||
kthread_t *m_owner;
|
||||
#endif
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
kmutex_type_t m_type;
|
||||
#endif /* CONFIG_LOCKDEP */
|
||||
|
@ -56,16 +58,24 @@ spl_mutex_set_owner(kmutex_t *mp)
|
|||
* kernel will handle its owner, so we don't need to do anything if it
|
||||
* is defined.
|
||||
*/
|
||||
#ifndef HAVE_MUTEX_OWNER
|
||||
mp->m_owner = current;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
spl_mutex_clear_owner(kmutex_t *mp)
|
||||
{
|
||||
#ifndef HAVE_MUTEX_OWNER
|
||||
mp->m_owner = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_MUTEX_OWNER
|
||||
#define mutex_owner(mp) (ACCESS_ONCE(MUTEX(mp)->owner))
|
||||
#else
|
||||
#define mutex_owner(mp) (ACCESS_ONCE((mp)->m_owner))
|
||||
#endif
|
||||
#define mutex_owned(mp) (mutex_owner(mp) == current)
|
||||
#define MUTEX_HELD(mp) mutex_owned(mp)
|
||||
#define MUTEX_NOT_HELD(mp) (!MUTEX_HELD(mp))
|
||||
|
|
Loading…
Reference in New Issue