rcuscale: Add RCU Tasks Rude testing
authorPaul E. McKenney <paulmck@kernel.org>
Sat, 3 Jun 2023 16:07:44 +0000 (09:07 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 14 Jul 2023 22:01:49 +0000 (15:01 -0700)
Add a "tasks-rude" option to the rcuscale.scale_type module parameter.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcu.h
kernel/rcu/rcuscale.c
kernel/rcu/tasks.h
tools/testing/selftests/rcutorture/configs/rcuscale/CFcommon

index d58bc0e8676918bc48c6b0cbf1ea1a473f8cc412..9829d8161b21391b5f6cea99c0472158742f3348 100644 (file)
@@ -508,6 +508,9 @@ void show_rcu_tasks_gp_kthreads(void);
 # ifdef CONFIG_TASKS_RCU
 struct task_struct *get_rcu_tasks_gp_kthread(void);
 # endif // # ifdef CONFIG_TASKS_RCU
+# ifdef CONFIG_TASKS_RUDE_RCU
+struct task_struct *get_rcu_tasks_rude_gp_kthread(void);
+# endif // # ifdef CONFIG_TASKS_RUDE_RCU
 #else /* #ifdef CONFIG_TASKS_RCU_GENERIC */
 static inline void show_rcu_tasks_gp_kthreads(void) {}
 #endif /* #else #ifdef CONFIG_TASKS_RCU_GENERIC */
index 35e06c86acc981f0bd11c5ecaefd62b7d8a9cc13..5ce3b4e7ce711752e91a2a489e73341bf8219f7f 100644 (file)
@@ -310,6 +310,35 @@ static struct rcu_scale_ops tasks_ops = {
 
 #endif // #else // #ifdef CONFIG_TASKS_RCU
 
+#ifdef CONFIG_TASKS_RUDE_RCU
+
+/*
+ * Definitions for RCU-tasks-rude scalability testing.
+ */
+
+static struct rcu_scale_ops tasks_rude_ops = {
+       .ptype          = RCU_TASKS_RUDE_FLAVOR,
+       .init           = rcu_sync_scale_init,
+       .readlock       = tasks_scale_read_lock,
+       .readunlock     = tasks_scale_read_unlock,
+       .get_gp_seq     = rcu_no_completed,
+       .gp_diff        = rcu_seq_diff,
+       .async          = call_rcu_tasks_rude,
+       .gp_barrier     = rcu_barrier_tasks_rude,
+       .sync           = synchronize_rcu_tasks_rude,
+       .exp_sync       = synchronize_rcu_tasks_rude,
+       .rso_gp_kthread = get_rcu_tasks_rude_gp_kthread,
+       .name           = "tasks-rude"
+};
+
+#define TASKS_RUDE_OPS &tasks_rude_ops,
+
+#else // #ifdef CONFIG_TASKS_RUDE_RCU
+
+#define TASKS_RUDE_OPS
+
+#endif // #else // #ifdef CONFIG_TASKS_RUDE_RCU
+
 #ifdef CONFIG_TASKS_TRACE_RCU
 
 /*
@@ -913,7 +942,7 @@ rcu_scale_init(void)
        long i;
        int firsterr = 0;
        static struct rcu_scale_ops *scale_ops[] = {
-               &rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_TRACING_OPS
+               &rcu_ops, &srcu_ops, &srcud_ops, TASKS_OPS TASKS_RUDE_OPS TASKS_TRACING_OPS
        };
 
        if (!torture_init_begin(scale_type, verbose))
index 0f03de023097d7f2fab1e57eb94ee837e0104bed..0372c5cbc83b7c40f4aa7e315f840039c64b25f8 100644 (file)
@@ -1194,6 +1194,13 @@ void show_rcu_tasks_rude_gp_kthread(void)
 }
 EXPORT_SYMBOL_GPL(show_rcu_tasks_rude_gp_kthread);
 #endif // !defined(CONFIG_TINY_RCU)
+
+struct task_struct *get_rcu_tasks_rude_gp_kthread(void)
+{
+       return rcu_tasks_rude.kthread_ptr;
+}
+EXPORT_SYMBOL_GPL(get_rcu_tasks_rude_gp_kthread);
+
 #endif /* #ifdef CONFIG_TASKS_RUDE_RCU */
 
 ////////////////////////////////////////////////////////////////////////
index 6a00157bee5b1755a39f7cf7a6d49c10b5114aa3..b1ffd7c6760457bc4f84cd7ee8e4a26533bb2983 100644 (file)
@@ -2,5 +2,7 @@ CONFIG_RCU_SCALE_TEST=y
 CONFIG_PRINTK_TIME=y
 CONFIG_FORCE_TASKS_RCU=y
 #CHECK#CONFIG_TASKS_RCU=y
+CONFIG_FORCE_TASKS_RUDE_RCU=y
+#CHECK#CONFIG_TASKS_RUDE_RCU=y
 CONFIG_FORCE_TASKS_TRACE_RCU=y
 #CHECK#CONFIG_TASKS_TRACE_RCU=y