diff options
author | Doug Moore <dougm@FreeBSD.org> | 2024-10-06 20:10:10 +0000 |
---|---|---|
committer | Doug Moore <dougm@FreeBSD.org> | 2024-10-06 20:10:10 +0000 |
commit | 9147a0c93bc0b93d2d9d11e0a5a4a7358d04137a (patch) | |
tree | ae7a2a348f9bdf839ff25ce72e42a87943dac49c | |
parent | 357185a966c10397c971ef23525943ebc47d58d9 (diff) | |
download | src-9147a0c93bc0b93d2d9d11e0a5a4a7358d04137a.tar.gz src-9147a0c93bc0b93d2d9d11e0a5a4a7358d04137a.zip |
pctrie: don't assign to root
User pctrie_root_store(*, PCTRIE_LOCKED) to change the root value of a
pctrie, to ensure proper synchronization when smr is in use.
Reviewed by: alc
Differential Revision: https://reviews.freebsd.org/D46968
-rw-r--r-- | sys/kern/subr_pctrie.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/subr_pctrie.c b/sys/kern/subr_pctrie.c index b461ffa3c5be..a7b487166054 100644 --- a/sys/kern/subr_pctrie.c +++ b/sys/kern/subr_pctrie.c @@ -304,7 +304,8 @@ pctrie_insert_lookup_compound(struct pctrie *ptree, uint64_t *val, if (pctrie_isleaf(node)) { if (node == PCTRIE_NULL) { if (parent == NULL) - ptree->pt_root = pctrie_toleaf(val); + pctrie_root_store(ptree, + pctrie_toleaf(val), PCTRIE_LOCKED); else pctrie_addnode(parent, index, pctrie_toleaf(val), PCTRIE_LOCKED); @@ -1242,7 +1243,8 @@ pctrie_replace(struct pctrie *ptree, uint64_t *newval) if (pctrie_isleaf(node)) { if ((m = pctrie_toval(node)) != NULL && *m == index) { if (parent == NULL) - ptree->pt_root = leaf; + pctrie_root_store(ptree, + leaf, PCTRIE_LOCKED); else pctrie_node_store( &parent->pn_child[slot], leaf, |