rcu: Mark emergency sections in rcu stalls
BugLink: https://bugs.launchpad.net/bugs/2060704 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 <john.ogness@linutronix.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Kevin Becker <kevin.becker@canonical.com>
This commit is contained in:
committed by
Kevin Becker
parent
d2c8329a4c
commit
52f6a084c0
@@ -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);
|
||||
@@ -636,6 +637,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"));
|
||||
@@ -689,6 +693,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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -656,6 +659,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. */
|
||||
@@ -676,6 +681,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
|
||||
@@ -704,6 +711,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();
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user