]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 13 Oct 2017 16:34:41 +0000 (18:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 13 Oct 2017 16:34:41 +0000 (18:34 +0200)
added patches:
rcu-allow-for-page-faults-in-nmi-handlers.patch

queue-4.4/rcu-allow-for-page-faults-in-nmi-handlers.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/rcu-allow-for-page-faults-in-nmi-handlers.patch b/queue-4.4/rcu-allow-for-page-faults-in-nmi-handlers.patch
new file mode 100644 (file)
index 0000000..fd1994f
--- /dev/null
@@ -0,0 +1,65 @@
+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
+
+Cc: stable@vger.kernel.org
+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 |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/kernel/rcu/tree.c
++++ b/kernel/rcu/tree.c
+@@ -759,6 +759,12 @@ void rcu_irq_exit(void)
+       local_irq_save(flags);
+       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) &&
+@@ -887,6 +893,12 @@ void rcu_irq_enter(void)
+       local_irq_save(flags);
+       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) &&
index 5a776b2e1a634921af601baaf68d063662f0004f..d60fe31ca49937deb9aa360265fd936d35cc2380 100644 (file)
@@ -3,3 +3,4 @@ ext4-in-ext4_seek_-hole-data-return-enxio-for-negative-offsets.patch
 cifs-reconnect-expired-smb-sessions.patch
 nl80211-define-policy-for-packet-pattern-attributes.patch
 iwlwifi-mvm-use-iwl_hcmd_nocopy-for-mcast_filter_cmd.patch
+rcu-allow-for-page-faults-in-nmi-handlers.patch