rcutorture: Allow boottime stall warnings to be suppressed
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 5 Dec 2019 19:29:01 +0000 (11:29 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 21 Feb 2020 00:03:30 +0000 (16:03 -0800)
In normal production, an RCU CPU stall warning at boottime is often
just as bad as at any other time.  In fact, given the desire for fast
boot, any sort of long-term stall at boot is a bad idea.  However,
heavy rcutorture testing on large hyperthreaded systems can generate
boottime RCU CPU stalls as a matter of course.  This commit therefore
provides a kernel boot parameter that suppresses reporting of boottime
RCU CPU stall warnings and similarly of rcutorture writer stalls.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Documentation/admin-guide/kernel-parameters.txt
kernel/rcu/rcu.h
kernel/rcu/rcutorture.c
kernel/rcu/tree_exp.h
kernel/rcu/tree_stall.h
kernel/rcu/update.c

index dbc22d68462751d2bb59ab35784c1c61c84bbb0a..ee007b5c874f14533570b5158b39f6fd29c7a33b 100644 (file)
        rcupdate.rcu_cpu_stall_suppress= [KNL]
                        Suppress RCU CPU stall warning messages.
 
+       rcupdate.rcu_cpu_stall_suppress_at_boot= [KNL]
+                       Suppress RCU CPU stall warning messages and
+                       rcutorture writer stall warnings that occur
+                       during early boot, that is, during the time
+                       before the init task is spawned.
+
        rcupdate.rcu_cpu_stall_timeout= [KNL]
                        Set timeout for RCU CPU stall warning messages.
 
index 05f936ed167a76acc484584ab8bd33b222c2fd49..1779cbf33cd1433e8dce20d27eed546f93b7e550 100644 (file)
@@ -198,6 +198,13 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head)
 }
 #endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */
 
+extern int rcu_cpu_stall_suppress_at_boot;
+
+static inline bool rcu_stall_is_suppressed_at_boot(void)
+{
+       return rcu_cpu_stall_suppress_at_boot && !rcu_inkernel_boot_has_ended();
+}
+
 #ifdef CONFIG_RCU_STALL_COMMON
 
 extern int rcu_cpu_stall_ftrace_dump;
@@ -205,6 +212,11 @@ extern int rcu_cpu_stall_suppress;
 extern int rcu_cpu_stall_timeout;
 int rcu_jiffies_till_stall_check(void);
 
+static inline bool rcu_stall_is_suppressed(void)
+{
+       return rcu_stall_is_suppressed_at_boot() || rcu_cpu_stall_suppress;
+}
+
 #define rcu_ftrace_dump_stall_suppress() \
 do { \
        if (!rcu_cpu_stall_suppress) \
@@ -218,6 +230,11 @@ do { \
 } while (0)
 
 #else /* #endif #ifdef CONFIG_RCU_STALL_COMMON */
+
+static inline bool rcu_stall_is_suppressed(void)
+{
+       return rcu_stall_is_suppressed_at_boot();
+}
 #define rcu_ftrace_dump_stall_suppress()
 #define rcu_ftrace_dump_stall_unsuppress()
 #endif /* #ifdef CONFIG_RCU_STALL_COMMON */
index 08fa4ef239146adc7d808562b3d82d20875a975a..16c84ec182bd54b81d9d3f262c6f00db611a50bb 100644 (file)
@@ -1479,7 +1479,7 @@ rcu_torture_stats_print(void)
        if (cur_ops->stats)
                cur_ops->stats();
        if (rtcv_snap == rcu_torture_current_version &&
-           rcu_torture_current != NULL) {
+           rcu_torture_current != NULL && !rcu_stall_is_suppressed()) {
                int __maybe_unused flags = 0;
                unsigned long __maybe_unused gp_seq = 0;
 
index a72d16eb869eed5fd2dff0cf16431d3991954014..c28d9f0034c31e8691140cf67a9dfd28b36331d7 100644 (file)
@@ -518,7 +518,7 @@ static void synchronize_rcu_expedited_wait(void)
        for (;;) {
                if (synchronize_rcu_expedited_wait_once(jiffies_stall))
                        return;
-               if (rcu_cpu_stall_suppress)
+               if (rcu_stall_is_suppressed())
                        continue;
                panic_on_rcu_stall();
                pr_err("INFO: %s detected expedited stalls on CPUs/tasks: {",
index 55f9b84790d3f110745759a715ff9391321b3286..7ee8a1cc0d8bde899ae95e743f7bdb3ce335e812 100644 (file)
@@ -383,7 +383,7 @@ static void print_other_cpu_stall(unsigned long gp_seq)
 
        /* Kick and suppress, if so configured. */
        rcu_stall_kick_kthreads();
-       if (rcu_cpu_stall_suppress)
+       if (rcu_stall_is_suppressed())
                return;
 
        /*
@@ -452,7 +452,7 @@ static void print_cpu_stall(void)
 
        /* Kick and suppress, if so configured. */
        rcu_stall_kick_kthreads();
-       if (rcu_cpu_stall_suppress)
+       if (rcu_stall_is_suppressed())
                return;
 
        /*
@@ -504,7 +504,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
        unsigned long js;
        struct rcu_node *rnp;
 
-       if ((rcu_cpu_stall_suppress && !rcu_kick_kthreads) ||
+       if ((rcu_stall_is_suppressed() && !rcu_kick_kthreads) ||
            !rcu_gp_in_progress())
                return;
        rcu_stall_kick_kthreads();
index feaaec5747a34f5a83b51dd403e43978b260e267..085f08a898fe14f7f17578239522f729a1ec1bb0 100644 (file)
@@ -476,13 +476,19 @@ EXPORT_SYMBOL_GPL(rcutorture_sched_setaffinity);
 #ifdef CONFIG_RCU_STALL_COMMON
 int rcu_cpu_stall_ftrace_dump __read_mostly;
 module_param(rcu_cpu_stall_ftrace_dump, int, 0644);
-int rcu_cpu_stall_suppress __read_mostly; /* 1 = suppress stall warnings. */
+int rcu_cpu_stall_suppress __read_mostly; // !0 = suppress stall warnings.
 EXPORT_SYMBOL_GPL(rcu_cpu_stall_suppress);
 module_param(rcu_cpu_stall_suppress, int, 0644);
 int rcu_cpu_stall_timeout __read_mostly = CONFIG_RCU_CPU_STALL_TIMEOUT;
 module_param(rcu_cpu_stall_timeout, int, 0644);
 #endif /* #ifdef CONFIG_RCU_STALL_COMMON */
 
+// Suppress boot-time RCU CPU stall warnings and rcutorture writer stall
+// warnings.  Also used by rcutorture even if stall warnings are excluded.
+int rcu_cpu_stall_suppress_at_boot __read_mostly; // !0 = suppress boot stalls.
+EXPORT_SYMBOL_GPL(rcu_cpu_stall_suppress_at_boot);
+module_param(rcu_cpu_stall_suppress_at_boot, int, 0444);
+
 #ifdef CONFIG_TASKS_RCU
 
 /*