rcu: Add rcutorture test for call_srcu()
authorLai Jiangshan <laijs@cn.fujitsu.com>
Mon, 19 Mar 2012 08:12:14 +0000 (16:12 +0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 30 Apr 2012 17:48:26 +0000 (10:48 -0700)
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>
kernel/rcutorture.c

index d10b179..e66b34a 100644 (file)
@@ -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);