Commit e1265205c0ee3919c3f2c750662630154c8faab2

Authored by Mathieu Desnoyers
Committed by Linus Torvalds
1 parent bf2cdef306

local_t Documentation update

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>

Showing 1 changed file with 23 additions and 0 deletions Side-by-side Diff

Documentation/local_ops.txt
... ... @@ -68,6 +68,29 @@
68 68 variable can be read when reading some _other_ cpu's variables.
69 69  
70 70  
  71 +* Rules to follow when using local atomic operations
  72 +
  73 +- Variables touched by local ops must be per cpu variables.
  74 +- _Only_ the CPU owner of these variables must write to them.
  75 +- This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
  76 + to update its local_t variables.
  77 +- Preemption (or interrupts) must be disabled when using local ops in
  78 + process context to make sure the process won't be migrated to a
  79 + different CPU between getting the per-cpu variable and doing the
  80 + actual local op.
  81 +- When using local ops in interrupt context, no special care must be
  82 + taken on a mainline kernel, since they will run on the local CPU with
  83 + preemption already disabled. I suggest, however, to explicitly
  84 + disable preemption anyway to make sure it will still work correctly on
  85 + -rt kernels.
  86 +- Reading the local cpu variable will provide the current copy of the
  87 + variable.
  88 +- Reads of these variables can be done from any CPU, because updates to
  89 + "long", aligned, variables are always atomic. Since no memory
  90 + synchronization is done by the writer CPU, an outdated copy of the
  91 + variable can be read when reading some _other_ cpu's variables.
  92 +
  93 +
71 94 * How to use local atomic operations
72 95  
73 96 #include <linux/percpu.h>