rcutorture: Warn on individual rcu_torture_init() error conditions
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 5 Aug 2021 20:28:24 +0000 (13:28 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 13 Sep 2021 23:36:16 +0000 (16:36 -0700)
When running rcutorture as a module, any rcu_torture_init() issues will be
reflected in the error code from modprobe or insmod, as the case may be.
However, these error codes are not available when running rcutorture
built-in, for example, when using the kvm.sh script.  This commit
therefore adds WARN_ON_ONCE() to allow distinguishing rcu_torture_init()
errors when running rcutorture built-in.

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

index 0910c58..24f58e5 100644 (file)
@@ -47,6 +47,14 @@ do {                                                                         \
 } while (0)
 void verbose_torout_sleep(void);
 
+#define torture_init_error(firsterr)                                           \
+({                                                                             \
+       int ___firsterr = (firsterr);                                           \
+                                                                               \
+       WARN_ONCE(!IS_MODULE(CONFIG_RCU_TORTURE_TEST) && ___firsterr < 0, "Torture-test initialization failed with error code %d\n", ___firsterr); \
+       ___firsterr < 0;                                                                \
+})
+
 /* Definitions for online/offline exerciser. */
 #ifdef CONFIG_HOTPLUG_CPU
 int torture_num_online_cpus(void);
index 59254fa..b90cd4d 100644 (file)
@@ -3037,7 +3037,7 @@ rcu_torture_init(void)
        rcu_torture_write_types();
        firsterr = torture_create_kthread(rcu_torture_writer, NULL,
                                          writer_task);
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        if (nfakewriters > 0) {
                fakewriter_tasks = kcalloc(nfakewriters,
@@ -3052,7 +3052,7 @@ rcu_torture_init(void)
        for (i = 0; i < nfakewriters; i++) {
                firsterr = torture_create_kthread(rcu_torture_fakewriter,
                                                  NULL, fakewriter_tasks[i]);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        reader_tasks = kcalloc(nrealreaders, sizeof(reader_tasks[0]),
@@ -3068,7 +3068,7 @@ rcu_torture_init(void)
                rcu_torture_reader_mbchk[i].rtc_chkrdr = -1;
                firsterr = torture_create_kthread(rcu_torture_reader, (void *)i,
                                                  reader_tasks[i]);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        nrealnocbers = nocbs_nthreads;
@@ -3088,18 +3088,18 @@ rcu_torture_init(void)
        }
        for (i = 0; i < nrealnocbers; i++) {
                firsterr = torture_create_kthread(rcu_nocb_toggle, NULL, nocb_tasks[i]);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        if (stat_interval > 0) {
                firsterr = torture_create_kthread(rcu_torture_stats, NULL,
                                                  stats_task);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        if (test_no_idle_hz && shuffle_interval > 0) {
                firsterr = torture_shuffle_init(shuffle_interval * HZ);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        if (stutter < 0)
@@ -3109,7 +3109,7 @@ rcu_torture_init(void)
 
                t = cur_ops->stall_dur ? cur_ops->stall_dur() : stutter * HZ;
                firsterr = torture_stutter_init(stutter * HZ, t);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        if (fqs_duration < 0)
@@ -3118,7 +3118,7 @@ rcu_torture_init(void)
                /* Create the fqs thread */
                firsterr = torture_create_kthread(rcu_torture_fqs, NULL,
                                                  fqs_task);
-               if (firsterr)
+               if (torture_init_error(firsterr))
                        goto unwind;
        }
        if (test_boost_interval < 1)
@@ -3132,7 +3132,7 @@ rcu_torture_init(void)
                firsterr = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "RCU_TORTURE",
                                             rcutorture_booster_init,
                                             rcutorture_booster_cleanup);
-               if (firsterr < 0)
+               if (torture_init_error(firsterr))
                        goto unwind;
                rcutor_hp = firsterr;
 
@@ -3153,23 +3153,23 @@ rcu_torture_init(void)
        }
        shutdown_jiffies = jiffies + shutdown_secs * HZ;
        firsterr = torture_shutdown_init(shutdown_secs, rcu_torture_cleanup);
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        firsterr = torture_onoff_init(onoff_holdoff * HZ, onoff_interval,
                                      rcutorture_sync);
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        firsterr = rcu_torture_stall_init();
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        firsterr = rcu_torture_fwd_prog_init();
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        firsterr = rcu_torture_barrier_init();
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        firsterr = rcu_torture_read_exit_init();
-       if (firsterr)
+       if (torture_init_error(firsterr))
                goto unwind;
        if (object_debug)
                rcu_test_debug_objects();