diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-11-07 02:05:32 -0500 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-12-05 15:34:32 -0500 |
commit | c64c4b0f9a183e4c73abff848378afa6edf796c5 (patch) | |
tree | bd0fa2e58b367e35dae47101ebd0de4b28642e9c /Documentation/RCU | |
parent | 4b689330b1a5858e88831b3752e9a6692a5c7bdb (diff) |
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: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'Documentation/RCU')
-rw-r--r-- | Documentation/RCU/Design/Requirements/Requirements.html | 12 | ||||
-rw-r--r-- | Documentation/RCU/Design/Requirements/Requirements.htmlx | 10 |
2 files changed, 19 insertions, 3 deletions
diff --git a/Documentation/RCU/Design/Requirements/Requirements.html b/Documentation/RCU/Design/Requirements/Requirements.html index 96cdcf7195d5..a725f9900ec8 100644 --- a/Documentation/RCU/Design/Requirements/Requirements.html +++ b/Documentation/RCU/Design/Requirements/Requirements.html | |||
@@ -1,5 +1,5 @@ | |||
1 | <!-- DO NOT HAND EDIT. --> | 1 | <!-- DO NOT HAND EDIT. --> |
2 | <!-- Instead, edit Requirements.htmlx and run 'sh htmlqqz.sh Requirements' --> | 2 | <!-- Instead, edit Documentation/RCU/Design/Requirements/Requirements.htmlx and run 'sh htmlqqz.sh Documentation/RCU/Design/Requirements/Requirements' --> |
3 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" | 3 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
4 | "http://www.w3.org/TR/html4/loose.dtd"> | 4 | "http://www.w3.org/TR/html4/loose.dtd"> |
5 | <html> | 5 | <html> |
@@ -1957,7 +1957,7 @@ the runqueue locks and the priority-inheritance locks | |||
1957 | in the middle of an outermost RCU read-side critical section unless either | 1957 | in the middle of an outermost RCU read-side critical section unless either |
1958 | (1) it releases them before exiting that same | 1958 | (1) it releases them before exiting that same |
1959 | RCU read-side critical section, or | 1959 | RCU read-side critical section, or |
1960 | (2) preemption is disabled across | 1960 | (2) interrupts are disabled across |
1961 | that entire RCU read-side critical section. | 1961 | that entire RCU read-side critical section. |
1962 | This same prohibition also applies (recursively!) to any lock that is acquired | 1962 | This same prohibition also applies (recursively!) to any lock that is acquired |
1963 | while holding any lock to which this prohibition applies. | 1963 | while holding any lock to which this prohibition applies. |
@@ -1966,6 +1966,14 @@ Adhering to this rule prevents preemptible RCU from invoking | |||
1966 | priority-inheritance locks are held, thus avoiding deadlock. | 1966 | priority-inheritance locks are held, thus avoiding deadlock. |
1967 | 1967 | ||
1968 | <p> | 1968 | <p> |
1969 | Prior to v4.4, it was only necessary to disable preemption across | ||
1970 | RCU read-side critical sections that acquired scheduler locks. | ||
1971 | In v4.4, expedited grace periods started using IPIs, and these | ||
1972 | IPIs could force a <tt>rcu_read_unlock()</tt> to take the slowpath. | ||
1973 | Therefore, this expedited-grace-period change required disabling of | ||
1974 | interrupts, not just preemption. | ||
1975 | |||
1976 | <p> | ||
1969 | For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> | 1977 | For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> |
1970 | implementation must be written carefully to avoid similar deadlocks. | 1978 | implementation must be written carefully to avoid similar deadlocks. |
1971 | In particular, <tt>rcu_read_unlock()</tt> must tolerate an | 1979 | In particular, <tt>rcu_read_unlock()</tt> must tolerate an |
diff --git a/Documentation/RCU/Design/Requirements/Requirements.htmlx b/Documentation/RCU/Design/Requirements/Requirements.htmlx index 2d0cd90987f6..3a97ba490c42 100644 --- a/Documentation/RCU/Design/Requirements/Requirements.htmlx +++ b/Documentation/RCU/Design/Requirements/Requirements.htmlx | |||
@@ -2124,7 +2124,7 @@ the runqueue locks and the priority-inheritance locks | |||
2124 | in the middle of an outermost RCU read-side critical section unless either | 2124 | in the middle of an outermost RCU read-side critical section unless either |
2125 | (1) it releases them before exiting that same | 2125 | (1) it releases them before exiting that same |
2126 | RCU read-side critical section, or | 2126 | RCU read-side critical section, or |
2127 | (2) preemption is disabled across | 2127 | (2) interrupts are disabled across |
2128 | that entire RCU read-side critical section. | 2128 | that entire RCU read-side critical section. |
2129 | This same prohibition also applies (recursively!) to any lock that is acquired | 2129 | This same prohibition also applies (recursively!) to any lock that is acquired |
2130 | while holding any lock to which this prohibition applies. | 2130 | while holding any lock to which this prohibition applies. |
@@ -2133,6 +2133,14 @@ Adhering to this rule prevents preemptible RCU from invoking | |||
2133 | priority-inheritance locks are held, thus avoiding deadlock. | 2133 | priority-inheritance locks are held, thus avoiding deadlock. |
2134 | 2134 | ||
2135 | <p> | 2135 | <p> |
2136 | Prior to v4.4, it was only necessary to disable preemption across | ||
2137 | RCU read-side critical sections that acquired scheduler locks. | ||
2138 | In v4.4, expedited grace periods started using IPIs, and these | ||
2139 | IPIs could force a <tt>rcu_read_unlock()</tt> to take the slowpath. | ||
2140 | Therefore, this expedited-grace-period change required disabling of | ||
2141 | interrupts, not just preemption. | ||
2142 | |||
2143 | <p> | ||
2136 | For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> | 2144 | For RCU's part, the preemptible-RCU <tt>rcu_read_unlock()</tt> |
2137 | implementation must be written carefully to avoid similar deadlocks. | 2145 | implementation must be written carefully to avoid similar deadlocks. |
2138 | In particular, <tt>rcu_read_unlock()</tt> must tolerate an | 2146 | In particular, <tt>rcu_read_unlock()</tt> must tolerate an |