Skip to content

RCU

struct rcu_cpu {
uint32_t nesting;
uint64_t read_gen;
uint64_t qs_gen;
uint8_t _pad[64 - (sizeof(uint32_t) + 2 * sizeof(uint64_t)) % 64];
};
struct rcu_cb {
struct list_head list;
rcu_fn fn;
void *arg;
size_t gen_when_called;
size_t enqueued_waiting_on_gen;
size_t target_gen;
};

struct rcu_cb referenced types:

struct rcu_bucket {
struct spinlock lock;
struct list_head list;
};

struct rcu_bucket referenced types:

struct rcu_buckets {
struct semaphore sem;
struct rcu_bucket buckets[RCU_BUCKETS];
};

struct rcu_buckets referenced types:

struct rcu_gp {
uint64_t current_gen;
struct rcu_cpu *cpus;
};

struct rcu_gp referenced types:

typedef void (*rcu_fn)(struct rcu_cb *, void *);

type alias rcu_fn referenced types:

#define RCU_BUCKETS 2
#define rcu_cb_from_list_node(ln) (container_of(ln, struct rcu_cb, list))
#define rcu_dereference(p) atomic_load_explicit(&(p), memory_order_acquire)
#define rcu_assign_pointer(p, v) \ atomic_store_explicit(&(p), (v), memory_order_release)