* [PATCH rcu 1/7] doc: Emphasize the need for explicit RCU read-side markers
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 2/7] doc: Call out queue_rcu_work() for blocking RCU callbacks Paul E. McKenney
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
This commit updates checklist.rst to emphasize the need for explicit
markers for RCU read-side critical sections.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/checklist.rst | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst
index 42cc5d891bd26..5eedef027d922 100644
--- a/Documentation/RCU/checklist.rst
+++ b/Documentation/RCU/checklist.rst
@@ -66,8 +66,13 @@ over a rather long period of time, but improvements are always welcome!
As a rough rule of thumb, any dereference of an RCU-protected
pointer must be covered by rcu_read_lock(), rcu_read_lock_bh(),
rcu_read_lock_sched(), or by the appropriate update-side lock.
- Disabling of preemption can serve as rcu_read_lock_sched(), but
- is less readable and prevents lockdep from detecting locking issues.
+ Explicit disabling of preemption (preempt_disable(), for example)
+ can serve as rcu_read_lock_sched(), but is less readable and
+ prevents lockdep from detecting locking issues.
+
+ Please not that you *cannot* rely on code known to be built
+ only in non-preemptible kernels. Such code can and will break,
+ especially in kernels built with CONFIG_PREEMPT_COUNT=y.
Letting RCU-protected pointers "leak" out of an RCU read-side
critical section is every bit as bad as letting them leak out
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 2/7] doc: Call out queue_rcu_work() for blocking RCU callbacks
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 1/7] doc: Emphasize the need for explicit RCU read-side markers Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 3/7] doc: Use rcu_barrier() to rate-limit " Paul E. McKenney
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
The current checklist.rst file correctly notes that RCU callbacks execute
in BH context, and cannot block. This commit adds words advising people
needing callbacks to block to use workqueues, for example, by replacing
call_rcu() with queue_rcu_work().
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/checklist.rst | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst
index 5eedef027d922..2db206fc3465f 100644
--- a/Documentation/RCU/checklist.rst
+++ b/Documentation/RCU/checklist.rst
@@ -190,6 +190,9 @@ over a rather long period of time, but improvements are always welcome!
5. If call_rcu() or call_srcu() is used, the callback function will
be called from softirq context. In particular, it cannot block.
+ If you need the callback to block, run that code in a workqueue
+ handler scheduled from the callback. The queue_rcu_work()
+ function does this for you in the case of call_rcu().
6. Since synchronize_rcu() can block, it cannot be called
from any sort of irq context. The same rule applies
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 3/7] doc: Use rcu_barrier() to rate-limit RCU callbacks
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 1/7] doc: Emphasize the need for explicit RCU read-side markers Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 2/7] doc: Call out queue_rcu_work() for blocking RCU callbacks Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 4/7] doc: Fix list: rcu_access_pointer() is not lockdep-checked Paul E. McKenney
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
The checklist.rst document advises periodic synchronize_rcu() invocations
to prevent callback flooding. However, rcu_barrier() is often a better
choice. This commit therefore adds words to this effect.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/checklist.rst | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst
index 2db206fc3465f..178ca7547b987 100644
--- a/Documentation/RCU/checklist.rst
+++ b/Documentation/RCU/checklist.rst
@@ -305,7 +305,8 @@ over a rather long period of time, but improvements are always welcome!
the machine.
d. Periodically invoke synchronize_rcu(), permitting a limited
- number of updates per grace period.
+ number of updates per grace period. Better yet, periodically
+ invoke rcu_barrier() to wait for all outstanding callbacks.
The same cautions apply to call_srcu() and kfree_rcu().
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 4/7] doc: Fix list: rcu_access_pointer() is not lockdep-checked
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
` (2 preceding siblings ...)
2022-08-31 18:06 ` [PATCH rcu 3/7] doc: Use rcu_barrier() to rate-limit " Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 5/7] doc: Update rcu_access_pointer() advice in rcu_dereference.rst Paul E. McKenney
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
The rcu_access_pointer() macro does not consult lockdep by design because
it is intended to be used outside of RCU read-side critical sections.
This commit therefore makes a separate list for it in whatisRCU.rst.
Similarly, RCU_LOCKDEP_WARN(), rcu_sleep_check(), and RCU_NONIDLE()
do not do anything with pointer access. This commit therefore creates
a separate utility-API list for them.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/whatisRCU.rst | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst
index 77ea260efd120..6940e0fe8599b 100644
--- a/Documentation/RCU/whatisRCU.rst
+++ b/Documentation/RCU/whatisRCU.rst
@@ -1057,14 +1057,20 @@ SRCU: Initialization/cleanup::
init_srcu_struct
cleanup_srcu_struct
-All: lockdep-checked RCU-protected pointer access::
+All: lockdep-checked RCU utility APIs::
- rcu_access_pointer
- rcu_dereference_raw
RCU_LOCKDEP_WARN
rcu_sleep_check
RCU_NONIDLE
+All: Unchecked RCU-protected pointer access::
+
+ rcu_dereference_raw
+
+All: Unchecked RCU-protected pointer access with dereferencing prohibited::
+
+ rcu_access_pointer
+
See the comment headers in the source code (or the docbook generated
from them) for more information.
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 5/7] doc: Update rcu_access_pointer() advice in rcu_dereference.rst
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
` (3 preceding siblings ...)
2022-08-31 18:06 ` [PATCH rcu 4/7] doc: Fix list: rcu_access_pointer() is not lockdep-checked Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 6/7] doc: SLAB_TYPESAFE_BY_RCU uses cannot rely on spinlocks Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 7/7] doc/rcu: Update LWN article URLs and add 2019 article Paul E. McKenney
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
This commit updates the rcu_access_pointer() advice, noting that its
return value should not be assigned to a local variable, and also noting
that there is little point in using rcu_access_pointer() within an RCU
read-side critical section.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/rcu_dereference.rst | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/Documentation/RCU/rcu_dereference.rst b/Documentation/RCU/rcu_dereference.rst
index 0b418a5b243c5..81e828c8313b8 100644
--- a/Documentation/RCU/rcu_dereference.rst
+++ b/Documentation/RCU/rcu_dereference.rst
@@ -128,10 +128,16 @@ Follow these rules to keep your RCU code working properly:
This sort of comparison occurs frequently when scanning
RCU-protected circular linked lists.
- Note that if checks for being within an RCU read-side
- critical section are not required and the pointer is never
- dereferenced, rcu_access_pointer() should be used in place
- of rcu_dereference().
+ Note that if the pointer comparison is done outside
+ of an RCU read-side critical section, and the pointer
+ is never dereferenced, rcu_access_pointer() should be
+ used in place of rcu_dereference(). In most cases,
+ it is best to avoid accidental dereferences by testing
+ the rcu_access_pointer() return value directly, without
+ assigning it to a variable.
+
+ Within an RCU read-side critical section, there is little
+ reason to use rcu_access_pointer().
- The comparison is against a pointer that references memory
that was initialized "a long time ago." The reason
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 6/7] doc: SLAB_TYPESAFE_BY_RCU uses cannot rely on spinlocks
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
` (4 preceding siblings ...)
2022-08-31 18:06 ` [PATCH rcu 5/7] doc: Update rcu_access_pointer() advice in rcu_dereference.rst Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
2022-08-31 18:06 ` [PATCH rcu 7/7] doc/rcu: Update LWN article URLs and add 2019 article Paul E. McKenney
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
Because the SLAB_TYPESAFE_BY_RCU code does not zero pages that are
to be broken up into slabs, the memory returned by kmem_cache_alloc()
must be fully initialized, including any spinlocks included in the newly
allocated structure. This means that readers attempting to look up an
SLAB_TYPESAFE_BY_RCU object must use a reference-counting approach.
A spinlock may be acquired only after a reference is obtained, which
prevents that object from being passed to kmem_struct_free(), but only
while that reference continues to be held.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/whatisRCU.rst | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst
index 6940e0fe8599b..97f2d0fa84dfa 100644
--- a/Documentation/RCU/whatisRCU.rst
+++ b/Documentation/RCU/whatisRCU.rst
@@ -915,13 +915,18 @@ which an RCU reference is held include:
The understanding that RCU provides a reference that only prevents a
change of type is particularly visible with objects allocated from a
slab cache marked ``SLAB_TYPESAFE_BY_RCU``. RCU operations may yield a
-reference to an object from such a cache that has been concurrently
-freed and the memory reallocated to a completely different object,
-though of the same type. In this case RCU doesn't even protect the
-identity of the object from changing, only its type. So the object
-found may not be the one expected, but it will be one where it is safe
-to take a reference or spinlock and then confirm that the identity
-matches the expectations.
+reference to an object from such a cache that has been concurrently freed
+and the memory reallocated to a completely different object, though of
+the same type. In this case RCU doesn't even protect the identity of the
+object from changing, only its type. So the object found may not be the
+one expected, but it will be one where it is safe to take a reference
+(and then potentially acquiring a spinlock), allowing subsequent code
+to check whether the identity matches expectations. It is tempting
+to simply acquire the spinlock without first taking the reference, but
+unfortunately any spinlock in a ``SLAB_TYPESAFE_BY_RCU`` object must be
+initialized after each and every call to kmem_cache_alloc(), which renders
+reference-free spinlock acquisition completely unsafe. Therefore, when
+using ``SLAB_TYPESAFE_BY_RCU``, make proper use of a reference counter.
With traditional reference counting -- such as that implemented by the
kref library in Linux -- there is typically code that runs when the last
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH rcu 7/7] doc/rcu: Update LWN article URLs and add 2019 article
2022-08-31 18:06 [PATCH rcu 0/7] RCU documentation updates for v6.1 Paul E. McKenney
` (5 preceding siblings ...)
2022-08-31 18:06 ` [PATCH rcu 6/7] doc: SLAB_TYPESAFE_BY_RCU uses cannot rely on spinlocks Paul E. McKenney
@ 2022-08-31 18:06 ` Paul E. McKenney
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2022-08-31 18:06 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Shao-Tse Hung, Paul E . McKenney
From: Shao-Tse Hung <ccs100203@gmail.com>
This patch adds LWN articles about RCU APIs which were released in 2019.
Also, HTTP URLs are replaced by HTTPS.
Signed-off-by: Shao-Tse Hung <ccs100203@gmail.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/RCU/whatisRCU.rst | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst
index 97f2d0fa84dfa..1c747ac3f2c8e 100644
--- a/Documentation/RCU/whatisRCU.rst
+++ b/Documentation/RCU/whatisRCU.rst
@@ -6,13 +6,15 @@ What is RCU? -- "Read, Copy, Update"
Please note that the "What is RCU?" LWN series is an excellent place
to start learning about RCU:
-| 1. What is RCU, Fundamentally? http://lwn.net/Articles/262464/
-| 2. What is RCU? Part 2: Usage http://lwn.net/Articles/263130/
-| 3. RCU part 3: the RCU API http://lwn.net/Articles/264090/
-| 4. The RCU API, 2010 Edition http://lwn.net/Articles/418853/
-| 2010 Big API Table http://lwn.net/Articles/419086/
-| 5. The RCU API, 2014 Edition http://lwn.net/Articles/609904/
-| 2014 Big API Table http://lwn.net/Articles/609973/
+| 1. What is RCU, Fundamentally? https://lwn.net/Articles/262464/
+| 2. What is RCU? Part 2: Usage https://lwn.net/Articles/263130/
+| 3. RCU part 3: the RCU API https://lwn.net/Articles/264090/
+| 4. The RCU API, 2010 Edition https://lwn.net/Articles/418853/
+| 2010 Big API Table https://lwn.net/Articles/419086/
+| 5. The RCU API, 2014 Edition https://lwn.net/Articles/609904/
+| 2014 Big API Table https://lwn.net/Articles/609973/
+| 6. The RCU API, 2019 Edition https://lwn.net/Articles/777036/
+| 2019 Big API Table https://lwn.net/Articles/777165/
What is RCU?
--
2.31.1.189.g2e36527f23
^ permalink raw reply [flat|nested] 8+ messages in thread