Re: [PATCH 2/2] rcu-tasks: add RCU-tasks self tests

From: Uladzislau Rezki
Date: Wed Dec 16 2020 - 10:50:48 EST


> 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) {}
Please find a v2 of the patch that is in question. First version
uses the same rhp for all RCU flavors what is wrong. Initially
i had three different one per one flavor. But for some reason
end up with only one.