The branch main has been updated by dougm:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=725eb0f85ea9fb0c5745efe789f7dcfb1e9d78b3

commit 725eb0f85ea9fb0c5745efe789f7dcfb1e9d78b3
Author:     Doug Moore <do...@freebsd.org>
AuthorDate: 2025-06-26 22:53:43 +0000
Commit:     Doug Moore <do...@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;
 }
 
 /*

Reply via email to