[RFC 3/3] fib: drop redundant tbl8 reservation counter
Maxime Leroy
maxime at leroys.fr
Thu May 7 11:50:43 CEST 2026
In dir24_8, rsvd_tbl8s mirrors cur_tbl8s: both are bumped when
depth > 24 and no /24+ cover exists, and decremented under the
same condition. Removing rsvd_tbl8s leaves cur_tbl8s as the
single source of truth for the pre-check.
Move the DQ reclaim retry from tbl8_alloc() into the pre-check,
mirroring the layout used by the trie path. Behavior is unchanged
for non-DQ modes; in DQ mode the pre-check now performs the
reclaim that the in-allocator retry used to perform.
Signed-off-by: Maxime Leroy <maxime at leroys.fr>
---
lib/fib/dir24_8.c | 31 ++++++++++---------------------
lib/fib/dir24_8.h | 1 -
2 files changed, 10 insertions(+), 22 deletions(-)
diff --git a/lib/fib/dir24_8.c b/lib/fib/dir24_8.c
index 489d2ef427..80215b93b0 100644
--- a/lib/fib/dir24_8.c
+++ b/lib/fib/dir24_8.c
@@ -207,12 +207,6 @@ tbl8_alloc(struct dir24_8_tbl *dp, uint64_t nh)
uint8_t *tbl8_ptr;
tbl8_idx = tbl8_get_idx(dp);
-
- /* If there are no tbl8 groups try to reclaim one. */
- if (unlikely(tbl8_idx == -ENOSPC && dp->dq &&
- !rte_rcu_qsbr_dq_reclaim(dp->dq, 1, NULL, NULL, NULL)))
- tbl8_idx = tbl8_get_idx(dp);
-
if (tbl8_idx < 0)
return tbl8_idx;
tbl8_ptr = (uint8_t *)dp->tbl8 +
@@ -504,9 +498,14 @@ dir24_8_modify(struct rte_fib *fib, uint32_t ip, uint8_t depth,
tmp = rte_rib_get_nxt(rib, ip, 24, NULL,
RTE_RIB_GET_NXT_COVER);
if ((tmp == NULL) &&
- (dp->rsvd_tbl8s >= dp->number_tbl8s))
- return -ENOSPC;
-
+ (dp->cur_tbl8s >= dp->number_tbl8s)) {
+ /* Reclaim deferred tbl8s before failing. */
+ if (dp->dq != NULL)
+ rte_rcu_qsbr_dq_reclaim(dp->dq, 1,
+ NULL, NULL, NULL);
+ if (dp->cur_tbl8s >= dp->number_tbl8s)
+ return -ENOSPC;
+ }
}
node = rte_rib_insert(rib, ip, depth);
if (node == NULL)
@@ -516,16 +515,13 @@ dir24_8_modify(struct rte_fib *fib, uint32_t ip, uint8_t depth,
if (parent != NULL) {
rte_rib_get_nh(parent, &par_nh);
if (par_nh == next_hop)
- goto successfully_added;
+ return 0;
}
ret = modify_fib(dp, rib, ip, depth, next_hop);
if (ret != 0) {
rte_rib_remove(rib, ip, depth);
return ret;
}
-successfully_added:
- if ((depth > 24) && (tmp == NULL))
- dp->rsvd_tbl8s++;
return 0;
case RTE_FIB_DEL:
if (node == NULL)
@@ -539,15 +535,8 @@ dir24_8_modify(struct rte_fib *fib, uint32_t ip, uint8_t depth,
ret = modify_fib(dp, rib, ip, depth, par_nh);
} else
ret = modify_fib(dp, rib, ip, depth, dp->def_nh);
- if (ret == 0) {
+ if (ret == 0)
rte_rib_remove(rib, ip, depth);
- if (depth > 24) {
- tmp = rte_rib_get_nxt(rib, ip, 24, NULL,
- RTE_RIB_GET_NXT_COVER);
- if (tmp == NULL)
- dp->rsvd_tbl8s--;
- }
- }
return ret;
default:
break;
diff --git a/lib/fib/dir24_8.h b/lib/fib/dir24_8.h
index b343b5d686..502540173c 100644
--- a/lib/fib/dir24_8.h
+++ b/lib/fib/dir24_8.h
@@ -30,7 +30,6 @@
struct dir24_8_tbl {
uint32_t number_tbl8s; /**< Total number of tbl8s */
- uint32_t rsvd_tbl8s; /**< Number of reserved tbl8s */
uint32_t cur_tbl8s; /**< Current number of tbl8s */
enum rte_fib_dir24_8_nh_sz nh_sz; /**< Size of nexthop entry */
/* RCU config. */
--
2.43.0
More information about the dev
mailing list