smr
uint8_t smr;
noise_remote_smr_free(struct epoch_context *smr)
r = __containerof(smr, struct noise_remote, r_smr);
noise_keypair_smr_free(struct epoch_context *smr)
kp = __containerof(smr, struct noise_keypair, kp_smr);
pctrie_node_load(smr_pctnode_t *p, smr_t smr, enum pctrie_access access)
return (smr_entered_load(p, smr));
pctrie_root_load(struct pctrie *ptree, smr_t smr, enum pctrie_access access)
return (pctrie_node_load(pctrie_root(ptree), smr, access));
smr_t smr, enum pctrie_access access)
node = pctrie_root_load(ptree, smr, access);
node = pctrie_node_load(&node->pn_child[slot], smr, access);
pctrie_lookup_unlocked(struct pctrie *ptree, uint64_t index, smr_t smr)
smr_enter(smr);
node = _pctrie_lookup_node(ptree, NULL, index, &parent, smr,
smr_exit(smr);
struct pctrie_node **parent_out, smr_t smr, enum pctrie_access access)
smr, access);
smr, access);
uint64_t *value[], int count, smr_t smr)
smr_enter(smr);
smr, PCTRIE_SMR);
smr_exit(smr);
static SYSCTL_NODE(_debug, OID_AUTO, smr, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
smr_lazy_advance(smr_t smr, smr_shared_t s)
smr_default_advance(smr_t smr, smr_shared_t s)
KASSERT((zpcpu_get(smr)->c_flags & SMR_LAZY) == 0,
smr_wait(smr, goal - SMR_SEQ_MAX_ADVANCE);
smr_deferred_advance(smr_t smr, smr_shared_t s, smr_t self)
return (smr_default_advance(smr, s));
smr_advance(smr_t smr)
SMR_ASSERT_NOT_ENTERED(smr);
self = zpcpu_get(smr);
goal = smr_default_advance(smr, s);
goal = smr_lazy_advance(smr, s);
goal = smr_deferred_advance(smr, s, self);
smr_poll_scan(smr_t smr, smr_shared_t s, smr_seq_t s_rd_seq,
c_seq = smr_poll_cpu(zpcpu_get_cpu(smr, i), s_rd_seq, goal,
smr_poll(smr_t smr, smr_seq_t goal, bool wait)
KASSERT(!wait || !SMR_ENTERED(smr),
KASSERT(!wait || (zpcpu_get(smr)->c_flags & SMR_LAZY) == 0,
self = zpcpu_get(smr);
smr_lazy_advance(smr, s);
s_rd_seq = smr_poll_scan(smr, s, s_rd_seq, s_wr_seq, goal, wait);
smr_t smr, c;
smr = uma_zalloc_pcpu(smr_zone, M_WAITOK);
c = zpcpu_get_cpu(smr, i);
return (smr);
smr_destroy(smr_t smr)
smr_synchronize(smr);
uma_zfree(smr_shared_zone, smr->c_shared);
uma_zfree_pcpu(smr_zone, smr);
smr_zone = uma_zcreate("SMR CPU", sizeof(struct smr),
smr_t smr;
V_tcp_hostcache.smr = uma_zone_get_smr(V_tcp_hostcache.zone);
smr_enter(V_tcp_hostcache.smr);
smr_exit(V_tcp_hostcache.smr);
smr_exit(V_tcp_hostcache.smr);
smr_exit(V_tcp_hostcache.smr);
typedef struct smr *smr_t;
#define SMR_ENTERED(smr) \
(curthread->td_critnest != 0 && zpcpu_get((smr))->c_seq != SMR_SEQ_INVALID)
#define SMR_ASSERT_ENTERED(smr) \
KASSERT(SMR_ENTERED(smr), ("Not in smr section"))
#define SMR_ASSERT_NOT_ENTERED(smr) \
KASSERT(!SMR_ENTERED(smr), ("In smr section."));
smr_t smr);
uint64_t index, uint64_t *value[], int count, smr_t smr);
#define PCTRIE_DEFINE_SMR(name, type, field, allocfn, freefn, smr) \
key, (smr))); \
(smr)); \
smr_enter(smr_t smr)
smr = zpcpu_get(smr);
KASSERT((smr->c_flags & SMR_LAZY) == 0,
("smr_enter(%s) lazy smr.", smr->c_shared->s_name));
KASSERT(smr->c_seq == 0,
smr->c_shared->s_name));
atomic_add_acq_int(&smr->c_seq, smr_shared_current(smr->c_shared));
atomic_store_int(&smr->c_seq, smr_shared_current(smr->c_shared));
smr_exit(smr_t smr)
smr = zpcpu_get(smr);
KASSERT((smr->c_flags & SMR_LAZY) == 0,
("smr_exit(%s) lazy smr.", smr->c_shared->s_name));
KASSERT(smr->c_seq != SMR_SEQ_INVALID,
("smr_exit(%s) not in a smr section.", smr->c_shared->s_name));
atomic_store_rel_int(&smr->c_seq, SMR_SEQ_INVALID);
smr_lazy_enter(smr_t smr)
smr = zpcpu_get(smr);
KASSERT((smr->c_flags & SMR_LAZY) != 0,
("smr_lazy_enter(%s) non-lazy smr.", smr->c_shared->s_name));
KASSERT(smr->c_seq == 0,
smr->c_shared->s_name));
atomic_store_int(&smr->c_seq, smr_shared_current(smr->c_shared));
smr_lazy_exit(smr_t smr)
smr = zpcpu_get(smr);
KASSERT((smr->c_flags & SMR_LAZY) != 0,
("smr_lazy_enter(%s) non-lazy smr.", smr->c_shared->s_name));
KASSERT(smr->c_seq != SMR_SEQ_INVALID,
("smr_lazy_exit(%s) not in a smr section.", smr->c_shared->s_name));
atomic_store_int(&smr->c_seq, SMR_SEQ_INVALID);
smr_seq_t smr_advance(smr_t smr);
bool smr_poll(smr_t smr, smr_seq_t goal, bool wait);
void smr_destroy(smr_t smr);
smr_wait(smr_t smr, smr_seq_t goal)
(void)smr_poll(smr, goal, true);
smr_synchronize(smr_t smr)
smr_wait(smr, smr_advance(smr));
smr_current(smr_t smr)
return (smr_shared_current(zpcpu_get(smr)->c_shared));
#define smr_entered_load(p, smr) ({ \
SMR_ASSERT(SMR_ENTERED((smr)), "smr_entered_load"); \
void uma_zone_set_smr(uma_zone_t zone, smr_t smr);
uma_zone_set_smr(uma_zone_t zone, smr_t smr)
KASSERT(smr != NULL, ("Got NULL smr"));
zone->uz_smr = smr;