Skip to content

Commit

Permalink
locktorture: Add nested locking to rtmutex torture tests
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
John Stultz authored and Paul E. McKenney committed Mar 7, 2023
1 parent 3e5aeaf commit ae4823e
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
35 changes: 35 additions & 0 deletions kernel/locking/locktorture.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/rcutorture/configs/lock/CFLIST
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ LOCK05
LOCK06
LOCK07
LOCK08
LOCK09
6 changes: 6 additions & 0 deletions tools/testing/selftests/rcutorture/configs/lock/LOCK09
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
locktorture.torture_type=rtmutex_lock locktorture.nested_locks=8

0 comments on commit ae4823e

Please sign in to comment.