[PATCH] rcutorture: Make rcutorture support print rcu-tasks gp state

From: Zqiang
Date: Tue Mar 12 2024 - 03:24:14 EST


This commit make rcu-tasks related rcutorture test support rcu-tasks
gp state printing when the writer stall occurs or the at the end of
rcutorture test.

The test is as follows:
[ 3872.548702] tasks-tracing: Start-test grace-period state: g4560 f0x0
[ 4332.661283] tasks-tracing: End-test grace-period state: g41540 f0x0 total-gps=36980

[ 4401.381138] tasks: Start-test grace-period state: g8 f0x0
[ 4565.619354] tasks: End-test grace-period state: g1732 f0x0 total-gps=1724

[ 4589.006917] tasks-rude: Start-test grace-period state: g8 f0x0
[ 5059.379321] tasks-rude: End-test grace-period state: g8508 f0x0 total-gps=8500

Signed-off-by: Zqiang <qiang.zhang1211@xxxxxxxxx>
---
kernel/rcu/rcu.h | 8 ++++++++
kernel/rcu/rcutorture.c | 3 +++
kernel/rcu/tasks.h | 25 +++++++++++++++++++++++++
3 files changed, 36 insertions(+)

diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h
index 86fce206560e..3353e3697645 100644
--- a/kernel/rcu/rcu.h
+++ b/kernel/rcu/rcu.h
@@ -556,6 +556,14 @@ static inline unsigned long rcu_get_jiffies_lazy_flush(void) { return 0; }
static inline void rcu_set_jiffies_lazy_flush(unsigned long j) { }
#endif

+#ifdef CONFIG_TASKS_RCU_GENERIC
+void rcutaskstorture_get_gp_data(enum rcutorture_type test_type, int *flags,
+ unsigned long *gp_seq);
+#else
+static inline void rcutaskstorture_get_gp_data(enum rcutorture_type test_type, int *flags,
+ unsigned long *gp_seq) { }
+#endif
+
#if defined(CONFIG_TREE_RCU)
void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
unsigned long *gp_seq);
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index dd7d5ba45740..91c03f37fd97 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -2267,6 +2267,7 @@ rcu_torture_stats_print(void)
&flags, &gp_seq);
srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp,
&flags, &gp_seq);
+ rcutaskstorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
wtp = READ_ONCE(writer_task);
pr_alert("??? Writer stall state %s(%d) g%lu f%#x ->state %#x cpu %d\n",
rcu_torture_writer_state_getname(),
@@ -3391,6 +3392,7 @@ rcu_torture_cleanup(void)

rcutorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp, &flags, &gp_seq);
+ rcutaskstorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
pr_alert("%s: End-test grace-period state: g%ld f%#x total-gps=%ld\n",
cur_ops->name, (long)gp_seq, flags,
rcutorture_seq_diff(gp_seq, start_gp_seq));
@@ -3763,6 +3765,7 @@ rcu_torture_init(void)
rcu_torture_print_module_parms(cur_ops, "Start of test");
rcutorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
srcutorture_get_gp_data(cur_ops->ttype, srcu_ctlp, &flags, &gp_seq);
+ rcutaskstorture_get_gp_data(cur_ops->ttype, &flags, &gp_seq);
start_gp_seq = gp_seq;
pr_alert("%s: Start-test grace-period state: g%ld f%#x\n",
cur_ops->name, (long)gp_seq, flags);
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index e83adcdb49b5..b1254cf3c210 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -2149,6 +2149,31 @@ late_initcall(rcu_tasks_verify_schedule_work);
static void rcu_tasks_initiate_self_tests(void) { }
#endif /* #else #ifdef CONFIG_PROVE_RCU */

+void rcutaskstorture_get_gp_data(enum rcutorture_type test_type, int *flags,
+ unsigned long *gp_seq)
+{
+ switch (test_type) {
+ case RCU_TASKS_FLAVOR:
+#ifdef CONFIG_TASKS_RCU
+ *gp_seq = rcu_seq_current(&rcu_tasks.tasks_gp_seq);
+#endif
+ break;
+ case RCU_TASKS_RUDE_FLAVOR:
+#ifdef CONFIG_TASKS_RUDE_RCU
+ *gp_seq = rcu_seq_current(&rcu_tasks_rude.tasks_gp_seq);
+#endif
+ break;
+ case RCU_TASKS_TRACING_FLAVOR:
+#ifdef CONFIG_TASKS_TRACE_RCU
+ *gp_seq = rcu_seq_current(&rcu_tasks_trace.tasks_gp_seq);
+#endif
+ break;
+ default:
+ break;
+ }
+}
+EXPORT_SYMBOL_GPL(rcutaskstorture_get_gp_data);
+
void __init tasks_cblist_init_generic(void)
{
lockdep_assert_irqs_disabled();
--
2.17.1