This commit adds a test using on-stack hazptr_ctx structures, in contrast
with the per-CPU structures used by the initial test.

Signed-off-by: Paul E. McKenney <[email protected]>
---
 kernel/rcu/hazptrtorture.c                    | 48 +++++++++++++++----
 .../rcutorture/configs/hazptr/NOPREEMPT.boot  |  1 +
 2 files changed, 39 insertions(+), 10 deletions(-)
 create mode 100644 
tools/testing/selftests/rcutorture/configs/hazptr/NOPREEMPT.boot

diff --git a/kernel/rcu/hazptrtorture.c b/kernel/rcu/hazptrtorture.c
index 1949a8da4f8c9d..1a61d35ade1d9d 100644
--- a/kernel/rcu/hazptrtorture.c
+++ b/kernel/rcu/hazptrtorture.c
@@ -30,9 +30,10 @@ MODULE_DESCRIPTION("Hazard-pointer module-based torture test 
facility");
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Paul E. McKenney <[email protected]>");
 
-torture_param(int, irqreader, 1, "Allow hazard-pointer readers from irq 
handlers");
+// @@@ torture_param(int, irqreader, 1, "Allow hazard-pointer readers from irq 
handlers");
 // @@@ torture_param(int, leakpointer, 0, "Leak pointer dereferences from 
readers");
 torture_param(int, nreaders, -1, "Number of hazard-pointer reader threads");
+// @@@ Does testing CPU hotplug make sense for hazard pointers?
 torture_param(int, onoff_holdoff, 0, "Time after boot before CPU hotplugs 
(s)");
 torture_param(int, onoff_interval, 0, "Time between CPU hotplugs (jiffies), 
0=disable");
 // @@@ Move the rcu_torture_preempt() function and friends to kernel/torture.c.
@@ -194,7 +195,8 @@ struct hazptr_torture_ops {
 static struct hazptr_torture_ops *cur_ops;
 
 /*
- * Definitions for hazard-pointer torture testing.
+ * Definitions for hazard-pointer torture testing using per-CPU hazptr_ctx
+ * structures.
  */
 
 static struct hazptr_torture *hazptr_torture_read_lock(struct hazptr_ctx 
**hcpp)
@@ -252,6 +254,29 @@ static struct hazptr_torture_ops hazptr_ops = {
        .name                   = "hazptr"
 };
 
+/*
+ * Definitions for hazard-pointer torture testing using on-stack
+ * hazptr_ctx structures.
+ */
+
+static struct hazptr_torture *hazptr_torture_read_lock_stack(struct hazptr_ctx 
**hcpp)
+{
+       struct hazptr_torture *htp;
+
+       htp = (struct hazptr_torture *)hazptr_acquire(*hcpp, (void 
*)&hazptr_torture_current);
+       return htp;
+}
+
+static struct hazptr_torture_ops hazptr_stack_ops = {
+       .init                   = hazptr_sync_torture_init,
+       .readlock               = hazptr_torture_read_lock_stack,
+       .read_delay             = hazptr_read_delay,
+       .readunlock             = hazptr_torture_read_unlock,
+       .sync                   = hazptr_synchronize,
+       .irq_capable            = 1,
+       .name                   = "hazptr-stack"
+};
+
 /*
  * Hazard-pointer torture writer kthread.  Repeatedly substitutes a new
  * structure for that pointed to by hazptr_torture_current, freeing the
@@ -337,7 +362,8 @@ hazptr_torture_writer(void *arg)
  */
 static int hazptr_torture_reader(void *arg)
 {
-       struct hazptr_ctx *hcp;
+       struct hazptr_ctx hc;
+       struct hazptr_ctx *hcp = &hc;
        struct hazptr_torture *htp;
        unsigned long lastsleep = jiffies;
        long myid = (long)arg;
@@ -488,13 +514,15 @@ hazptr_torture_print_module_parms(struct 
hazptr_torture_ops *cur_ops, const char
 {
        pr_alert("%s" TORTURE_FLAG
                 "--- %s: nreaders=%d "
-                "stat_interval=%d verbose=%d "
-                "shuffle_interval=%d stutter=%d irqreader=%d "
-                "onoff_interval=%d onoff_holdoff=%d\n",
+                "onoff_interval=%d onoff_holdoff=%d "
+                "preempt_duration=%d preempt_interval=%d "
+                "shuffle_interval=%d shutdown_secs=%d stat_interval=%d 
stutter=%d "
+                "verbose=%d\n",
                 torture_type, tag, nrealreaders,
-                stat_interval, verbose,
-                shuffle_interval, stutter, irqreader,
-                onoff_interval, onoff_holdoff);
+                onoff_interval, onoff_holdoff,
+                preempt_duration, preempt_interval,
+                shuffle_interval, shutdown_secs, stat_interval, stutter,
+                verbose);
 }
 
 // Randomly preempt online CPUs.
@@ -570,7 +598,7 @@ static int __init hazptr_torture_init(void)
        long i;
        int cpu;
        int firsterr = 0;
-       static struct hazptr_torture_ops *torture_ops[] = { &hazptr_ops, };
+       static struct hazptr_torture_ops *torture_ops[] = { &hazptr_ops, 
&hazptr_stack_ops, };
 
        if (!torture_init_begin(torture_type, verbose))
                return -EBUSY;
diff --git a/tools/testing/selftests/rcutorture/configs/hazptr/NOPREEMPT.boot 
b/tools/testing/selftests/rcutorture/configs/hazptr/NOPREEMPT.boot
new file mode 100644
index 00000000000000..1d09a6446080a1
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/hazptr/NOPREEMPT.boot
@@ -0,0 +1 @@
+hazptrtorture.torture_type=hazptr-stack
-- 
2.40.1


Reply via email to