]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rcu: Mark emergency sections in rcu stalls
authorJohn Ogness <john.ogness@linutronix.de>
Tue, 20 Aug 2024 06:30:00 +0000 (08:36 +0206)
committerPetr Mladek <pmladek@suse.com>
Wed, 21 Aug 2024 13:03:04 +0000 (15:03 +0200)
Mark emergency sections wherever multiple lines of
rcu stall information are generated. In an emergency
section, every printk() call will attempt to directly
flush to the consoles using the EMERGENCY priority.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Acked-by: Paul E. McKenney <paulmck@kernel.org>
Link: https://lore.kernel.org/r/20240820063001.36405-35-john.ogness@linutronix.de
Signed-off-by: Petr Mladek <pmladek@suse.com>
kernel/rcu/tree_exp.h
kernel/rcu/tree_stall.h

index 4acd29d16fdb999af51ef5cf65e6998640c4e221..f6b35a0585a8b4f8832001aabf48fbb6ff2b8289 100644 (file)
@@ -7,6 +7,7 @@
  * Authors: Paul E. McKenney <paulmck@linux.ibm.com>
  */
 
+#include <linux/console.h>
 #include <linux/lockdep.h>
 
 static void rcu_exp_handler(void *unused);
@@ -590,6 +591,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"));
@@ -643,6 +647,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();
        }
 }
index 4b0e9d7c4c68ee029c72d7094c4be7dc3b0d1582..b3a6943127bca33bdc50221a900fba3d0634d695 100644 (file)
@@ -7,6 +7,7 @@
  * Author: Paul E. McKenney <paulmck@linux.ibm.com>
  */
 
+#include <linux/console.h>
 #include <linux/kvm_para.h>
 #include <linux/rcu_notifier.h>
 
@@ -605,6 +606,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
@@ -657,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. */
@@ -677,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
@@ -706,6 +713,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();
 
        /*