Reimplement rt_mutex_owner to fix build with DEBUG & PREEMPT_RT_FULL

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
This commit is contained in:
clefru 2017-01-19 23:41:38 +01:00 committed by Brian Behlendorf
parent 5cb44271b4
commit 2d4d81c485

View File

@ -35,11 +35,15 @@
#if defined(CONFIG_PREEMPT_RT_FULL) #if defined(CONFIG_PREEMPT_RT_FULL)
#include <linux/rtmutex.h> #include <linux/rtmutex.h>
#define RT_MUTEX_OWNER_MASKALL 1UL
static int static int
__rwsem_tryupgrade(struct rw_semaphore *rwsem) __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 * Under the realtime patch series, rwsem is implemented as a