10.2.2 Linux Primitives Supporting Reference Counting
The Linux-kernel primitives used in the above examples are
summarized in the following list.
The RCU primitives may be unfamiliar to some readers,
so a brief overview with citations is included in
Section
.
- atomic_t
Type definition for 32-bit quantity to be manipulated atomically.
- void atomic_dec(atomic_t *var);
Atomically decrements the referenced variable without necessarily
issuing a memory barrier or disabling compiler optimizations.
- int atomic_dec_and_test(atomic_t *var);
Atomically decrements the referenced variable, returning
true if the result is zero.
Issues a memory barrier and disables compiler optimizations that
might otherwise move memory references across this primitive.
- void atomic_inc(atomic_t *var);
Atomically increments the referenced variable without necessarily
issuing a memory barrier or disabling compiler optimizations.
- int atomic_inc_not_zero(atomic_t *var);
Atomically increments the referenced variable, but only if the
value is non-zero, and returning true if the increment occurred.
Issues a memory barrier and disables compiler optimizations that
might otherwise move memory references across this primitive.
- int atomic_read(atomic_t *var);
Returns the integer value of the referenced variable.
This is not an atomic operation, and it neither issues memory
barriers nor disables compiler optimizations.
- void atomic_set(atomic_t *var, int val);
Sets the value of the referenced atomic variable to ``val''.
This is not an atomic operation, and it neither issues memory
barriers nor disables compiler optimizations.
- void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *head));
Invokes func(head) some time after all currently executing RCU
read-side critical sections complete, however, the call_rcu()
primitive returns immediately.
Note that head is normally a field within an RCU-protected
data structure, and that func is normally a function that
frees up this data structure.
The time interval between the invocation of call_rcu() and
the invocation of func is termed a ``grace period''.
Any interval of time containing a grace period is itself a
grace period.
- type *container_of(p, type, f);
Given a pointer ``p'' to a field ``f'' within a structure
of the specified type, return a pointer to the structure.
- void rcu_read_lock(void);
Marks the beginning of an RCU read-side critical section.
- void rcu_read_unlock(void);
Marks the end of an RCU read-side critical section.
RCU read-side critical sections may be nested.
- void smp_mb__before_atomic_dec(void);
Issues a memory barrier and disables code-motion compiler
optimizations only if the platform's atomic_dec()
primitive does not already do so.
- struct rcu_head
A data structure used by the RCU infrastructure to track
objects awaiting a grace period.
This is normally included as a field within an RCU-protected
data structure.
Paul E. McKenney
2011-12-16