locktorture: Add nested locking to rtmutex torture tests
authorJohn Stultz <jstultz@google.com>
Tue, 21 Feb 2023 19:02:37 +0000 (19:02 +0000)
committerPaul E. McKenney <paulmck@kernel.org>
Tue, 7 Mar 2023 18:13:57 +0000 (10:13 -0800)
This patch adds randomized nested locking to the rtmutex torture
tests. Additionally it adds LOCK09 config files for testing
rtmutexes with nested locking.

Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: kernel-team@android.com
Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Co-developed-by: Connor O'Brien <connoro@google.com>
Signed-off-by: Connor O'Brien <connoro@google.com>
Signed-off-by: John Stultz <jstultz@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/locking/locktorture.c
tools/testing/selftests/rcutorture/configs/lock/CFLIST
tools/testing/selftests/rcutorture/configs/lock/LOCK09 [new file with mode: 0644]
tools/testing/selftests/rcutorture/configs/lock/LOCK09.boot [new file with mode: 0644]

index a4d15a9..c7f264a 100644 (file)
@@ -544,6 +544,28 @@ static struct lock_torture_ops ww_mutex_lock_ops = {
 
 #ifdef CONFIG_RT_MUTEXES
 static DEFINE_RT_MUTEX(torture_rtmutex);
+static struct rt_mutex torture_nested_rtmutexes[MAX_NESTED_LOCKS];
+static struct lock_class_key nested_rtmutex_keys[MAX_NESTED_LOCKS];
+
+static void torture_rtmutex_init(void)
+{
+       int i;
+
+       for (i = 0; i < MAX_NESTED_LOCKS; i++)
+               __rt_mutex_init(&torture_nested_rtmutexes[i], __func__,
+                               &nested_rtmutex_keys[i]);
+}
+
+static int torture_rtmutex_nested_lock(int tid __maybe_unused,
+                                      u32 lockset)
+{
+       int i;
+
+       for (i = 0; i < nested_locks; i++)
+               if (lockset & (1 << i))
+                       rt_mutex_lock(&torture_nested_rtmutexes[i]);
+       return 0;
+}
 
 static int torture_rtmutex_lock(int tid __maybe_unused)
 __acquires(torture_rtmutex)
@@ -585,11 +607,24 @@ static void torture_rt_boost_rtmutex(struct torture_random_state *trsp)
        __torture_rt_boost(trsp);
 }
 
+static void torture_rtmutex_nested_unlock(int tid __maybe_unused,
+                                         u32 lockset)
+{
+       int i;
+
+       for (i = nested_locks - 1; i >= 0; i--)
+               if (lockset & (1 << i))
+                       rt_mutex_unlock(&torture_nested_rtmutexes[i]);
+}
+
 static struct lock_torture_ops rtmutex_lock_ops = {
+       .init           = torture_rtmutex_init,
+       .nested_lock    = torture_rtmutex_nested_lock,
        .writelock      = torture_rtmutex_lock,
        .write_delay    = torture_rtmutex_delay,
        .task_boost     = torture_rt_boost_rtmutex,
        .writeunlock    = torture_rtmutex_unlock,
+       .nested_unlock  = torture_rtmutex_nested_unlock,
        .readlock       = NULL,
        .read_delay     = NULL,
        .readunlock     = NULL,
diff --git a/tools/testing/selftests/rcutorture/configs/lock/LOCK09 b/tools/testing/selftests/rcutorture/configs/lock/LOCK09
new file mode 100644 (file)
index 0000000..1d1da14
--- /dev/null
@@ -0,0 +1,6 @@
+CONFIG_SMP=y
+CONFIG_NR_CPUS=4
+CONFIG_HOTPLUG_CPU=y
+CONFIG_PREEMPT_NONE=n
+CONFIG_PREEMPT_VOLUNTARY=n
+CONFIG_PREEMPT=y
diff --git a/tools/testing/selftests/rcutorture/configs/lock/LOCK09.boot b/tools/testing/selftests/rcutorture/configs/lock/LOCK09.boot
new file mode 100644 (file)
index 0000000..fd5eff1
--- /dev/null
@@ -0,0 +1 @@
+locktorture.torture_type=rtmutex_lock locktorture.nested_locks=8