waketorture: Add hrtimer support
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Thu, 24 Mar 2016 23:01:57 +0000 (16:01 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 26 Aug 2016 18:45:59 +0000 (11:45 -0700)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/waketorture.c
tools/testing/selftests/rcutorture/configs/wake/SH [new file with mode: 0644]
tools/testing/selftests/rcutorture/configs/wake/SH.boot [new file with mode: 0644]

index 3068a5c858c8d6e5ff0429ece89aa9727f09adfd..bf04c65296bd04403ab5ef2c7d7a3a6a697e298c 100644 (file)
@@ -62,12 +62,12 @@ torture_param(int, stat_interval, 60,
             "Number of seconds between stats printk()s");
 torture_param(bool, verbose, true,
             "Enable verbose debugging printk()s");
-torture_param(int, wait_duration, 3,
-            "Number of jiffies to wait each iteration");
+torture_param(int, wait_duration, 127,
+            "Number of microseconds to wait each iteration");
 torture_param(int, wait_grace, 20,
             "Number of jiffies before complaining about long wait");
 
-static char *torture_type = "sti";
+static char *torture_type = "sh";
 module_param(torture_type, charp, 0444);
 MODULE_PARM_DESC(torture_type, "Type of wait to torture (sti, stui, ...)");
 
@@ -94,18 +94,40 @@ MODULE_PARM_DESC(torture_runnable, "Start waketorture at boot");
  */
 
 struct wake_torture_ops {
-       signed long (*wait)(signed long timeout);
+       void (*wait)(void);
        const char *name;
 };
 
 static struct wake_torture_ops *cur_ops;
 
+/*
+ * Definitions for schedule_hrtimeout() torture testing.
+ */
+
+static void wait_schedule_hrtimeout(void)
+{
+       ktime_t wait = ns_to_ktime(wait_duration * 1000);
+
+       set_current_state(TASK_UNINTERRUPTIBLE);
+       schedule_hrtimeout(&wait, HRTIMER_MODE_REL);
+}
+
+static struct wake_torture_ops sh_ops = {
+       .wait           = wait_schedule_hrtimeout,
+       .name           = "sh"
+};
+
 /*
  * Definitions for schedule_timeout_interruptible() torture testing.
  */
 
+static void wait_schedule_timeout_interruptible(void)
+{
+       schedule_timeout_interruptible((wait_duration + 999) / 1000);
+}
+
 static struct wake_torture_ops sti_ops = {
-       .wait           = schedule_timeout_interruptible,
+       .wait           = wait_schedule_timeout_interruptible,
        .name           = "sti"
 };
 
@@ -113,8 +135,13 @@ static struct wake_torture_ops sti_ops = {
  * Definitions for schedule_timeout_uninterruptible() torture testing.
  */
 
+static void wait_schedule_timeout_uninterruptible(void)
+{
+       schedule_timeout_uninterruptible((wait_duration + 999) / 1000);
+}
+
 static struct wake_torture_ops stui_ops = {
-       .wait           = schedule_timeout_uninterruptible,
+       .wait           = wait_schedule_timeout_uninterruptible,
        .name           = "stui"
 };
 
@@ -149,7 +176,7 @@ static int wake_torture_waiter(void *arg)
                waiter_cts[me] = false;
                __this_cpu_add(waiter_cputime, trace_clock_local() - ts);
                preempt_enable();
-               cur_ops->wait(wait_duration);
+               cur_ops->wait();
                preempt_disable();
                ts = trace_clock_local();
                waiter_iter[me]++;
@@ -167,7 +194,10 @@ static int wake_torture_waiter(void *arg)
                        } else {
                                waiter_cts[i] = true;
                                waiter_kicks[i]++;
-                               pr_alert("%s%s wake_torture_waiter(): P%d failing to awaken!\n", torture_type, TORTURE_FLAG, waiter_tasks[i]->pid);
+                               pr_alert("%s%s wake_torture_waiter(): P%d (%#lx) failing to awaken!\n",
+                                        torture_type, TORTURE_FLAG,
+                                        waiter_tasks[i]->pid,
+                                        waiter_tasks[i]->state);
                                rcu_ftrace_dump(DUMP_ALL);
                                wake_up_process(waiter_tasks[i]);
                                mutex_unlock(&waiter_mutex);
@@ -312,7 +342,9 @@ wake_torture_init(void)
 {
        int i;
        int firsterr = 0;
-       static struct wake_torture_ops *torture_ops[] = { &sti_ops, &stui_ops };
+       static struct wake_torture_ops *torture_ops[] = {
+               &sh_ops, &sti_ops, &stui_ops
+       };
 
        if (!torture_init_begin(torture_type, verbose, &torture_runnable))
                return -EBUSY;
diff --git a/tools/testing/selftests/rcutorture/configs/wake/SH b/tools/testing/selftests/rcutorture/configs/wake/SH
new file mode 100644 (file)
index 0000000..7a17c50
--- /dev/null
@@ -0,0 +1,19 @@
+CONFIG_SMP=y
+CONFIG_NR_CPUS=16
+CONFIG_PREEMPT_NONE=n
+CONFIG_PREEMPT_VOLUNTARY=n
+CONFIG_PREEMPT=y
+#CHECK#CONFIG_PREEMPT_RCU=y
+CONFIG_HZ_PERIODIC=y
+CONFIG_NO_HZ_IDLE=n
+CONFIG_NO_HZ_FULL=n
+CONFIG_RCU_TRACE=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_RCU_FANOUT=2
+CONFIG_RCU_FANOUT_LEAF=2
+CONFIG_RCU_NOCB_CPU=n
+CONFIG_DEBUG_LOCK_ALLOC=n
+CONFIG_RCU_BOOST=y
+CONFIG_RCU_KTHREAD_PRIO=2
+CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
+CONFIG_RCU_EXPERT=y
diff --git a/tools/testing/selftests/rcutorture/configs/wake/SH.boot b/tools/testing/selftests/rcutorture/configs/wake/SH.boot
new file mode 100644 (file)
index 0000000..a631c87
--- /dev/null
@@ -0,0 +1 @@
+rcupdate.rcu_expedited waketorture.torture_type=sh
This page took 0.027426 seconds and 5 git commands to generate.