Commit 8c03273a authored by John Ogness's avatar John Ogness Committed by Petr Mladek

rcu: Mark emergency sections in rcu stalls

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: default avatarJohn Ogness <john.ogness@linutronix.de>
Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
Acked-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Link: https://lore.kernel.org/r/20240820063001.36405-35-john.ogness@linutronix.deSigned-off-by: default avatarPetr Mladek <pmladek@suse.com>
parent 4bdfa0d8
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* Authors: Paul E. McKenney <paulmck@linux.ibm.com> * Authors: Paul E. McKenney <paulmck@linux.ibm.com>
*/ */
#include <linux/console.h>
#include <linux/lockdep.h> #include <linux/lockdep.h>
static void rcu_exp_handler(void *unused); static void rcu_exp_handler(void *unused);
...@@ -590,6 +591,9 @@ static void synchronize_rcu_expedited_wait(void) ...@@ -590,6 +591,9 @@ static void synchronize_rcu_expedited_wait(void)
return; return;
if (rcu_stall_is_suppressed()) if (rcu_stall_is_suppressed())
continue; continue;
nbcon_cpu_emergency_enter();
j = jiffies; j = jiffies;
rcu_stall_notifier_call_chain(RCU_STALL_NOTIFY_EXP, (void *)(j - jiffies_start)); rcu_stall_notifier_call_chain(RCU_STALL_NOTIFY_EXP, (void *)(j - jiffies_start));
trace_rcu_stall_warning(rcu_state.name, TPS("ExpeditedStall")); trace_rcu_stall_warning(rcu_state.name, TPS("ExpeditedStall"));
...@@ -643,6 +647,9 @@ static void synchronize_rcu_expedited_wait(void) ...@@ -643,6 +647,9 @@ static void synchronize_rcu_expedited_wait(void)
rcu_exp_print_detail_task_stall_rnp(rnp); rcu_exp_print_detail_task_stall_rnp(rnp);
} }
jiffies_stall = 3 * rcu_exp_jiffies_till_stall_check() + 3; jiffies_stall = 3 * rcu_exp_jiffies_till_stall_check() + 3;
nbcon_cpu_emergency_exit();
panic_on_rcu_stall(); panic_on_rcu_stall();
} }
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* Author: Paul E. McKenney <paulmck@linux.ibm.com> * Author: Paul E. McKenney <paulmck@linux.ibm.com>
*/ */
#include <linux/console.h>
#include <linux/kvm_para.h> #include <linux/kvm_para.h>
#include <linux/rcu_notifier.h> #include <linux/rcu_notifier.h>
...@@ -605,6 +606,8 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps) ...@@ -605,6 +606,8 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
if (rcu_stall_is_suppressed()) if (rcu_stall_is_suppressed())
return; return;
nbcon_cpu_emergency_enter();
/* /*
* OK, time to rat on our buddy... * OK, time to rat on our buddy...
* See Documentation/RCU/stallwarn.rst for info on how to debug * 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) ...@@ -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_expired_fqs_timer();
rcu_check_gp_kthread_starvation(); rcu_check_gp_kthread_starvation();
nbcon_cpu_emergency_exit();
panic_on_rcu_stall(); panic_on_rcu_stall();
rcu_force_quiescent_state(); /* Kick them all. */ rcu_force_quiescent_state(); /* Kick them all. */
...@@ -677,6 +682,8 @@ static void print_cpu_stall(unsigned long gps) ...@@ -677,6 +682,8 @@ static void print_cpu_stall(unsigned long gps)
if (rcu_stall_is_suppressed()) if (rcu_stall_is_suppressed())
return; return;
nbcon_cpu_emergency_enter();
/* /*
* OK, time to rat on ourselves... * OK, time to rat on ourselves...
* See Documentation/RCU/stallwarn.rst for info on how to debug * See Documentation/RCU/stallwarn.rst for info on how to debug
...@@ -706,6 +713,8 @@ static void print_cpu_stall(unsigned long gps) ...@@ -706,6 +713,8 @@ static void print_cpu_stall(unsigned long gps)
jiffies + 3 * rcu_jiffies_till_stall_check() + 3); jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
raw_spin_unlock_irqrestore_rcu_node(rnp, flags); raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
nbcon_cpu_emergency_exit();
panic_on_rcu_stall(); panic_on_rcu_stall();
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment