Re: [PATCH printk v8 34/35] rcu: Mark emergency sections in rcu stalls

From: Paul E. McKenney
Date: Tue Aug 20 2024 - 13:48:31 EST


On Tue, Aug 20, 2024 at 08:36:00AM +0206, John Ogness wrote:
> 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@xxxxxxxxxxxxx>
> Reviewed-by: Petr Mladek <pmladek@xxxxxxxx>

I am guessing that this should go with the rest of this series, so:

Acked-by: Paul E. McKenney <paulmck@xxxxxxxxxx>

> ---
> kernel/rcu/tree_exp.h | 7 +++++++
> kernel/rcu/tree_stall.h | 9 +++++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
> index 4acd29d16fdb..f6b35a0585a8 100644
> --- a/kernel/rcu/tree_exp.h
> +++ b/kernel/rcu/tree_exp.h
> @@ -7,6 +7,7 @@
> * Authors: Paul E. McKenney <paulmck@xxxxxxxxxxxxx>
> */
>
> +#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();
> }
> }
> diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
> index 4b0e9d7c4c68..b3a6943127bc 100644
> --- a/kernel/rcu/tree_stall.h
> +++ b/kernel/rcu/tree_stall.h
> @@ -7,6 +7,7 @@
> * Author: Paul E. McKenney <paulmck@xxxxxxxxxxxxx>
> */
>
> +#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();
>
> /*
> --
> 2.39.2
>