Skip to content

RCU

include/sync/rcu.h View source View on GitHub

Forward declaration so we can put this pointer in threads

struct rcu_cb (2 fields) source
§ struct list_node list
§ rcu_fn fn
TSA_REENTRANT_CAPABILITY_DECLARE("rcu", RCU_READ_LOCKED) (2 declarations) source
§ struct __RCU_READ_LOCKED_ctx
§ struct __RCU_READ_LOCKED_ctx RCU_READ_LOCKED
typedef void (*rcu_fn)(struct rcu_cb * *)
source
void rcu_init(void)
source
void rcu_synchronize(void)
source
void rcu_defer(struct rcu_cb *cc_nonnull_ptr, rcu_fn cc_nonnull_ptr)
source
void rcu_note_context_switch(struct thread *outgoing)
source
void rcu_note_irq_exit(void)
source
void rcu_idle_enter(void)
source
void rcu_idle_exit(void)
source
void rcu_read_guard_exit(int *unused)
source
int rcu_read_guard_enter(void)
source
#define rcu_cb_from_list_node(ln)
source
TODO

as debug flags get better, move away from raw TEST_ENABLED

Expansion
#define rcu_cb_from_list_node(ln) (container_of(ln, struct rcu_cb, list))
#define rcu_plain_t(p)
source
Expansion
#define rcu_plain_t(p) __typeof_unqual__(*(p)) *
#define rcu_dereference(p)
source
Expansion
#define rcu_dereference(p) \
    ((rcu_plain_t(p)) atomic_load_acq((_Atomic __typeof_unqual__(p) *) &(p)))
#define rcu_assign_pointer(p, v)
source
Expansion
#define rcu_assign_pointer(p, v) \
    ({ \
        rcu_plain_t(p) _v = (v); \
        atomic_store_release((_Atomic __typeof_unqual__(p) *) &(p), \
                             (__typeof_unqual__(p)) _v); \
        _v; \
    })
#define rcu_access_pointer(p)
source
Expansion
#define rcu_access_pointer(p) ((rcu_plain_t(p)) ca_read_once(p))
#define RCU_INIT_POINTER(p, v)
source
Expansion
#define RCU_INIT_POINTER(p, v) ((p) = (typeof(p)) (rcu_plain_t(p))(v))
#define rcu_read_guard()
source
Expansion
#define rcu_read_guard() \
    cc_cleanup(rcu_read_guard_exit) int PP_CONCAT( \
        rcu_read_guard_, __COUNTER__) = rcu_read_guard_enter()