Mark emergency sections wherever multiple lines of
rcu stall information are generated. In an emergency
section the CPU will not perform console output for the
printk() calls. Instead, a flushing of the console
output is triggered when exiting the emergency section.
This allows the full message block to be stored as
quickly as possible in the ringbuffer.

Signed-off-by: John Ogness <[email protected]>
---
 kernel/rcu/tree_exp.h   |  9 +++++++++
 kernel/rcu/tree_stall.h | 11 +++++++++++
 2 files changed, 20 insertions(+)

diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
index 6b83537480b1..bc1d8733c08f 100644
--- a/kernel/rcu/tree_exp.h
+++ b/kernel/rcu/tree_exp.h
@@ -7,6 +7,7 @@
  * Authors: Paul E. McKenney <[email protected]>
  */
 
+#include <linux/console.h>
 #include <linux/lockdep.h>
 
 static void rcu_exp_handler(void *unused);
@@ -571,6 +572,9 @@ static void synchronize_rcu_expedited_wait(void)
                        return;
                if (rcu_stall_is_suppressed())
                        continue;
+
+               nbcon_cpu_emergency_enter();
+
                j = jiffies;
                rcu_stall_notifier_call_chain(RCU_STALL_NOTIFY_EXP, (void *)(j 
- jiffies_start));
                trace_rcu_stall_warning(rcu_state.name, TPS("ExpeditedStall"));
@@ -612,6 +616,7 @@ static void synchronize_rcu_expedited_wait(void)
                        }
                        pr_cont("\n");
                }
+               nbcon_cpu_emergency_flush();
                rcu_for_each_leaf_node(rnp) {
                        for_each_leaf_node_possible_cpu(rnp, cpu) {
                                mask = leaf_node_cpu_bit(rnp, cpu);
@@ -624,6 +629,9 @@ static void synchronize_rcu_expedited_wait(void)
                        rcu_exp_print_detail_task_stall_rnp(rnp);
                }
                jiffies_stall = 3 * rcu_exp_jiffies_till_stall_check() + 3;
+
+               nbcon_cpu_emergency_exit();
+
                panic_on_rcu_stall();
        }
 }
@@ -792,6 +800,7 @@ static void rcu_exp_print_detail_task_stall_rnp(struct 
rcu_node *rnp)
                 */
                touch_nmi_watchdog();
                sched_show_task(t);
+               nbcon_cpu_emergency_flush();
        }
        raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
 }
diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
index 5d666428546b..1ca0826545c1 100644
--- a/kernel/rcu/tree_stall.h
+++ b/kernel/rcu/tree_stall.h
@@ -7,6 +7,7 @@
  * Author: Paul E. McKenney <[email protected]>
  */
 
+#include <linux/console.h>
 #include <linux/kvm_para.h>
 #include <linux/rcu_notifier.h>
 
@@ -260,6 +261,7 @@ static void rcu_print_detail_task_stall_rnp(struct rcu_node 
*rnp)
                 */
                touch_nmi_watchdog();
                sched_show_task(t);
+               nbcon_cpu_emergency_flush();
        }
        raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
 }
@@ -522,6 +524,7 @@ static void print_cpu_stall_info(int cpu)
               falsepositive ? " (false positive?)" : "");
 
        print_cpu_stat_info(cpu);
+       nbcon_cpu_emergency_flush();
 }
 
 /* Complain about starvation of grace-period kthread.  */
@@ -604,6 +607,8 @@ static void print_other_cpu_stall(unsigned long gp_seq, 
unsigned long gps)
        if (rcu_stall_is_suppressed())
                return;
 
+       nbcon_cpu_emergency_enter();
+
        /*
         * OK, time to rat on our buddy...
         * See Documentation/RCU/stallwarn.rst for info on how to debug
@@ -655,6 +660,8 @@ static void print_other_cpu_stall(unsigned long gp_seq, 
unsigned long gps)
        rcu_check_gp_kthread_expired_fqs_timer();
        rcu_check_gp_kthread_starvation();
 
+       nbcon_cpu_emergency_exit();
+
        panic_on_rcu_stall();
 
        rcu_force_quiescent_state();  /* Kick them all. */
@@ -675,6 +682,8 @@ static void print_cpu_stall(unsigned long gps)
        if (rcu_stall_is_suppressed())
                return;
 
+       nbcon_cpu_emergency_enter();
+
        /*
         * OK, time to rat on ourselves...
         * See Documentation/RCU/stallwarn.rst for info on how to debug
@@ -703,6 +712,8 @@ static void print_cpu_stall(unsigned long gps)
                           jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
        raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
 
+       nbcon_cpu_emergency_exit();
+
        panic_on_rcu_stall();
 
        /*
-- 
2.39.2


Reply via email to