]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rcutorture: Add interrupt-disable capability to stall-warning tests
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 18 Aug 2017 23:11:37 +0000 (16:11 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 9 Oct 2017 21:26:08 +0000 (14:26 -0700)
When rcutorture sees the rcutorture.stall_cpu kernel boot parameter,
it loops with preemption disabled, which does in fact normally
generate an RCU CPU stall warning message.  However, there are test
scenarios that need the stalling CPU to have interrupts disabled.
This commit therefore adds an rcutorture.stall_cpu_irqsoff kernel
boot parameter that causes the stalling CPU to disable interrupts.

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

index 05496622b4effb8212eb2175bea67f9a7bebe0d0..bc94c47085a55de02b95b22cd721628ef4ce0547 100644 (file)
        rcutorture.stall_cpu_holdoff= [KNL]
                        Time to wait (s) after boot before inducing stall.
 
+       rcutorture.stall_cpu_irqsoff= [KNL]
+                       Disable interrupts while stalling if set.
+
        rcutorture.stat_interval= [KNL]
                        Time (s) between statistics printk()s.
 
index 45f2ffbc1e78ed587d26d6764cb8d1aba0f6f2d8..0273bc0a8586452f3562c20c2c8968ef0e2edf90 100644 (file)
@@ -89,6 +89,7 @@ torture_param(int, shutdown_secs, 0, "Shutdown time (s), <= zero to disable.");
 torture_param(int, stall_cpu, 0, "Stall duration (s), zero to disable.");
 torture_param(int, stall_cpu_holdoff, 10,
             "Time to wait before starting stall (s).");
+torture_param(int, stall_cpu_irqsoff, 0, "Disable interrupts while stalling.");
 torture_param(int, stat_interval, 60,
             "Number of seconds between stats printk()s");
 torture_param(int, stutter, 5, "Number of seconds to run/halt test");
@@ -1357,7 +1358,7 @@ rcu_torture_print_module_parms(struct rcu_torture_ops *cur_ops, const char *tag)
                 "fqs_duration=%d fqs_holdoff=%d fqs_stutter=%d "
                 "test_boost=%d/%d test_boost_interval=%d "
                 "test_boost_duration=%d shutdown_secs=%d "
-                "stall_cpu=%d stall_cpu_holdoff=%d "
+                "stall_cpu=%d stall_cpu_holdoff=%d stall_cpu_irqsoff=%d "
                 "n_barrier_cbs=%d "
                 "onoff_interval=%d onoff_holdoff=%d\n",
                 torture_type, tag, nrealreaders, nfakewriters,
@@ -1365,7 +1366,7 @@ rcu_torture_print_module_parms(struct rcu_torture_ops *cur_ops, const char *tag)
                 stutter, irqreader, fqs_duration, fqs_holdoff, fqs_stutter,
                 test_boost, cur_ops->can_boost,
                 test_boost_interval, test_boost_duration, shutdown_secs,
-                stall_cpu, stall_cpu_holdoff,
+                stall_cpu, stall_cpu_holdoff, stall_cpu_irqsoff,
                 n_barrier_cbs,
                 onoff_interval, onoff_holdoff);
 }
@@ -1430,12 +1431,19 @@ static int rcu_torture_stall(void *args)
        if (!kthread_should_stop()) {
                stop_at = get_seconds() + stall_cpu;
                /* RCU CPU stall is expected behavior in following code. */
-               pr_alert("rcu_torture_stall start.\n");
                rcu_read_lock();
-               preempt_disable();
+               if (stall_cpu_irqsoff)
+                       local_irq_disable();
+               else
+                       preempt_disable();
+               pr_alert("rcu_torture_stall start on CPU %d.\n",
+                        smp_processor_id());
                while (ULONG_CMP_LT(get_seconds(), stop_at))
                        continue;  /* Induce RCU CPU stall warning. */
-               preempt_enable();
+               if (stall_cpu_irqsoff)
+                       local_irq_enable();
+               else
+                       preempt_enable();
                rcu_read_unlock();
                pr_alert("rcu_torture_stall end.\n");
        }