Skip to content

Commit

Permalink
locktorture: Add nested locking to mutex torture tests
Browse files Browse the repository at this point in the history
This patch adds randomized nested locking to the mutex torture
tests, as well as new LOCK08 config files for testing mutexes
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 b633432 commit 3e5aeaf
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 @@ -370,6 +370,28 @@ static struct lock_torture_ops rw_lock_irq_ops = {
};

static DEFINE_MUTEX(torture_mutex);
static struct mutex torture_nested_mutexes[MAX_NESTED_LOCKS];
static struct lock_class_key nested_mutex_keys[MAX_NESTED_LOCKS];

static void torture_mutex_init(void)
{
int i;

for (i = 0; i < MAX_NESTED_LOCKS; i++)
__mutex_init(&torture_nested_mutexes[i], __func__,
&nested_mutex_keys[i]);
}

static int torture_mutex_nested_lock(int tid __maybe_unused,
u32 lockset)
{
int i;

for (i = 0; i < nested_locks; i++)
if (lockset & (1 << i))
mutex_lock(&torture_nested_mutexes[i]);
return 0;
}

static int torture_mutex_lock(int tid __maybe_unused)
__acquires(torture_mutex)
Expand Down Expand Up @@ -398,11 +420,24 @@ __releases(torture_mutex)
mutex_unlock(&torture_mutex);
}

static void torture_mutex_nested_unlock(int tid __maybe_unused,
u32 lockset)
{
int i;

for (i = nested_locks - 1; i >= 0; i--)
if (lockset & (1 << i))
mutex_unlock(&torture_nested_mutexes[i]);
}

static struct lock_torture_ops mutex_lock_ops = {
.init = torture_mutex_init,
.nested_lock = torture_mutex_nested_lock,
.writelock = torture_mutex_lock,
.write_delay = torture_mutex_delay,
.task_boost = torture_rt_boost,
.writeunlock = torture_mutex_unlock,
.nested_unlock = torture_mutex_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 @@ -5,3 +5,4 @@ LOCK04
LOCK05
LOCK06
LOCK07
LOCK08
6 changes: 6 additions & 0 deletions tools/testing/selftests/rcutorture/configs/lock/LOCK08
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=mutex_lock locktorture.nested_locks=8

0 comments on commit 3e5aeaf

Please sign in to comment.