--- /dev/null
+From 28585a832602747cbfa88ad8934013177a3aae38 Mon Sep 17 00:00:00 2001
+From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
+Date: Fri, 22 Sep 2017 14:10:22 -0700
+Subject: rcu: Allow for page faults in NMI handlers
+
+From: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+
+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.
+
+Link: http://lkml.kernel.org/r/20170922211022.GA18084@linux.vnet.ibm.com
+
+Fixes: 0be964be0 ("module: Sanitize RCU usage and locking")
+Reported-by: Steven Rostedt <rostedt@goodmis.org>
+Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/rcu/tree.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+--- a/kernel/rcu/tree.c
++++ b/kernel/rcu/tree.c
+@@ -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) &&