git: 3a33e39edd48 - main - pctrie: correct iter node after node allocation
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 28 Jun 2025 06:50:57 UTC
The branch main has been updated by dougm:
URL: https://cgit.FreeBSD.org/src/commit/?id=3a33e39edd4828cb81767acfe2d41306d8bdedf2
commit 3a33e39edd4828cb81767acfe2d41306d8bdedf2
Author: Doug Moore <dougm@FreeBSD.org>
AuthorDate: 2025-06-28 06:49:38 +0000
Commit: Doug Moore <dougm@FreeBSD.org>
CommitDate: 2025-06-28 06:49:38 +0000
pctrie: correct iter node after node allocation
Usually, a pctrie_iter operation leaves the iterator node pointing to
the last pctrie_node on the path to the found, or inserted, or removed
leaf. However, that is not the case when inserting a leaf causes the
allocation of a new pctrie node. In that case, the iterator node is
left pointing to the parent of the allocated node, and not to the
newly allocated node itself, the parent of the just-inserted
leaf. Correct this anomaly.
Reviewed by: markj, kib, alc
Differential Revision: https://reviews.freebsd.org/D51059
---
sys/sys/pctrie.h | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/sys/sys/pctrie.h b/sys/sys/pctrie.h
index 3ff11f2c79ae..6307ffb3b88c 100644
--- a/sys/sys/pctrie.h
+++ b/sys/sys/pctrie.h
@@ -130,7 +130,7 @@ name##_PCTRIE_PTR2VAL(struct type *ptr) \
\
static __inline __unused int \
name##_PCTRIE_INSERT_BASE(struct pctrie *ptree, uint64_t *val, \
- struct pctrie_node *parent, void *parentp, \
+ struct pctrie_node **parent, void *parentp, \
uint64_t *found, struct type **found_out) \
{ \
struct pctrie_node *child; \
@@ -146,7 +146,8 @@ name##_PCTRIE_INSERT_BASE(struct pctrie *ptree, uint64_t *val, \
*found_out = NULL; \
return (ENOMEM); \
} \
- pctrie_insert_node(val, parent, parentp, child); \
+ pctrie_insert_node(val, *parent, parentp, child); \
+ *parent = child; \
} \
return (0); \
} \
@@ -159,7 +160,7 @@ name##_PCTRIE_INSERT(struct pctrie *ptree, struct type *ptr) \
uint64_t *val = name##_PCTRIE_PTR2VAL(ptr); \
\
parentp = pctrie_insert_lookup_strict(ptree, val, &parent); \
- return (name##_PCTRIE_INSERT_BASE(ptree, val, parent, parentp, \
+ return (name##_PCTRIE_INSERT_BASE(ptree, val, &parent, parentp, \
NULL, NULL)); \
} \
\
@@ -173,7 +174,7 @@ name##_PCTRIE_FIND_OR_INSERT(struct pctrie *ptree, struct type *ptr, \
uint64_t *found; \
\
parentp = pctrie_insert_lookup(ptree, val, &parent, &found); \
- return (name##_PCTRIE_INSERT_BASE(ptree, val, parent, parentp, \
+ return (name##_PCTRIE_INSERT_BASE(ptree, val, &parent, parentp, \
found, found_out_opt)); \
} \
\
@@ -188,7 +189,7 @@ name##_PCTRIE_INSERT_LOOKUP_LE(struct pctrie *ptree, struct type *ptr, \
int retval; \
\
parentp = pctrie_insert_lookup(ptree, val, &parent, &found); \
- retval = name##_PCTRIE_INSERT_BASE(ptree, val, parent, parentp, \
+ retval = name##_PCTRIE_INSERT_BASE(ptree, val, &parent, parentp, \
found, found_out); \
if (retval != 0) \
return (retval); \
@@ -204,7 +205,7 @@ name##_PCTRIE_ITER_INSERT(struct pctrie_iter *it, struct type *ptr) \
uint64_t *val = name##_PCTRIE_PTR2VAL(ptr); \
\
parentp = pctrie_iter_insert_lookup(it, val); \
- return (name##_PCTRIE_INSERT_BASE(it->ptree, val, it->node, \
+ return (name##_PCTRIE_INSERT_BASE(it->ptree, val, &it->node, \
parentp, NULL, NULL)); \
} \
\