rcutorture: Don't cpuhp_remove_state() if cpuhp_setup_state() failed
authorPaul E. McKenney <paulmck@kernel.org>
Fri, 6 Aug 2021 15:57:26 +0000 (08:57 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 13 Sep 2021 23:36:16 +0000 (16:36 -0700)
Currently, in CONFIG_RCU_BOOST kernels, if the rcu_torture_init()
function's call to cpuhp_setup_state() fails, rcu_torture_cleanup()
gamely passes nonsense to cpuhp_remove_state().  This results in
strange and misleading splats.  This commit therefore ensures that if
the rcu_torture_init() function's call to cpuhp_setup_state() fails,
rcu_torture_cleanup() avoids invoking cpuhp_remove_state().

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index b90cd4d..4241847 100644 (file)
@@ -2819,7 +2819,7 @@ rcu_torture_cleanup(void)
                 rcutorture_seq_diff(gp_seq, start_gp_seq));
        torture_stop_kthread(rcu_torture_stats, stats_task);
        torture_stop_kthread(rcu_torture_fqs, fqs_task);
-       if (rcu_torture_can_boost())
+       if (rcu_torture_can_boost() && rcutor_hp >= 0)
                cpuhp_remove_state(rcutor_hp);
 
        /*
@@ -3132,9 +3132,9 @@ rcu_torture_init(void)
                firsterr = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "RCU_TORTURE",
                                             rcutorture_booster_init,
                                             rcutorture_booster_cleanup);
+               rcutor_hp = firsterr;
                if (torture_init_error(firsterr))
                        goto unwind;
-               rcutor_hp = firsterr;
 
                // Testing RCU priority boosting requires rcutorture do
                // some serious abuse.  Counter this by running ksoftirqd