aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>2007-10-17 02:29:28 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 11:42:56 -0400
commit74beb9db77930be476b267ec8518a642f39a04bf (patch)
tree49cc3c01fe006e85917714a0ba2202293309a645 /Documentation
parent8e3f715a7f004ceb6451cf86101d6e2546eea883 (diff)
local_t Documentation update 2
Grant Grundler was asking for more detail about correct usage of local atomic operations and suggested adding the resulting summary to local_ops.txt. "Please add a bit more detail. If DaveM is correct (he normally is), then there must be limits on how the local_t can be used in the kernel process and interrupt contexts. I'd like those rules spelled out very clearly since it's easy to get wrong and tracking down such a bug is quite painful." Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Signed-off-by: Grant Grundler <grundler@parisc-linux.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/local_ops.txt23
1 files changed, 23 insertions, 0 deletions
diff --git a/Documentation/local_ops.txt b/Documentation/local_ops.txt
index b0aca0705d1e..a134a563db32 100644
--- a/Documentation/local_ops.txt
+++ b/Documentation/local_ops.txt
@@ -45,6 +45,29 @@ long fails. The definition looks like :
45typedef struct { atomic_long_t a; } local_t; 45typedef struct { atomic_long_t a; } local_t;
46 46
47 47
48* Rules to follow when using local atomic operations
49
50- Variables touched by local ops must be per cpu variables.
51- _Only_ the CPU owner of these variables must write to them.
52- This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
53 to update its local_t variables.
54- Preemption (or interrupts) must be disabled when using local ops in
55 process context to make sure the process won't be migrated to a
56 different CPU between getting the per-cpu variable and doing the
57 actual local op.
58- When using local ops in interrupt context, no special care must be
59 taken on a mainline kernel, since they will run on the local CPU with
60 preemption already disabled. I suggest, however, to explicitly
61 disable preemption anyway to make sure it will still work correctly on
62 -rt kernels.
63- Reading the local cpu variable will provide the current copy of the
64 variable.
65- Reads of these variables can be done from any CPU, because updates to
66 "long", aligned, variables are always atomic. Since no memory
67 synchronization is done by the writer CPU, an outdated copy of the
68 variable can be read when reading some _other_ cpu's variables.
69
70
48* How to use local atomic operations 71* How to use local atomic operations
49 72
50#include <linux/percpu.h> 73#include <linux/percpu.h>