aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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>