Commit 9059c940 authored by Lai Jiangshan's avatar Lai Jiangshan Committed by Paul E. McKenney

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: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 931ea9d1
...@@ -625,6 +625,11 @@ static int srcu_torture_completed(void) ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment