Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+40 −4
Original line number Diff line number Diff line
@@ -625,6 +625,11 @@ static int srcu_torture_completed(void)
	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)
{
	synchronize_srcu(&srcu_ctl);
@@ -654,7 +659,7 @@ static struct rcu_torture_ops srcu_ops = {
	.read_delay	= srcu_read_delay,
	.readunlock	= srcu_torture_read_unlock,
	.completed	= srcu_torture_completed,
	.deferred_free	= rcu_sync_torture_deferred_free,
	.deferred_free	= srcu_torture_deferred_free,
	.sync		= srcu_torture_synchronize,
	.call		= NULL,
	.cb_barrier	= NULL,
@@ -662,6 +667,21 @@ static struct rcu_torture_ops srcu_ops = {
	.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)
{
	return srcu_read_lock_raw(&srcu_ctl);
@@ -679,7 +699,7 @@ static struct rcu_torture_ops srcu_raw_ops = {
	.read_delay	= srcu_read_delay,
	.readunlock	= srcu_torture_read_unlock_raw,
	.completed	= srcu_torture_completed,
	.deferred_free	= rcu_sync_torture_deferred_free,
	.deferred_free	= srcu_torture_deferred_free,
	.sync		= srcu_torture_synchronize,
	.call		= NULL,
	.cb_barrier	= NULL,
@@ -687,6 +707,21 @@ static struct rcu_torture_ops srcu_raw_ops = {
	.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)
{
	synchronize_srcu_expedited(&srcu_ctl);
@@ -1685,7 +1720,7 @@ static int rcu_torture_barrier_init(void)
	for (i = 0; i < n_barrier_cbs; i++) {
		init_waitqueue_head(&barrier_cbs_wq[i]);
		barrier_cbs_tasks[i] = kthread_run(rcu_torture_barrier_cbs,
						   (void *)i,
						   (void *)(long)i,
						   "rcu_torture_barrier_cbs");
		if (IS_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[] =
		{ &rcu_ops, &rcu_sync_ops, &rcu_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, };

	mutex_lock(&fullstop_mutex);