rcu: Add rcutorture test for call_srcu()
Add srcu_torture_deferred_free() for srcu_ops so as to test the new call_srcu(). Rename the original srcu_ops to srcu_sync_ops. Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
parent
931ea9d1a6
commit
9059c94017
@ -625,6 +625,11 @@ static int srcu_torture_completed(void)
|
|||||||
return srcu_batches_completed(&srcu_ctl);
|
return srcu_batches_completed(&srcu_ctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void srcu_torture_deferred_free(struct rcu_torture *rp)
|
||||||
|
{
|
||||||
|
call_srcu(&srcu_ctl, &rp->rtort_rcu, rcu_torture_cb);
|
||||||
|
}
|
||||||
|
|
||||||
static void srcu_torture_synchronize(void)
|
static void srcu_torture_synchronize(void)
|
||||||
{
|
{
|
||||||
synchronize_srcu(&srcu_ctl);
|
synchronize_srcu(&srcu_ctl);
|
||||||
@ -654,7 +659,7 @@ static struct rcu_torture_ops srcu_ops = {
|
|||||||
.read_delay = srcu_read_delay,
|
.read_delay = srcu_read_delay,
|
||||||
.readunlock = srcu_torture_read_unlock,
|
.readunlock = srcu_torture_read_unlock,
|
||||||
.completed = srcu_torture_completed,
|
.completed = srcu_torture_completed,
|
||||||
.deferred_free = rcu_sync_torture_deferred_free,
|
.deferred_free = srcu_torture_deferred_free,
|
||||||
.sync = srcu_torture_synchronize,
|
.sync = srcu_torture_synchronize,
|
||||||
.call = NULL,
|
.call = NULL,
|
||||||
.cb_barrier = NULL,
|
.cb_barrier = NULL,
|
||||||
@ -662,6 +667,21 @@ static struct rcu_torture_ops srcu_ops = {
|
|||||||
.name = "srcu"
|
.name = "srcu"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct rcu_torture_ops srcu_sync_ops = {
|
||||||
|
.init = srcu_torture_init,
|
||||||
|
.cleanup = srcu_torture_cleanup,
|
||||||
|
.readlock = srcu_torture_read_lock,
|
||||||
|
.read_delay = srcu_read_delay,
|
||||||
|
.readunlock = srcu_torture_read_unlock,
|
||||||
|
.completed = srcu_torture_completed,
|
||||||
|
.deferred_free = rcu_sync_torture_deferred_free,
|
||||||
|
.sync = srcu_torture_synchronize,
|
||||||
|
.call = NULL,
|
||||||
|
.cb_barrier = NULL,
|
||||||
|
.stats = srcu_torture_stats,
|
||||||
|
.name = "srcu_sync"
|
||||||
|
};
|
||||||
|
|
||||||
static int srcu_torture_read_lock_raw(void) __acquires(&srcu_ctl)
|
static int srcu_torture_read_lock_raw(void) __acquires(&srcu_ctl)
|
||||||
{
|
{
|
||||||
return srcu_read_lock_raw(&srcu_ctl);
|
return srcu_read_lock_raw(&srcu_ctl);
|
||||||
@ -679,7 +699,7 @@ static struct rcu_torture_ops srcu_raw_ops = {
|
|||||||
.read_delay = srcu_read_delay,
|
.read_delay = srcu_read_delay,
|
||||||
.readunlock = srcu_torture_read_unlock_raw,
|
.readunlock = srcu_torture_read_unlock_raw,
|
||||||
.completed = srcu_torture_completed,
|
.completed = srcu_torture_completed,
|
||||||
.deferred_free = rcu_sync_torture_deferred_free,
|
.deferred_free = srcu_torture_deferred_free,
|
||||||
.sync = srcu_torture_synchronize,
|
.sync = srcu_torture_synchronize,
|
||||||
.call = NULL,
|
.call = NULL,
|
||||||
.cb_barrier = NULL,
|
.cb_barrier = NULL,
|
||||||
@ -687,6 +707,21 @@ static struct rcu_torture_ops srcu_raw_ops = {
|
|||||||
.name = "srcu_raw"
|
.name = "srcu_raw"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct rcu_torture_ops srcu_raw_sync_ops = {
|
||||||
|
.init = srcu_torture_init,
|
||||||
|
.cleanup = srcu_torture_cleanup,
|
||||||
|
.readlock = srcu_torture_read_lock_raw,
|
||||||
|
.read_delay = srcu_read_delay,
|
||||||
|
.readunlock = srcu_torture_read_unlock_raw,
|
||||||
|
.completed = srcu_torture_completed,
|
||||||
|
.deferred_free = rcu_sync_torture_deferred_free,
|
||||||
|
.sync = srcu_torture_synchronize,
|
||||||
|
.call = NULL,
|
||||||
|
.cb_barrier = NULL,
|
||||||
|
.stats = srcu_torture_stats,
|
||||||
|
.name = "srcu_raw_sync"
|
||||||
|
};
|
||||||
|
|
||||||
static void srcu_torture_synchronize_expedited(void)
|
static void srcu_torture_synchronize_expedited(void)
|
||||||
{
|
{
|
||||||
synchronize_srcu_expedited(&srcu_ctl);
|
synchronize_srcu_expedited(&srcu_ctl);
|
||||||
@ -1685,7 +1720,7 @@ static int rcu_torture_barrier_init(void)
|
|||||||
for (i = 0; i < n_barrier_cbs; i++) {
|
for (i = 0; i < n_barrier_cbs; i++) {
|
||||||
init_waitqueue_head(&barrier_cbs_wq[i]);
|
init_waitqueue_head(&barrier_cbs_wq[i]);
|
||||||
barrier_cbs_tasks[i] = kthread_run(rcu_torture_barrier_cbs,
|
barrier_cbs_tasks[i] = kthread_run(rcu_torture_barrier_cbs,
|
||||||
(void *)i,
|
(void *)(long)i,
|
||||||
"rcu_torture_barrier_cbs");
|
"rcu_torture_barrier_cbs");
|
||||||
if (IS_ERR(barrier_cbs_tasks[i])) {
|
if (IS_ERR(barrier_cbs_tasks[i])) {
|
||||||
ret = PTR_ERR(barrier_cbs_tasks[i]);
|
ret = PTR_ERR(barrier_cbs_tasks[i]);
|
||||||
@ -1873,7 +1908,8 @@ rcu_torture_init(void)
|
|||||||
static struct rcu_torture_ops *torture_ops[] =
|
static struct rcu_torture_ops *torture_ops[] =
|
||||||
{ &rcu_ops, &rcu_sync_ops, &rcu_expedited_ops,
|
{ &rcu_ops, &rcu_sync_ops, &rcu_expedited_ops,
|
||||||
&rcu_bh_ops, &rcu_bh_sync_ops, &rcu_bh_expedited_ops,
|
&rcu_bh_ops, &rcu_bh_sync_ops, &rcu_bh_expedited_ops,
|
||||||
&srcu_ops, &srcu_raw_ops, &srcu_expedited_ops,
|
&srcu_ops, &srcu_sync_ops, &srcu_raw_ops,
|
||||||
|
&srcu_raw_sync_ops, &srcu_expedited_ops,
|
||||||
&sched_ops, &sched_sync_ops, &sched_expedited_ops, };
|
&sched_ops, &sched_sync_ops, &sched_expedited_ops, };
|
||||||
|
|
||||||
mutex_lock(&fullstop_mutex);
|
mutex_lock(&fullstop_mutex);
|
||||||
|
Loading…
Reference in New Issue
Block a user