rcutorture: Invoke call_rcu() from timer handler
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 20 Jul 2017 22:27:32 +0000 (15:27 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 24 Jul 2017 23:04:19 +0000 (16:04 -0700)
The Linux kernel invokes call_rcu() from various interrupt/softirq
handlers, but rcutorture does not.  This commit therefore adds this
behavior to rcutorture's repertoire.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/rcutorture.c

index 6e3f644..0efd69b 100644 (file)
@@ -1080,6 +1080,11 @@ rcu_torture_fakewriter(void *arg)
        return 0;
 }
 
+static void rcu_torture_timer_cb(struct rcu_head *rhp)
+{
+       kfree(rhp);
+}
+
 /*
  * RCU torture reader from timer handler.  Dereferences rcu_torture_current,
  * incrementing the corresponding element of the pipeline array.  The
@@ -1142,6 +1147,14 @@ static void rcu_torture_timer(unsigned long unused)
        __this_cpu_inc(rcu_torture_batch[completed]);
        preempt_enable();
        cur_ops->readunlock(idx);
+
+       /* Test call_rcu() invocation from interrupt handler. */
+       if (cur_ops->call) {
+               struct rcu_head *rhp = kmalloc(sizeof(*rhp), GFP_NOWAIT);
+
+               if (rhp)
+                       cur_ops->call(rhp, rcu_torture_timer_cb);
+       }
 }
 
 /*