Skip to content

Per-CPU Reference Counter

include/sync/percpu_rc.h View source View on GitHub
struct percpu_rc {
    _Atomic int64_t       count;
    _Atomic uintptr_t     percpu_count_ptr;
    percpu_rc_release_fn  release;
    bool                  allow_reinit;
    struct rcu_cb         rcu;
};
enum percpu_rc_flags {
    PERCPU_RC_INIT_ATOMIC = 1 << 0,
    PERCPU_RC_ALLOW_REINIT = 1 << 1,
};
typedef void (*percpu_rc_release_fn)(struct percpu_rc * *);
int percpu_rc_init(struct percpu_rc *ref, percpu_rc_release_fn release, enum percpu_rc_flags flags);
void percpu_rc_destroy(struct percpu_rc *ref);
void percpu_rc_kill(struct percpu_rc *ref);
void percpu_rc_reinit(struct percpu_rc *ref);
void percpu_rc_resurrect(struct percpu_rc *ref);
int64_t percpu_rc_read(struct percpu_rc *ref);
bool percpu_rc_is_percpu(uintptr_t pcpu);
void percpu_rc_get(struct percpu_rc *ref);
void percpu_rc_put(struct percpu_rc *ref);
bool percpu_rc_tryget(struct percpu_rc *ref);
bool percpu_rc_tryget_live(struct percpu_rc *ref);
bool percpu_rc_is_zero(struct percpu_rc *ref);
bool percpu_rc_is_dying(struct percpu_rc *ref);
#define PERCPU_COUNT_BIAS (1LL << 30)
#define PERCPU_RC_DEAD (1UL << 0)
#define PERCPU_RC_ATOMIC (1UL << 1)
#define PERCPU_RC_PTR_MASK (~(PERCPU_RC_DEAD | PERCPU_RC_ATOMIC))
#define PERCPU_RC_PTR(m) (int64_t *) (m & PERCPU_RC_PTR_MASK)