Commit c64c4b0f authored by Paul E. McKenney's avatar Paul E. McKenney

documentation: Update RCU requirements based on expedited changes

Because RCU-sched expedited grace periods now use IPIs and interact
with rcu_read_unlock(), it is no longer sufficient to disable preemption
across RCU read-side critical sections that acquire and hold scheduler
locks.  It is now necessary to instead disable interrupts.  This commit
documents this change.
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 4b689330
<!-- DO NOT HAND EDIT. --> <!-- DO NOT HAND EDIT. -->
<!-- Instead, edit Requirements.htmlx and run 'sh htmlqqz.sh Requirements' --> <!-- Instead, edit Documentation/RCU/Design/Requirements/Requirements.htmlx and run 'sh htmlqqz.sh Documentation/RCU/Design/Requirements/Requirements' -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> "http://www.w3.org/TR/html4/loose.dtd">
<html> <html>
...@@ -1957,7 +1957,7 @@ the runqueue locks and the priority-inheritance locks ...@@ -1957,7 +1957,7 @@ the runqueue locks and the priority-inheritance locks
in the middle of an outermost RCU read-side critical section unless either in the middle of an outermost RCU read-side critical section unless either
(1)&nbsp;it releases them before exiting that same (1)&nbsp;it releases them before exiting that same
RCU read-side critical section, or RCU read-side critical section, or
(2)&nbsp;preemption is disabled across (2)&nbsp;interrupts are disabled across
that entire RCU read-side critical section. that entire RCU read-side critical section.
This same prohibition also applies (recursively!) to any lock that is acquired This same prohibition also applies (recursively!) to any lock that is acquired
while holding any lock to which this prohibition applies. while holding any lock to which this prohibition applies.
...@@ -1965,6 +1965,14 @@ Adhering to this rule prevents preemptible RCU from invoking ...@@ -1965,6 +1965,14 @@ Adhering to this rule prevents preemptible RCU from invoking
<tt>rcu_read_unlock_special()</tt> while either runqueue or <tt>rcu_read_unlock_special()</tt> while either runqueue or
priority-inheritance locks are held, thus avoiding deadlock. priority-inheritance locks are held, thus avoiding deadlock.
<p>
Prior to v4.4, it was only necessary to disable preemption across
RCU read-side critical sections that acquired scheduler locks.
In v4.4, expedited grace periods started using IPIs, and these
IPIs could force a <tt>rcu_read_unlock()</tt> to take the slowpath.
Therefore, this expedited-grace-period change required disabling of
interrupts, not just preemption.
<p> <p>
For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt>
implementation must be written carefully to avoid similar deadlocks. implementation must be written carefully to avoid similar deadlocks.
......
...@@ -2124,7 +2124,7 @@ the runqueue locks and the priority-inheritance locks ...@@ -2124,7 +2124,7 @@ the runqueue locks and the priority-inheritance locks
in the middle of an outermost RCU read-side critical section unless either in the middle of an outermost RCU read-side critical section unless either
(1)&nbsp;it releases them before exiting that same (1)&nbsp;it releases them before exiting that same
RCU read-side critical section, or RCU read-side critical section, or
(2)&nbsp;preemption is disabled across (2)&nbsp;interrupts are disabled across
that entire RCU read-side critical section. that entire RCU read-side critical section.
This same prohibition also applies (recursively!) to any lock that is acquired This same prohibition also applies (recursively!) to any lock that is acquired
while holding any lock to which this prohibition applies. while holding any lock to which this prohibition applies.
...@@ -2132,6 +2132,14 @@ Adhering to this rule prevents preemptible RCU from invoking ...@@ -2132,6 +2132,14 @@ Adhering to this rule prevents preemptible RCU from invoking
<tt>rcu_read_unlock_special()</tt> while either runqueue or <tt>rcu_read_unlock_special()</tt> while either runqueue or
priority-inheritance locks are held, thus avoiding deadlock. priority-inheritance locks are held, thus avoiding deadlock.
<p>
Prior to v4.4, it was only necessary to disable preemption across
RCU read-side critical sections that acquired scheduler locks.
In v4.4, expedited grace periods started using IPIs, and these
IPIs could force a <tt>rcu_read_unlock()</tt> to take the slowpath.
Therefore, this expedited-grace-period change required disabling of
interrupts, not just preemption.
<p> <p>
For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt>
implementation must be written carefully to avoid similar deadlocks. implementation must be written carefully to avoid similar deadlocks.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment