forked from Minki/linux
lockdep/selftests: Adapt ww-tests for PREEMPT_RT
The ww-mutex selftest operates directly on ww_mutex::base and assumes its type is struct mutex. This isn't true on PREEMPT_RT which turns the mutex into a rtmutex. Add a ww_mutex_base_ abstraction which maps to the relevant mutex_ or rt_mutex_ function. Change the CONFIG_DEBUG_MUTEXES ifdef to DEBUG_WW_MUTEXES. The latter is true for the MUTEX and RTMUTEX implementation of WW-MUTEX. The assignment is required in order to pass the tests. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20211129174654.668506-10-bigeasy@linutronix.de
This commit is contained in:
parent
a529f8db89
commit
9a75bd0c52
@ -1700,6 +1700,22 @@ static void ww_test_fail_acquire(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
#define ww_mutex_base_lock(b) rt_mutex_lock(b)
|
||||
#define ww_mutex_base_trylock(b) rt_mutex_trylock(b)
|
||||
#define ww_mutex_base_lock_nest_lock(b, b2) rt_mutex_lock_nest_lock(b, b2)
|
||||
#define ww_mutex_base_lock_interruptible(b) rt_mutex_lock_interruptible(b)
|
||||
#define ww_mutex_base_lock_killable(b) rt_mutex_lock_killable(b)
|
||||
#define ww_mutex_base_unlock(b) rt_mutex_unlock(b)
|
||||
#else
|
||||
#define ww_mutex_base_lock(b) mutex_lock(b)
|
||||
#define ww_mutex_base_trylock(b) mutex_trylock(b)
|
||||
#define ww_mutex_base_lock_nest_lock(b, b2) mutex_lock_nest_lock(b, b2)
|
||||
#define ww_mutex_base_lock_interruptible(b) mutex_lock_interruptible(b)
|
||||
#define ww_mutex_base_lock_killable(b) mutex_lock_killable(b)
|
||||
#define ww_mutex_base_unlock(b) mutex_unlock(b)
|
||||
#endif
|
||||
|
||||
static void ww_test_normal(void)
|
||||
{
|
||||
int ret;
|
||||
@ -1714,50 +1730,50 @@ static void ww_test_normal(void)
|
||||
|
||||
/* mutex_lock (and indirectly, mutex_lock_nested) */
|
||||
o.ctx = (void *)~0UL;
|
||||
mutex_lock(&o.base);
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_lock(&o.base);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
|
||||
/* mutex_lock_interruptible (and *_nested) */
|
||||
o.ctx = (void *)~0UL;
|
||||
ret = mutex_lock_interruptible(&o.base);
|
||||
ret = ww_mutex_base_lock_interruptible(&o.base);
|
||||
if (!ret)
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
else
|
||||
WARN_ON(1);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
|
||||
/* mutex_lock_killable (and *_nested) */
|
||||
o.ctx = (void *)~0UL;
|
||||
ret = mutex_lock_killable(&o.base);
|
||||
ret = ww_mutex_base_lock_killable(&o.base);
|
||||
if (!ret)
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
else
|
||||
WARN_ON(1);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
|
||||
/* trylock, succeeding */
|
||||
o.ctx = (void *)~0UL;
|
||||
ret = mutex_trylock(&o.base);
|
||||
ret = ww_mutex_base_trylock(&o.base);
|
||||
WARN_ON(!ret);
|
||||
if (ret)
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
else
|
||||
WARN_ON(1);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
|
||||
/* trylock, failing */
|
||||
o.ctx = (void *)~0UL;
|
||||
mutex_lock(&o.base);
|
||||
ret = mutex_trylock(&o.base);
|
||||
ww_mutex_base_lock(&o.base);
|
||||
ret = ww_mutex_base_trylock(&o.base);
|
||||
WARN_ON(ret);
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
|
||||
/* nest_lock */
|
||||
o.ctx = (void *)~0UL;
|
||||
mutex_lock_nest_lock(&o.base, &t);
|
||||
mutex_unlock(&o.base);
|
||||
ww_mutex_base_lock_nest_lock(&o.base, &t);
|
||||
ww_mutex_base_unlock(&o.base);
|
||||
WARN_ON(o.ctx != (void *)~0UL);
|
||||
}
|
||||
|
||||
@ -1770,7 +1786,7 @@ static void ww_test_two_contexts(void)
|
||||
static void ww_test_diff_class(void)
|
||||
{
|
||||
WWAI(&t);
|
||||
#ifdef CONFIG_DEBUG_MUTEXES
|
||||
#ifdef DEBUG_WW_MUTEXES
|
||||
t.ww_class = NULL;
|
||||
#endif
|
||||
WWL(&o, &t);
|
||||
@ -1834,7 +1850,7 @@ static void ww_test_edeadlk_normal(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
o2.ctx = &t2;
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
|
||||
@ -1850,7 +1866,7 @@ static void ww_test_edeadlk_normal(void)
|
||||
|
||||
o2.ctx = NULL;
|
||||
mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
|
||||
mutex_unlock(&o2.base);
|
||||
ww_mutex_base_unlock(&o2.base);
|
||||
WWU(&o);
|
||||
|
||||
WWL(&o2, &t);
|
||||
@ -1860,7 +1876,7 @@ static void ww_test_edeadlk_normal_slow(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
@ -1876,7 +1892,7 @@ static void ww_test_edeadlk_normal_slow(void)
|
||||
|
||||
o2.ctx = NULL;
|
||||
mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
|
||||
mutex_unlock(&o2.base);
|
||||
ww_mutex_base_unlock(&o2.base);
|
||||
WWU(&o);
|
||||
|
||||
ww_mutex_lock_slow(&o2, &t);
|
||||
@ -1886,7 +1902,7 @@ static void ww_test_edeadlk_no_unlock(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
o2.ctx = &t2;
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
|
||||
@ -1902,7 +1918,7 @@ static void ww_test_edeadlk_no_unlock(void)
|
||||
|
||||
o2.ctx = NULL;
|
||||
mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
|
||||
mutex_unlock(&o2.base);
|
||||
ww_mutex_base_unlock(&o2.base);
|
||||
|
||||
WWL(&o2, &t);
|
||||
}
|
||||
@ -1911,7 +1927,7 @@ static void ww_test_edeadlk_no_unlock_slow(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
@ -1927,7 +1943,7 @@ static void ww_test_edeadlk_no_unlock_slow(void)
|
||||
|
||||
o2.ctx = NULL;
|
||||
mutex_acquire(&o2.base.dep_map, 0, 1, _THIS_IP_);
|
||||
mutex_unlock(&o2.base);
|
||||
ww_mutex_base_unlock(&o2.base);
|
||||
|
||||
ww_mutex_lock_slow(&o2, &t);
|
||||
}
|
||||
@ -1936,7 +1952,7 @@ static void ww_test_edeadlk_acquire_more(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
@ -1957,7 +1973,7 @@ static void ww_test_edeadlk_acquire_more_slow(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
@ -1978,11 +1994,11 @@ static void ww_test_edeadlk_acquire_more_edeadlk(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
mutex_lock(&o3.base);
|
||||
ww_mutex_base_lock(&o3.base);
|
||||
mutex_release(&o3.base.dep_map, _THIS_IP_);
|
||||
o3.ctx = &t2;
|
||||
|
||||
@ -2004,11 +2020,11 @@ static void ww_test_edeadlk_acquire_more_edeadlk_slow(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
mutex_lock(&o3.base);
|
||||
ww_mutex_base_lock(&o3.base);
|
||||
mutex_release(&o3.base.dep_map, _THIS_IP_);
|
||||
o3.ctx = &t2;
|
||||
|
||||
@ -2029,7 +2045,7 @@ static void ww_test_edeadlk_acquire_wrong(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
@ -2054,7 +2070,7 @@ static void ww_test_edeadlk_acquire_wrong_slow(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&o2.base);
|
||||
ww_mutex_base_lock(&o2.base);
|
||||
mutex_release(&o2.base.dep_map, _THIS_IP_);
|
||||
o2.ctx = &t2;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user