Add self tests for checking of RCU-tasks API functionality. It covers: - wait API functions; - invoking/completion call_rcu_tasks*(). Self-tests are run when CONFIG_PROVE_RCU kernel parameter is set. Signed-off-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> --- kernel/rcu/tasks.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index 67a162949763..9407772780c1 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -1225,6 +1225,16 @@ void show_rcu_tasks_gp_kthreads(void) } #endif /* #ifndef CONFIG_TINY_RCU */ +static struct rcu_head rhp; +static int rcu_execurted_test_counter; +static int rcu_run_test_counter; + +static void test_rcu_tasks_callback(struct rcu_head *r) +{ + pr_info("RCU-tasks test callback executed %d\n", + ++rcu_execurted_test_counter); +} + void __init rcu_init_tasks_generic(void) { #ifdef CONFIG_TASKS_RCU @@ -1238,7 +1248,41 @@ void __init rcu_init_tasks_generic(void) #ifdef CONFIG_TASKS_TRACE_RCU rcu_spawn_tasks_trace_kthread(); #endif + + if (IS_ENABLED(CONFIG_PROVE_RCU)) { + pr_info("Running RCU-tasks wait API self tests\n"); +#ifdef CONFIG_TASKS_RCU + rcu_run_test_counter++; + call_rcu_tasks(&rhp, test_rcu_tasks_callback); + synchronize_rcu_tasks(); +#endif + +#ifdef CONFIG_TASKS_RUDE_RCU + rcu_run_test_counter++; + call_rcu_tasks_trace(&rhp, test_rcu_tasks_callback); + synchronize_rcu_tasks_rude(); +#endif + +#ifdef CONFIG_TASKS_TRACE_RCU + rcu_run_test_counter++; + call_rcu_tasks_trace(&rhp, test_rcu_tasks_callback); + synchronize_rcu_tasks_trace(); +#endif + } +} + +static int rcu_tasks_verify_self_tests(void) +{ + int ret = 0; + + if (rcu_run_test_counter != rcu_execurted_test_counter) { + WARN_ON(1); + ret = -1; + } + + return ret; } +late_initcall(rcu_tasks_verify_self_tests); #else /* #ifdef CONFIG_TASKS_RCU_GENERIC */ static inline void rcu_tasks_bootup_oddness(void) {} -- 2.20.1