rcu: Add kernel parameter to dump trace after RCU CPU stall warning
authorPaul E. McKenney <paulmck@linux.ibm.com>
Thu, 13 Jun 2019 22:30:49 +0000 (15:30 -0700)
committerPaul E. McKenney <paulmck@linux.ibm.com>
Thu, 1 Aug 2019 21:05:51 +0000 (14:05 -0700)
This commit adds a rcu_cpu_stall_ftrace_dump kernel boot parameter, that,
when set, causes the trace buffer to be dumped after an RCU CPU stall
warning is printed.  This kernel boot parameter is disabled by default,
maintaining compatibility with previous behavior.

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

index 7ccd158b3894e7841f16c11597ddbcadf1f7c34d..f3fcd6140ee1f12425bea8ed276cbce7246dd15f 100644 (file)
        rcutorture.verbose= [KNL]
                        Enable additional printk() statements.
 
+       rcupdate.rcu_cpu_stall_ftrace_dump= [KNL]
+                       Dump ftrace buffer after reporting RCU CPU
+                       stall warning.
+
        rcupdate.rcu_cpu_stall_suppress= [KNL]
                        Suppress RCU CPU stall warning messages.
 
index 5290b01de534f2d8bc7d10f90939fb790b09e8c4..8fd4f82c9b3d7f0dc9a073976e62923901d4ddd0 100644 (file)
@@ -227,6 +227,7 @@ static inline bool __rcu_reclaim(const char *rn, struct rcu_head *head)
 
 #ifdef CONFIG_RCU_STALL_COMMON
 
+extern int rcu_cpu_stall_ftrace_dump;
 extern int rcu_cpu_stall_suppress;
 extern int rcu_cpu_stall_timeout;
 int rcu_jiffies_till_stall_check(void);
index 065183391f75979e6bca59184f48e1126670eaad..0627a66699a602a3ab11baf4e2697c0b98fb7bc6 100644 (file)
@@ -527,6 +527,8 @@ static void check_cpu_stall(struct rcu_data *rdp)
 
                /* We haven't checked in, so go dump stack. */
                print_cpu_stall();
+               if (rcu_cpu_stall_ftrace_dump)
+                       rcu_ftrace_dump(DUMP_ALL);
 
        } else if (rcu_gp_in_progress() &&
                   ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
@@ -534,6 +536,8 @@ static void check_cpu_stall(struct rcu_data *rdp)
 
                /* They had a few time units to dump stack, so complain. */
                print_other_cpu_stall(gs2);
+               if (rcu_cpu_stall_ftrace_dump)
+                       rcu_ftrace_dump(DUMP_ALL);
        }
 }
 
index 61df2bf08563201e54b0ad667be1cab049c50aea..249517058b136ae61ff71d25fbad06138203d286 100644 (file)
@@ -437,6 +437,8 @@ EXPORT_SYMBOL_GPL(rcutorture_sched_setaffinity);
 #endif
 
 #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. */
 EXPORT_SYMBOL_GPL(rcu_cpu_stall_suppress);
 module_param(rcu_cpu_stall_suppress, int, 0644);