locktorture: Add torture tests for percpu_rwsem
This commit adds percpu_rwsem tests based on the earlier rwsem tests. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
@ -36,6 +36,7 @@
|
|||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/percpu-rwsem.h>
|
||||||
#include <linux/torture.h>
|
#include <linux/torture.h>
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
@ -526,6 +527,48 @@ static struct lock_torture_ops rwsem_lock_ops = {
|
|||||||
.name = "rwsem_lock"
|
.name = "rwsem_lock"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include <linux/percpu-rwsem.h>
|
||||||
|
static struct percpu_rw_semaphore pcpu_rwsem;
|
||||||
|
|
||||||
|
void torture_percpu_rwsem_init(void)
|
||||||
|
{
|
||||||
|
BUG_ON(percpu_init_rwsem(&pcpu_rwsem));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int torture_percpu_rwsem_down_write(void) __acquires(pcpu_rwsem)
|
||||||
|
{
|
||||||
|
percpu_down_write(&pcpu_rwsem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void torture_percpu_rwsem_up_write(void) __releases(pcpu_rwsem)
|
||||||
|
{
|
||||||
|
percpu_up_write(&pcpu_rwsem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int torture_percpu_rwsem_down_read(void) __acquires(pcpu_rwsem)
|
||||||
|
{
|
||||||
|
percpu_down_read(&pcpu_rwsem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void torture_percpu_rwsem_up_read(void) __releases(pcpu_rwsem)
|
||||||
|
{
|
||||||
|
percpu_up_read(&pcpu_rwsem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct lock_torture_ops percpu_rwsem_lock_ops = {
|
||||||
|
.init = torture_percpu_rwsem_init,
|
||||||
|
.writelock = torture_percpu_rwsem_down_write,
|
||||||
|
.write_delay = torture_rwsem_write_delay,
|
||||||
|
.task_boost = torture_boost_dummy,
|
||||||
|
.writeunlock = torture_percpu_rwsem_up_write,
|
||||||
|
.readlock = torture_percpu_rwsem_down_read,
|
||||||
|
.read_delay = torture_rwsem_read_delay,
|
||||||
|
.readunlock = torture_percpu_rwsem_up_read,
|
||||||
|
.name = "percpu_rwsem_lock"
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lock torture writer kthread. Repeatedly acquires and releases
|
* Lock torture writer kthread. Repeatedly acquires and releases
|
||||||
* the lock, checking for duplicate acquisitions.
|
* the lock, checking for duplicate acquisitions.
|
||||||
@ -749,6 +792,7 @@ static int __init lock_torture_init(void)
|
|||||||
&rtmutex_lock_ops,
|
&rtmutex_lock_ops,
|
||||||
#endif
|
#endif
|
||||||
&rwsem_lock_ops,
|
&rwsem_lock_ops,
|
||||||
|
&percpu_rwsem_lock_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!torture_init_begin(torture_type, verbose, &torture_runnable))
|
if (!torture_init_begin(torture_type, verbose, &torture_runnable))
|
||||||
|
@ -3,3 +3,4 @@ LOCK02
|
|||||||
LOCK03
|
LOCK03
|
||||||
LOCK04
|
LOCK04
|
||||||
LOCK05
|
LOCK05
|
||||||
|
LOCK06
|
||||||
|
6
tools/testing/selftests/rcutorture/configs/lock/LOCK06
Normal file
6
tools/testing/selftests/rcutorture/configs/lock/LOCK06
Normal file
@ -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
|
@ -0,0 +1 @@
|
|||||||
|
locktorture.torture_type=percpu_rwsem_lock
|
Reference in New Issue
Block a user