Documentation/RCU: Fix emphasis markers
"-foo-" does not work as emphasis in ReST markdown. Use "*foo*" instead. Signed-off-by: Akira Yokosawa <akiyks@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
Родитель
2734d6c1b1
Коммит
e3879ecd36
|
@ -37,7 +37,7 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
|
|
||||||
1. Does the update code have proper mutual exclusion?
|
1. Does the update code have proper mutual exclusion?
|
||||||
|
|
||||||
RCU does allow -readers- to run (almost) naked, but -writers- must
|
RCU does allow *readers* to run (almost) naked, but *writers* must
|
||||||
still use some sort of mutual exclusion, such as:
|
still use some sort of mutual exclusion, such as:
|
||||||
|
|
||||||
a. locking,
|
a. locking,
|
||||||
|
@ -73,7 +73,7 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
critical section is every bit as bad as letting them leak out
|
critical section is every bit as bad as letting them leak out
|
||||||
from under a lock. Unless, of course, you have arranged some
|
from under a lock. Unless, of course, you have arranged some
|
||||||
other means of protection, such as a lock or a reference count
|
other means of protection, such as a lock or a reference count
|
||||||
-before- letting them out of the RCU read-side critical section.
|
*before* letting them out of the RCU read-side critical section.
|
||||||
|
|
||||||
3. Does the update code tolerate concurrent accesses?
|
3. Does the update code tolerate concurrent accesses?
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
c. Make updates appear atomic to readers. For example,
|
c. Make updates appear atomic to readers. For example,
|
||||||
pointer updates to properly aligned fields will
|
pointer updates to properly aligned fields will
|
||||||
appear atomic, as will individual atomic primitives.
|
appear atomic, as will individual atomic primitives.
|
||||||
Sequences of operations performed under a lock will -not-
|
Sequences of operations performed under a lock will *not*
|
||||||
appear to be atomic to RCU readers, nor will sequences
|
appear to be atomic to RCU readers, nor will sequences
|
||||||
of multiple atomic primitives.
|
of multiple atomic primitives.
|
||||||
|
|
||||||
|
@ -333,7 +333,7 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
for example) may be omitted.
|
for example) may be omitted.
|
||||||
|
|
||||||
10. Conversely, if you are in an RCU read-side critical section,
|
10. Conversely, if you are in an RCU read-side critical section,
|
||||||
and you don't hold the appropriate update-side lock, you -must-
|
and you don't hold the appropriate update-side lock, you *must*
|
||||||
use the "_rcu()" variants of the list macros. Failing to do so
|
use the "_rcu()" variants of the list macros. Failing to do so
|
||||||
will break Alpha, cause aggressive compilers to generate bad code,
|
will break Alpha, cause aggressive compilers to generate bad code,
|
||||||
and confuse people trying to read your code.
|
and confuse people trying to read your code.
|
||||||
|
@ -359,12 +359,12 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
callback pending, then that RCU callback will execute on some
|
callback pending, then that RCU callback will execute on some
|
||||||
surviving CPU. (If this was not the case, a self-spawning RCU
|
surviving CPU. (If this was not the case, a self-spawning RCU
|
||||||
callback would prevent the victim CPU from ever going offline.)
|
callback would prevent the victim CPU from ever going offline.)
|
||||||
Furthermore, CPUs designated by rcu_nocbs= might well -always-
|
Furthermore, CPUs designated by rcu_nocbs= might well *always*
|
||||||
have their RCU callbacks executed on some other CPUs, in fact,
|
have their RCU callbacks executed on some other CPUs, in fact,
|
||||||
for some real-time workloads, this is the whole point of using
|
for some real-time workloads, this is the whole point of using
|
||||||
the rcu_nocbs= kernel boot parameter.
|
the rcu_nocbs= kernel boot parameter.
|
||||||
|
|
||||||
13. Unlike other forms of RCU, it -is- permissible to block in an
|
13. Unlike other forms of RCU, it *is* permissible to block in an
|
||||||
SRCU read-side critical section (demarked by srcu_read_lock()
|
SRCU read-side critical section (demarked by srcu_read_lock()
|
||||||
and srcu_read_unlock()), hence the "SRCU": "sleepable RCU".
|
and srcu_read_unlock()), hence the "SRCU": "sleepable RCU".
|
||||||
Please note that if you don't need to sleep in read-side critical
|
Please note that if you don't need to sleep in read-side critical
|
||||||
|
@ -411,16 +411,16 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
14. The whole point of call_rcu(), synchronize_rcu(), and friends
|
14. The whole point of call_rcu(), synchronize_rcu(), and friends
|
||||||
is to wait until all pre-existing readers have finished before
|
is to wait until all pre-existing readers have finished before
|
||||||
carrying out some otherwise-destructive operation. It is
|
carrying out some otherwise-destructive operation. It is
|
||||||
therefore critically important to -first- remove any path
|
therefore critically important to *first* remove any path
|
||||||
that readers can follow that could be affected by the
|
that readers can follow that could be affected by the
|
||||||
destructive operation, and -only- -then- invoke call_rcu(),
|
destructive operation, and *only then* invoke call_rcu(),
|
||||||
synchronize_rcu(), or friends.
|
synchronize_rcu(), or friends.
|
||||||
|
|
||||||
Because these primitives only wait for pre-existing readers, it
|
Because these primitives only wait for pre-existing readers, it
|
||||||
is the caller's responsibility to guarantee that any subsequent
|
is the caller's responsibility to guarantee that any subsequent
|
||||||
readers will execute safely.
|
readers will execute safely.
|
||||||
|
|
||||||
15. The various RCU read-side primitives do -not- necessarily contain
|
15. The various RCU read-side primitives do *not* necessarily contain
|
||||||
memory barriers. You should therefore plan for the CPU
|
memory barriers. You should therefore plan for the CPU
|
||||||
and the compiler to freely reorder code into and out of RCU
|
and the compiler to freely reorder code into and out of RCU
|
||||||
read-side critical sections. It is the responsibility of the
|
read-side critical sections. It is the responsibility of the
|
||||||
|
@ -459,8 +459,8 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
pass in a function defined within a loadable module, then it in
|
pass in a function defined within a loadable module, then it in
|
||||||
necessary to wait for all pending callbacks to be invoked after
|
necessary to wait for all pending callbacks to be invoked after
|
||||||
the last invocation and before unloading that module. Note that
|
the last invocation and before unloading that module. Note that
|
||||||
it is absolutely -not- sufficient to wait for a grace period!
|
it is absolutely *not* sufficient to wait for a grace period!
|
||||||
The current (say) synchronize_rcu() implementation is -not-
|
The current (say) synchronize_rcu() implementation is *not*
|
||||||
guaranteed to wait for callbacks registered on other CPUs.
|
guaranteed to wait for callbacks registered on other CPUs.
|
||||||
Or even on the current CPU if that CPU recently went offline
|
Or even on the current CPU if that CPU recently went offline
|
||||||
and came back online.
|
and came back online.
|
||||||
|
@ -470,7 +470,7 @@ over a rather long period of time, but improvements are always welcome!
|
||||||
- call_rcu() -> rcu_barrier()
|
- call_rcu() -> rcu_barrier()
|
||||||
- call_srcu() -> srcu_barrier()
|
- call_srcu() -> srcu_barrier()
|
||||||
|
|
||||||
However, these barrier functions are absolutely -not- guaranteed
|
However, these barrier functions are absolutely *not* guaranteed
|
||||||
to wait for a grace period. In fact, if there are no call_rcu()
|
to wait for a grace period. In fact, if there are no call_rcu()
|
||||||
callbacks waiting anywhere in the system, rcu_barrier() is within
|
callbacks waiting anywhere in the system, rcu_barrier() is within
|
||||||
its rights to return immediately.
|
its rights to return immediately.
|
||||||
|
|
|
@ -43,7 +43,7 @@ Follow these rules to keep your RCU code working properly:
|
||||||
- Set bits and clear bits down in the must-be-zero low-order
|
- Set bits and clear bits down in the must-be-zero low-order
|
||||||
bits of that pointer. This clearly means that the pointer
|
bits of that pointer. This clearly means that the pointer
|
||||||
must have alignment constraints, for example, this does
|
must have alignment constraints, for example, this does
|
||||||
-not- work in general for char* pointers.
|
*not* work in general for char* pointers.
|
||||||
|
|
||||||
- XOR bits to translate pointers, as is done in some
|
- XOR bits to translate pointers, as is done in some
|
||||||
classic buddy-allocator algorithms.
|
classic buddy-allocator algorithms.
|
||||||
|
@ -174,7 +174,7 @@ Follow these rules to keep your RCU code working properly:
|
||||||
Please see the "CONTROL DEPENDENCIES" section of
|
Please see the "CONTROL DEPENDENCIES" section of
|
||||||
Documentation/memory-barriers.txt for more details.
|
Documentation/memory-barriers.txt for more details.
|
||||||
|
|
||||||
- The pointers are not equal -and- the compiler does
|
- The pointers are not equal *and* the compiler does
|
||||||
not have enough information to deduce the value of the
|
not have enough information to deduce the value of the
|
||||||
pointer. Note that the volatile cast in rcu_dereference()
|
pointer. Note that the volatile cast in rcu_dereference()
|
||||||
will normally prevent the compiler from knowing too much.
|
will normally prevent the compiler from knowing too much.
|
||||||
|
@ -360,7 +360,7 @@ in turn destroying the ordering between this load and the loads of the
|
||||||
return values. This can result in "p->b" returning pre-initialization
|
return values. This can result in "p->b" returning pre-initialization
|
||||||
garbage values.
|
garbage values.
|
||||||
|
|
||||||
In short, rcu_dereference() is -not- optional when you are going to
|
In short, rcu_dereference() is *not* optional when you are going to
|
||||||
dereference the resulting pointer.
|
dereference the resulting pointer.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ warnings:
|
||||||
|
|
||||||
- Booting Linux using a console connection that is too slow to
|
- Booting Linux using a console connection that is too slow to
|
||||||
keep up with the boot-time console-message rate. For example,
|
keep up with the boot-time console-message rate. For example,
|
||||||
a 115Kbaud serial console can be -way- too slow to keep up
|
a 115Kbaud serial console can be *way* too slow to keep up
|
||||||
with boot-time message rates, and will frequently result in
|
with boot-time message rates, and will frequently result in
|
||||||
RCU CPU stall warning messages. Especially if you have added
|
RCU CPU stall warning messages. Especially if you have added
|
||||||
debug printk()s.
|
debug printk()s.
|
||||||
|
@ -105,7 +105,7 @@ warnings:
|
||||||
leading the realization that the CPU had failed.
|
leading the realization that the CPU had failed.
|
||||||
|
|
||||||
The RCU, RCU-sched, and RCU-tasks implementations have CPU stall warning.
|
The RCU, RCU-sched, and RCU-tasks implementations have CPU stall warning.
|
||||||
Note that SRCU does -not- have CPU stall warnings. Please note that
|
Note that SRCU does *not* have CPU stall warnings. Please note that
|
||||||
RCU only detects CPU stalls when there is a grace period in progress.
|
RCU only detects CPU stalls when there is a grace period in progress.
|
||||||
No grace period, no CPU stall warnings.
|
No grace period, no CPU stall warnings.
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ CONFIG_RCU_CPU_STALL_TIMEOUT
|
||||||
this parameter is checked only at the beginning of a cycle.
|
this parameter is checked only at the beginning of a cycle.
|
||||||
So if you are 10 seconds into a 40-second stall, setting this
|
So if you are 10 seconds into a 40-second stall, setting this
|
||||||
sysfs parameter to (say) five will shorten the timeout for the
|
sysfs parameter to (say) five will shorten the timeout for the
|
||||||
-next- stall, or the following warning for the current stall
|
*next* stall, or the following warning for the current stall
|
||||||
(assuming the stall lasts long enough). It will not affect the
|
(assuming the stall lasts long enough). It will not affect the
|
||||||
timing of the next warning for the current stall.
|
timing of the next warning for the current stall.
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ causing stalls, and that the stall was affecting RCU-sched. This message
|
||||||
will normally be followed by stack dumps for each CPU. Please note that
|
will normally be followed by stack dumps for each CPU. Please note that
|
||||||
PREEMPT_RCU builds can be stalled by tasks as well as by CPUs, and that
|
PREEMPT_RCU builds can be stalled by tasks as well as by CPUs, and that
|
||||||
the tasks will be indicated by PID, for example, "P3421". It is even
|
the tasks will be indicated by PID, for example, "P3421". It is even
|
||||||
possible for an rcu_state stall to be caused by both CPUs -and- tasks,
|
possible for an rcu_state stall to be caused by both CPUs *and* tasks,
|
||||||
in which case the offending CPUs and tasks will all be called out in the list.
|
in which case the offending CPUs and tasks will all be called out in the list.
|
||||||
|
|
||||||
CPU 2's "(3 GPs behind)" indicates that this CPU has not interacted with
|
CPU 2's "(3 GPs behind)" indicates that this CPU has not interacted with
|
||||||
|
|
Загрузка…
Ссылка в новой задаче