]> granicus.if.org Git - zfs/commitdiff
Reimplement rt_mutex_owner to fix build with DEBUG & PREEMPT_RT_FULL
authorclefru <clemens@endorphin.org>
Thu, 19 Jan 2017 22:41:38 +0000 (23:41 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 19 Jan 2017 22:41:38 +0000 (14:41 -0800)
rt_mutex_owner is internal to kernel/locking/rtmutex_common.h and
inaccessible for SPL via the public kernel headers. The way of
accessing the owner has been stable since at least 3.13 ([1], [2]),
which is masking the lowest bit in the owner pointer in rt_mutex. We
do the same.

[1] http://lxr.free-electrons.com/source/kernel/locking/rtmutex_common.h?v=3.13#L99
[2] http://lxr.free-electrons.com/source/kernel/locking/rtmutex_common.h?v=4.9#L78

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Clemens Fruhwirth <clemens@endorphin.org>
Closes #593

module/spl/spl-rwlock.c

index 9e96c4f27ec01593ccf8d348b590ee095a189dd7..d99ef4f922d5372289e1af757c7a382f6d5486ea 100644 (file)
 #if defined(CONFIG_PREEMPT_RT_FULL)
 
 #include <linux/rtmutex.h>
+#define        RT_MUTEX_OWNER_MASKALL  1UL
 
 static int
 __rwsem_tryupgrade(struct rw_semaphore *rwsem)
 {
-       ASSERT(rt_mutex_owner(&rwsem->lock) == current);
+
+       ASSERT((struct task_struct *)
+           ((unsigned long)rwsem->lock.owner & ~RT_MUTEX_OWNER_MASKALL) ==
+           current);
 
        /*
         * Under the realtime patch series, rwsem is implemented as a