Symbol: thmap
sys/kern/subr_thmap.c
1001
thmap_gc(thmap_t *thmap, void *ref)
sys/kern/subr_thmap.c
1007
gc_free(thmap, THMAP_GETOFF(thmap, &gc->data[0]), gc->len);
sys/kern/subr_thmap.c
1018
thmap_t *thmap;
sys/kern/subr_thmap.c
1027
thmap = kmem_zalloc(sizeof(thmap_t), KM_SLEEP);
sys/kern/subr_thmap.c
1028
thmap->baseptr = baseptr;
sys/kern/subr_thmap.c
1029
thmap->ops = ops ? ops : &thmap_default_ops;
sys/kern/subr_thmap.c
1030
thmap->flags = flags;
sys/kern/subr_thmap.c
1032
if ((thmap->flags & THMAP_SETROOT) == 0) {
sys/kern/subr_thmap.c
1034
root = gc_alloc(thmap, THMAP_ROOT_LEN);
sys/kern/subr_thmap.c
1036
kmem_free(thmap, sizeof(thmap_t));
sys/kern/subr_thmap.c
1039
thmap->root = THMAP_GETPTR(thmap, root);
sys/kern/subr_thmap.c
1040
memset(thmap->root, 0, THMAP_ROOT_LEN);
sys/kern/subr_thmap.c
1043
cprng_strong(kern_cprng, thmap->seed, sizeof thmap->seed, 0);
sys/kern/subr_thmap.c
1045
return thmap;
sys/kern/subr_thmap.c
1049
thmap_setroot(thmap_t *thmap, uintptr_t root_off)
sys/kern/subr_thmap.c
1051
if (thmap->root) {
sys/kern/subr_thmap.c
1054
thmap->root = THMAP_GETPTR(thmap, root_off);
sys/kern/subr_thmap.c
1059
thmap_getroot(const thmap_t *thmap)
sys/kern/subr_thmap.c
1061
return THMAP_GETOFF(thmap, thmap->root);
sys/kern/subr_thmap.c
1065
thmap_destroy(thmap_t *thmap)
sys/kern/subr_thmap.c
1067
uintptr_t root = THMAP_GETOFF(thmap, thmap->root);
sys/kern/subr_thmap.c
1070
ref = thmap_stage_gc(thmap);
sys/kern/subr_thmap.c
1071
thmap_gc(thmap, ref);
sys/kern/subr_thmap.c
1073
if ((thmap->flags & THMAP_SETROOT) == 0) {
sys/kern/subr_thmap.c
1074
gc_free(thmap, root, THMAP_ROOT_LEN);
sys/kern/subr_thmap.c
1076
kmem_free(thmap, sizeof(thmap_t));
sys/kern/subr_thmap.c
272
gc_alloc(const thmap_t *thmap, size_t len)
sys/kern/subr_thmap.c
275
const uintptr_t gcaddr = thmap->ops->alloc(alloclen);
sys/kern/subr_thmap.c
280
thmap_gc_t *const gc = THMAP_GETPTR(thmap, gcaddr);
sys/kern/subr_thmap.c
282
return THMAP_GETOFF(thmap, &gc->data[0]);
sys/kern/subr_thmap.c
286
gc_free(const thmap_t *thmap, uintptr_t addr, size_t len)
sys/kern/subr_thmap.c
289
char *const ptr = THMAP_GETPTR(thmap, addr);
sys/kern/subr_thmap.c
291
const uintptr_t gcaddr = THMAP_GETOFF(thmap, gc);
sys/kern/subr_thmap.c
295
thmap, thmap->ops, (void *)addr, len, gc, gc->len);
sys/kern/subr_thmap.c
296
thmap->ops->free(gcaddr, alloclen);
sys/kern/subr_thmap.c
403
hashval_getleafslot(const thmap_t *thmap,
sys/kern/subr_thmap.c
406
const void *key = THMAP_GETPTR(thmap, leaf->key);
sys/kern/subr_thmap.c
411
return (hash(thmap->seed, key, leaf->len, i) >> shift) & LEVEL_MASK;
sys/kern/subr_thmap.c
415
hashval_getl0slot(const thmap_t *thmap, const thmap_query_t *query,
sys/kern/subr_thmap.c
421
return hashval_getleafslot(thmap, leaf, 0);
sys/kern/subr_thmap.c
425
key_cmp_p(const thmap_t *thmap, const thmap_leaf_t *leaf,
sys/kern/subr_thmap.c
428
const void *leafkey = THMAP_GETPTR(thmap, leaf->key);
sys/kern/subr_thmap.c
437
node_create(thmap_t *thmap, thmap_inode_t *parent)
sys/kern/subr_thmap.c
442
p = gc_alloc(thmap, THMAP_INODE_LEN);
sys/kern/subr_thmap.c
446
node = THMAP_GETPTR(thmap, p);
sys/kern/subr_thmap.c
453
node->parent = THMAP_GETOFF(thmap, parent);
sys/kern/subr_thmap.c
498
leaf_create(const thmap_t *thmap, const void *key, size_t len, void *val)
sys/kern/subr_thmap.c
503
leaf_off = gc_alloc(thmap, sizeof(thmap_leaf_t));
sys/kern/subr_thmap.c
507
leaf = THMAP_GETPTR(thmap, leaf_off);
sys/kern/subr_thmap.c
510
if ((thmap->flags & THMAP_NOCOPY) == 0) {
sys/kern/subr_thmap.c
514
key_off = gc_alloc(thmap, len);
sys/kern/subr_thmap.c
516
gc_free(thmap, leaf_off, sizeof(thmap_leaf_t));
sys/kern/subr_thmap.c
519
memcpy(THMAP_GETPTR(thmap, key_off), key, len);
sys/kern/subr_thmap.c
531
leaf_free(const thmap_t *thmap, thmap_leaf_t *leaf)
sys/kern/subr_thmap.c
533
if ((thmap->flags & THMAP_NOCOPY) == 0) {
sys/kern/subr_thmap.c
534
gc_free(thmap, leaf->key, leaf->len);
sys/kern/subr_thmap.c
536
gc_free(thmap, THMAP_GETOFF(thmap, leaf), sizeof(thmap_leaf_t));
sys/kern/subr_thmap.c
540
get_leaf(const thmap_t *thmap, thmap_inode_t *parent, unsigned slot)
sys/kern/subr_thmap.c
549
return THMAP_NODE(thmap, node);
sys/kern/subr_thmap.c
563
root_try_put(thmap_t *thmap, const thmap_query_t *query, thmap_leaf_t *leaf)
sys/kern/subr_thmap.c
576
if (atomic_load_relaxed(&thmap->root[i])) {
sys/kern/subr_thmap.c
585
node = node_create(thmap, NULL);
sys/kern/subr_thmap.c
589
slot = hashval_getl0slot(thmap, query, leaf);
sys/kern/subr_thmap.c
590
node_insert(node, slot, THMAP_GETOFF(thmap, leaf) | THMAP_LEAF_BIT);
sys/kern/subr_thmap.c
591
nptr = THMAP_GETOFF(thmap, node);
sys/kern/subr_thmap.c
593
if (atomic_load_relaxed(&thmap->root[i])) {
sys/kern/subr_thmap.c
594
gc_free(thmap, nptr, THMAP_INODE_LEN);
sys/kern/subr_thmap.c
599
if (!atomic_compare_exchange_weak_explicit_ptr(&thmap->root[i], &expected,
sys/kern/subr_thmap.c
613
find_edge_node(const thmap_t *thmap, thmap_query_t *query,
sys/kern/subr_thmap.c
624
root_slot = atomic_load_consume(&thmap->root[query->rslot]);
sys/kern/subr_thmap.c
625
parent = THMAP_NODE(thmap, root_slot);
sys/kern/subr_thmap.c
636
parent = THMAP_NODE(thmap, node);
sys/kern/subr_thmap.c
661
find_edge_node_locked(const thmap_t *thmap, thmap_query_t *query,
sys/kern/subr_thmap.c
671
node = find_edge_node(thmap, query, key, len, slot);
sys/kern/subr_thmap.c
704
thmap_get(thmap_t *thmap, const void *key, size_t len)
sys/kern/subr_thmap.c
711
hashval_init(&query, thmap->seed, key, len);
sys/kern/subr_thmap.c
712
parent = find_edge_node(thmap, &query, key, len, &slot);
sys/kern/subr_thmap.c
716
leaf = get_leaf(thmap, parent, slot);
sys/kern/subr_thmap.c
720
if (!key_cmp_p(thmap, leaf, key, len)) {
sys/kern/subr_thmap.c
733
thmap_put(thmap_t *thmap, const void *key, size_t len, void *val)
sys/kern/subr_thmap.c
744
leaf = leaf_create(thmap, key, len, val);
sys/kern/subr_thmap.c
748
hashval_init(&query, thmap->seed, key, len);
sys/kern/subr_thmap.c
753
switch (root_try_put(thmap, &query, leaf)) {
sys/kern/subr_thmap.c
774
parent = find_edge_node_locked(thmap, &query, key, len, &slot);
sys/kern/subr_thmap.c
784
target = THMAP_GETOFF(thmap, leaf) | THMAP_LEAF_BIT;
sys/kern/subr_thmap.c
792
other = THMAP_NODE(thmap, target);
sys/kern/subr_thmap.c
793
if (key_cmp_p(thmap, other, key, len)) {
sys/kern/subr_thmap.c
798
leaf_free(thmap, leaf);
sys/kern/subr_thmap.c
808
child = node_create(thmap, parent);
sys/kern/subr_thmap.c
810
leaf_free(thmap, leaf);
sys/kern/subr_thmap.c
820
other_slot = hashval_getleafslot(thmap, other, query.level);
sys/kern/subr_thmap.c
821
target = THMAP_GETOFF(thmap, other) | THMAP_LEAF_BIT;
sys/kern/subr_thmap.c
832
atomic_store_release(&parent->slots[slot], THMAP_GETOFF(thmap, child));
sys/kern/subr_thmap.c
852
target = THMAP_GETOFF(thmap, leaf) | THMAP_LEAF_BIT;
sys/kern/subr_thmap.c
863
thmap_del(thmap_t *thmap, const void *key, size_t len)
sys/kern/subr_thmap.c
871
hashval_init(&query, thmap->seed, key, len);
sys/kern/subr_thmap.c
872
parent = find_edge_node_locked(thmap, &query, key, len, &slot);
sys/kern/subr_thmap.c
877
leaf = get_leaf(thmap, parent, slot);
sys/kern/subr_thmap.c
878
if (!leaf || !key_cmp_p(thmap, leaf, key, len)) {
sys/kern/subr_thmap.c
885
ASSERT(THMAP_NODE(thmap, atomic_load_relaxed(&parent->slots[slot]))
sys/kern/subr_thmap.c
905
parent = THMAP_NODE(thmap, node->parent);
sys/kern/subr_thmap.c
923
ASSERT(THMAP_NODE(thmap,
sys/kern/subr_thmap.c
928
stage_mem_gc(thmap, THMAP_GETOFF(thmap, node), THMAP_INODE_LEN);
sys/kern/subr_thmap.c
941
atomic_load_relaxed(&thmap->root[rslot]);
sys/kern/subr_thmap.c
945
ASSERT(THMAP_GETOFF(thmap, parent) == nptr);
sys/kern/subr_thmap.c
950
atomic_store_relaxed(&thmap->root[rslot], THMAP_NULL);
sys/kern/subr_thmap.c
952
stage_mem_gc(thmap, nptr, THMAP_INODE_LEN);
sys/kern/subr_thmap.c
960
if ((thmap->flags & THMAP_NOCOPY) == 0) {
sys/kern/subr_thmap.c
961
stage_mem_gc(thmap, leaf->key, leaf->len);
sys/kern/subr_thmap.c
963
stage_mem_gc(thmap, THMAP_GETOFF(thmap, leaf), sizeof(thmap_leaf_t));
sys/kern/subr_thmap.c
972
stage_mem_gc(thmap_t *thmap, uintptr_t addr, size_t len)
sys/kern/subr_thmap.c
974
char *const ptr = THMAP_GETPTR(thmap, addr);
sys/kern/subr_thmap.c
980
thmap, thmap->ops, (char *)addr, len, gc, gc->len);
sys/kern/subr_thmap.c
982
head = atomic_load_relaxed(&thmap->gc_list);
sys/kern/subr_thmap.c
986
if (!atomic_compare_exchange_weak_explicit_ptr(&thmap->gc_list, &head, gc,
sys/kern/subr_thmap.c
993
thmap_stage_gc(thmap_t *thmap)
sys/kern/subr_thmap.c
996
return atomic_exchange_explicit(&thmap->gc_list, NULL,
sys/net/if_wg.c
696
struct thmap *wg_peers_bypubkey;
sys/net/if_wg.c
697
struct thmap *wg_peers_byname;
sys/net/if_wg.c
698
struct thmap *wg_sessions_byindex;
sys/sys/thmap.h
36
struct thmap;
sys/sys/thmap.h
37
typedef struct thmap thmap_t;