Patch "rcu: Allow for page faults in NMI handlers" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
rcu: Allow for page faults in NMI handlers
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rcu-allow-for-page-faults-in-nmi-handlers.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
28585a832602747cbfa88ad8934013177a3aae38Mon Sep 17 00:00:00 2001
From: "Paul E. McKenney" <[email protected]>
Date: Fri, 22 Sep 2017 14:10:22 -0700
Subject: rcu: Allow for page faults in NMI handlers
From: Paul E. McKenney <[email protected]>
commit 28585a832602747cbfa88ad8934013177a3aae38 upstream.
A number of architecture invoke rcu_irq_enter() on exception entry in order to allow RCU read-side critical sections in the exception handler when the exception is from an idle or nohz_full CPU. This works, at least unless the exception happens in an NMI handler. In that case, rcu_nmi_enter() would already have exited the extended quiescent state, which would mean that rcu_irq_enter() would (incorrectly) cause RCU to think that it is again in an extended quiescent state. This will in turn result in lockdep splats in response to later RCU read-side critical sections.
This commit therefore causes rcu_irq_enter() and rcu_irq_exit() to take no action if there is an rcu_nmi_enter() in effect, thus avoiding the unscheduled return to RCU quiescent state. This in turn should make the kernel safe for on-demand RCU voyeurism.
--- kernel/rcu/tree.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
kernel/rcu/tree.c +12 -2
@@ -792,8 +792,13 @@ void rcu_irq_exit(void)long long oldval;struct rcu_dynticks *rdtp; -RCU_LOCKDEP_WARN (!irqs_disabled (),"rcu_irq_exit() invoked with irqs enabled!!!" ); rdtp =this_cpu_ptr (&rcu_dynticks); + +/* Page faults can happen in NMI handlers, so check... */ +if (READ_ONCE (rdtp->dynticks_nmi_nesting)) +return ; + +RCU_LOCKDEP_WARN (!irqs_disabled (),"rcu_irq_exit() invoked with irqs enabled!!!" ); oldval = rdtp->dynticks_nesting; rdtp->dynticks_nesting--; WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
@@ -930,8 +935,13 @@ void rcu_irq_enter(void)struct rcu_dynticks *rdtp;long long oldval; -RCU_LOCKDEP_WARN (!irqs_disabled (),"rcu_irq_enter() invoked with irqs enabled!!!" ); rdtp =this_cpu_ptr (&rcu_dynticks); + +/* Page faults can happen in NMI handlers, so check... */ +if (READ_ONCE (rdtp->dynticks_nmi_nesting)) +return ; + +RCU_LOCKDEP_WARN (!irqs_disabled (),"rcu_irq_enter() invoked with irqs enabled!!!" ); oldval = rdtp->dynticks_nesting; rdtp->dynticks_nesting++; WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/rcu-allow-for-page-faults-in-nmi-handlers.patch