git: 725eb0f85ea9 - main - pctrie: drop freenode param to pctrie_remove
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 26 Jun 2025 22:54:53 UTC
The branch main has been updated by dougm:
URL: https://cgit.FreeBSD.org/src/commit/?id=725eb0f85ea9fb0c5745efe789f7dcfb1e9d78b3
commit 725eb0f85ea9fb0c5745efe789f7dcfb1e9d78b3
Author: Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-06-26 22:53:43 +0000
Commit: Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-06-26 22:53:43 +0000
pctrie: drop freenode param to pctrie_remove
Drop the freenode argument to pctrie_remove, and instead return a bool
to the caller so that the caller can set a freenode value to NULL or
something else.
Reviewed by: alc, markj, kib
Differential Revision: https://reviews.freebsd.org/D51057
---
sys/kern/subr_pctrie.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/sys/kern/subr_pctrie.c b/sys/kern/subr_pctrie.c
index 194e96ced471..3a3548bad52b 100644
--- a/sys/kern/subr_pctrie.c
+++ b/sys/kern/subr_pctrie.c
@@ -872,19 +872,17 @@ pctrie_iter_jump_le(struct pctrie_iter *it, int64_t jump)
* 'node'. If doing so causes 'node' to have only one child, purge it from the
* pctrie and save it in *freenode for later disposal.
*/
-static void
-pctrie_remove(struct pctrie *ptree, struct pctrie_node *node, uint64_t index,
- struct pctrie_node **freenode)
+static bool
+pctrie_remove(struct pctrie *ptree, struct pctrie_node *node, uint64_t index)
{
smr_pctnode_t *parentp;
struct pctrie_node *child;
int slot;
- *freenode = NULL;
parentp = pctrie_child(ptree, node, index);
if (node == NULL) {
pctrie_node_store(parentp, PCTRIE_NULL, PCTRIE_LOCKED);
- return;
+ return (false);
}
slot = pctrie_slot(node, index);
KASSERT((node->pn_popmap & (1 << slot)) != 0,
@@ -893,12 +891,11 @@ pctrie_remove(struct pctrie *ptree, struct pctrie_node *node, uint64_t index,
node->pn_popmap ^= 1 << slot;
if (!powerof2(node->pn_popmap)) {
pctrie_node_store(parentp, PCTRIE_NULL, PCTRIE_LOCKED);
- return;
+ return (false);
}
pctrie_node_store(parentp, PCTRIE_NULL, PCTRIE_UNSERIALIZED);
KASSERT(node->pn_popmap != 0, ("%s: bad popmap all zeroes", __func__));
slot = ffs(node->pn_popmap) - 1;
- *freenode = node;
child = pctrie_node_load(&node->pn_child[slot], NULL, PCTRIE_LOCKED);
KASSERT(child != PCTRIE_NULL,
("%s: bad popmap slot %d in node %p", __func__, slot, node));
@@ -907,6 +904,7 @@ pctrie_remove(struct pctrie *ptree, struct pctrie_node *node, uint64_t index,
pctrie_setparent(child, node);
parentp = pctrie_child(ptree, node, index);
pctrie_node_store(parentp, child, PCTRIE_LOCKED);
+ return (true);
}
/*
@@ -923,8 +921,8 @@ pctrie_remove_lookup(struct pctrie *ptree, uint64_t index,
node = _pctrie_lookup_node(ptree, NULL, index, &parent, NULL,
PCTRIE_LOCKED);
m = pctrie_match_value(node, index);
- if (m != NULL)
- pctrie_remove(ptree, parent, index, freenode);
+ if (m != NULL && pctrie_remove(ptree, parent, index))
+ *freenode = parent;
else
*freenode = NULL;
return (m);
@@ -941,9 +939,11 @@ pctrie_iter_remove(struct pctrie_iter *it, struct pctrie_node **freenode)
it->ptree, it->node, it->index), NULL, PCTRIE_LOCKED), it->index),
("%s: removing value %jx not at iter", __func__,
(uintmax_t)it->index));
- pctrie_remove(it->ptree, it->node, it->index, freenode);
- if (*freenode != NULL)
+ if (pctrie_remove(it->ptree, it->node, it->index)) {
+ *freenode = it->node;
it->node = pctrie_parent(it->node);
+ } else
+ *freenode = NULL;
}
/*