258 lines
6.8 KiB
Diff
258 lines
6.8 KiB
Diff
From e2dd41db2409977998f7e227cba3aa8d92b17c3b Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Thu, 12 Aug 2021 18:13:39 +0200
|
|
Subject: [PATCH 084/171] 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>
|
|
---
|
|
lib/locking-selftest.c | 74 +++++++++++++++++++++++++-----------------
|
|
1 file changed, 44 insertions(+), 30 deletions(-)
|
|
|
|
diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
|
|
index b19006931f13..1266ea3726d7 100644
|
|
--- a/lib/locking-selftest.c
|
|
+++ b/lib/locking-selftest.c
|
|
@@ -1700,6 +1700,20 @@ 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_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_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 +1728,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 +1784,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 +1848,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 +1864,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 +1874,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 +1890,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 +1900,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 +1916,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 +1925,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 +1941,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 +1950,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 +1971,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 +1992,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 +2018,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 +2043,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 +2068,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;
|
|
|
|
--
|
|
2.38.1
|
|
|