Extract common tbl8 definitions shared by dir24_8 and trie backends
into a new fib_tbl8.h header:
- FIB_TBL8_GRP_NUM_ENT constant (was DIR24_8_TBL8_GRP_NUM_ENT
and TRIE_TBL8_GRP_NUM_ENT)
- enum fib_nh_sz with static_asserts against public enums
- fib_tbl8_write() inline (was write_to_fib and write_to_dp)
Convert dir24_8 tbl8 index allocator from bitmap to stack, aligned
with the trie backend which already uses a stack-based allocator.
Signed-off-by: Maxime Leroy <[email protected]>
---
lib/fib/dir24_8.c | 151 +++++++++++++++++++--------------------------
lib/fib/dir24_8.h | 17 +++--
lib/fib/fib_tbl8.h | 50 +++++++++++++++
lib/fib/trie.c | 80 +++++++++---------------
lib/fib/trie.h | 11 +---
5 files changed, 155 insertions(+), 154 deletions(-)
create mode 100644 lib/fib/fib_tbl8.h
diff --git a/lib/fib/dir24_8.c b/lib/fib/dir24_8.c
index 489d2ef427..935eca12c3 100644
--- a/lib/fib/dir24_8.c
+++ b/lib/fib/dir24_8.c
@@ -17,6 +17,11 @@
#include "dir24_8.h"
#include "fib_log.h"
+static_assert((int)FIB_NH_SZ_1B == (int)RTE_FIB_DIR24_8_1B, "nh_sz 1B
mismatch");
+static_assert((int)FIB_NH_SZ_2B == (int)RTE_FIB_DIR24_8_2B, "nh_sz 2B
mismatch");
+static_assert((int)FIB_NH_SZ_4B == (int)RTE_FIB_DIR24_8_4B, "nh_sz 4B
mismatch");
+static_assert((int)FIB_NH_SZ_8B == (int)RTE_FIB_DIR24_8_8B, "nh_sz 8B
mismatch");
+
#ifdef CC_AVX512_SUPPORT
#include "dir24_8_avx512.h"
@@ -147,57 +152,27 @@ dir24_8_get_lookup_fn(void *p, enum rte_fib_lookup_type
type, bool be_addr)
return NULL;
}
-static void
-write_to_fib(void *ptr, uint64_t val, enum rte_fib_dir24_8_nh_sz size, int n)
+/*
+ * Get an index of a free tbl8 from the pool
+ */
+static inline int32_t
+tbl8_get(struct dir24_8_tbl *dp)
{
- int i;
- uint8_t *ptr8 = (uint8_t *)ptr;
- uint16_t *ptr16 = (uint16_t *)ptr;
- uint32_t *ptr32 = (uint32_t *)ptr;
- uint64_t *ptr64 = (uint64_t *)ptr;
-
- switch (size) {
- case RTE_FIB_DIR24_8_1B:
- for (i = 0; i < n; i++)
- ptr8[i] = (uint8_t)val;
- break;
- case RTE_FIB_DIR24_8_2B:
- for (i = 0; i < n; i++)
- ptr16[i] = (uint16_t)val;
- break;
- case RTE_FIB_DIR24_8_4B:
- for (i = 0; i < n; i++)
- ptr32[i] = (uint32_t)val;
- break;
- case RTE_FIB_DIR24_8_8B:
- for (i = 0; i < n; i++)
- ptr64[i] = (uint64_t)val;
- break;
- }
-}
+ if (dp->tbl8_pool_pos == dp->number_tbl8s)
+ /* no more free tbl8 */
+ return -ENOSPC;
-static int
-tbl8_get_idx(struct dir24_8_tbl *dp)
-{
- uint32_t i;
- int bit_idx;
-
- for (i = 0; (i < (dp->number_tbl8s >> BITMAP_SLAB_BIT_SIZE_LOG2)) &&
- (dp->tbl8_idxes[i] == UINT64_MAX); i++)
- ;
- if (i < (dp->number_tbl8s >> BITMAP_SLAB_BIT_SIZE_LOG2)) {
- bit_idx = rte_ctz64(~dp->tbl8_idxes[i]);
- dp->tbl8_idxes[i] |= (1ULL << bit_idx);
- return (i << BITMAP_SLAB_BIT_SIZE_LOG2) + bit_idx;
- }
- return -ENOSPC;
+ /* next index */
+ return dp->tbl8_pool[dp->tbl8_pool_pos++];
}
+/*
+ * Put an index of a free tbl8 back to the pool
+ */
static inline void
-tbl8_free_idx(struct dir24_8_tbl *dp, int idx)
+tbl8_put(struct dir24_8_tbl *dp, uint32_t tbl8_ind)
{
- dp->tbl8_idxes[idx >> BITMAP_SLAB_BIT_SIZE_LOG2] &=
- ~(1ULL << (idx & BITMAP_SLAB_BITMASK));
+ dp->tbl8_pool[--dp->tbl8_pool_pos] = tbl8_ind;
}
static int
@@ -206,34 +181,32 @@ tbl8_alloc(struct dir24_8_tbl *dp, uint64_t nh)
int64_t tbl8_idx;
uint8_t *tbl8_ptr;
- tbl8_idx = tbl8_get_idx(dp);
+ tbl8_idx = tbl8_get(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);
+ tbl8_idx = tbl8_get(dp);
if (tbl8_idx < 0)
return tbl8_idx;
tbl8_ptr = (uint8_t *)dp->tbl8 +
- ((tbl8_idx * DIR24_8_TBL8_GRP_NUM_ENT) <<
+ ((tbl8_idx * FIB_TBL8_GRP_NUM_ENT) <<
dp->nh_sz);
/*Init tbl8 entries with nexthop from tbl24*/
- write_to_fib((void *)tbl8_ptr, nh|
+ fib_tbl8_write((void *)tbl8_ptr, nh|
DIR24_8_EXT_ENT, dp->nh_sz,
- DIR24_8_TBL8_GRP_NUM_ENT);
- dp->cur_tbl8s++;
+ FIB_TBL8_GRP_NUM_ENT);
return tbl8_idx;
}
static void
tbl8_cleanup_and_free(struct dir24_8_tbl *dp, uint64_t tbl8_idx)
{
- uint8_t *ptr = (uint8_t *)dp->tbl8 + (tbl8_idx *
DIR24_8_TBL8_GRP_NUM_ENT << dp->nh_sz);
+ uint8_t *ptr = (uint8_t *)dp->tbl8 + (tbl8_idx * FIB_TBL8_GRP_NUM_ENT
<< dp->nh_sz);
- memset(ptr, 0, DIR24_8_TBL8_GRP_NUM_ENT << dp->nh_sz);
- tbl8_free_idx(dp, tbl8_idx);
- dp->cur_tbl8s--;
+ memset(ptr, 0, FIB_TBL8_GRP_NUM_ENT << dp->nh_sz);
+ tbl8_put(dp, tbl8_idx);
}
static void
@@ -258,9 +231,9 @@ tbl8_recycle(struct dir24_8_tbl *dp, uint32_t ip, uint64_t
tbl8_idx)
switch (dp->nh_sz) {
case RTE_FIB_DIR24_8_1B:
ptr8 = &((uint8_t *)dp->tbl8)[tbl8_idx *
- DIR24_8_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr8;
- for (i = 1; i < DIR24_8_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr8[i])
return;
}
@@ -269,9 +242,9 @@ tbl8_recycle(struct dir24_8_tbl *dp, uint32_t ip, uint64_t
tbl8_idx)
break;
case RTE_FIB_DIR24_8_2B:
ptr16 = &((uint16_t *)dp->tbl8)[tbl8_idx *
- DIR24_8_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr16;
- for (i = 1; i < DIR24_8_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr16[i])
return;
}
@@ -280,9 +253,9 @@ tbl8_recycle(struct dir24_8_tbl *dp, uint32_t ip, uint64_t
tbl8_idx)
break;
case RTE_FIB_DIR24_8_4B:
ptr32 = &((uint32_t *)dp->tbl8)[tbl8_idx *
- DIR24_8_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr32;
- for (i = 1; i < DIR24_8_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr32[i])
return;
}
@@ -291,9 +264,9 @@ tbl8_recycle(struct dir24_8_tbl *dp, uint32_t ip, uint64_t
tbl8_idx)
break;
case RTE_FIB_DIR24_8_8B:
ptr64 = &((uint64_t *)dp->tbl8)[tbl8_idx *
- DIR24_8_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr64;
- for (i = 1; i < DIR24_8_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr64[i])
return;
}
@@ -337,32 +310,32 @@ install_to_fib(struct dir24_8_tbl *dp, uint32_t ledge,
uint32_t redge,
* needs tbl8 for ledge and redge.
*/
tbl8_idx = tbl8_alloc(dp, tbl24_tmp);
- tmp_tbl8_idx = tbl8_get_idx(dp);
+ tmp_tbl8_idx = tbl8_get(dp);
if (tbl8_idx < 0)
return -ENOSPC;
else if (tmp_tbl8_idx < 0) {
- tbl8_free_idx(dp, tbl8_idx);
+ tbl8_put(dp, tbl8_idx);
return -ENOSPC;
}
- tbl8_free_idx(dp, tmp_tbl8_idx);
+ tbl8_put(dp, tmp_tbl8_idx);
/*update dir24 entry with tbl8 index*/
- write_to_fib(get_tbl24_p(dp, ledge,
+ fib_tbl8_write(get_tbl24_p(dp, ledge,
dp->nh_sz), (tbl8_idx << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, 1);
} else
tbl8_idx = tbl24_tmp >> 1;
tbl8_ptr = (uint8_t *)dp->tbl8 +
- (((tbl8_idx * DIR24_8_TBL8_GRP_NUM_ENT) +
+ (((tbl8_idx * FIB_TBL8_GRP_NUM_ENT) +
(ledge & ~DIR24_8_TBL24_MASK)) <<
dp->nh_sz);
/*update tbl8 with new next hop*/
- write_to_fib((void *)tbl8_ptr, (next_hop << 1)|
+ fib_tbl8_write((void *)tbl8_ptr, (next_hop << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, ROUNDUP(ledge, 24) - ledge);
tbl8_recycle(dp, ledge, tbl8_idx);
}
- write_to_fib(get_tbl24_p(dp, ROUNDUP(ledge, 24), dp->nh_sz),
+ fib_tbl8_write(get_tbl24_p(dp, ROUNDUP(ledge, 24), dp->nh_sz),
next_hop << 1, dp->nh_sz, len);
if (redge & ~DIR24_8_TBL24_MASK) {
tbl24_tmp = get_tbl24(dp, redge, dp->nh_sz);
@@ -372,17 +345,17 @@ install_to_fib(struct dir24_8_tbl *dp, uint32_t ledge,
uint32_t redge,
if (tbl8_idx < 0)
return -ENOSPC;
/*update dir24 entry with tbl8 index*/
- write_to_fib(get_tbl24_p(dp, redge,
+ fib_tbl8_write(get_tbl24_p(dp, redge,
dp->nh_sz), (tbl8_idx << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, 1);
} else
tbl8_idx = tbl24_tmp >> 1;
tbl8_ptr = (uint8_t *)dp->tbl8 +
- ((tbl8_idx * DIR24_8_TBL8_GRP_NUM_ENT) <<
+ ((tbl8_idx * FIB_TBL8_GRP_NUM_ENT) <<
dp->nh_sz);
/*update tbl8 with new next hop*/
- write_to_fib((void *)tbl8_ptr, (next_hop << 1)|
+ fib_tbl8_write((void *)tbl8_ptr, (next_hop << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, redge & ~DIR24_8_TBL24_MASK);
tbl8_recycle(dp, redge, tbl8_idx);
@@ -395,18 +368,18 @@ install_to_fib(struct dir24_8_tbl *dp, uint32_t ledge,
uint32_t redge,
if (tbl8_idx < 0)
return -ENOSPC;
/*update dir24 entry with tbl8 index*/
- write_to_fib(get_tbl24_p(dp, ledge, dp->nh_sz),
+ fib_tbl8_write(get_tbl24_p(dp, ledge, dp->nh_sz),
(tbl8_idx << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, 1);
} else
tbl8_idx = tbl24_tmp >> 1;
tbl8_ptr = (uint8_t *)dp->tbl8 +
- (((tbl8_idx * DIR24_8_TBL8_GRP_NUM_ENT) +
+ (((tbl8_idx * FIB_TBL8_GRP_NUM_ENT) +
(ledge & ~DIR24_8_TBL24_MASK)) <<
dp->nh_sz);
/*update tbl8 with new next hop*/
- write_to_fib((void *)tbl8_ptr, (next_hop << 1)|
+ fib_tbl8_write((void *)tbl8_ptr, (next_hop << 1)|
DIR24_8_EXT_ENT,
dp->nh_sz, redge - ledge);
tbl8_recycle(dp, ledge, tbl8_idx);
@@ -561,7 +534,9 @@ dir24_8_create(const char *name, int socket_id, struct
rte_fib_conf *fib_conf)
char mem_name[DIR24_8_NAMESIZE];
struct dir24_8_tbl *dp;
uint64_t def_nh;
+ uint64_t tbl8_sz;
uint32_t num_tbl8;
+ uint32_t i;
enum rte_fib_dir24_8_nh_sz nh_sz;
if ((name == NULL) || (fib_conf == NULL) ||
@@ -578,8 +553,7 @@ dir24_8_create(const char *name, int socket_id, struct
rte_fib_conf *fib_conf)
def_nh = fib_conf->default_nh;
nh_sz = fib_conf->dir24_8.nh_sz;
- num_tbl8 = RTE_ALIGN_CEIL(fib_conf->dir24_8.num_tbl8,
- BITMAP_SLAB_BIT_SIZE);
+ num_tbl8 = fib_conf->dir24_8.num_tbl8;
snprintf(mem_name, sizeof(mem_name), "DP_%s", name);
dp = rte_zmalloc_socket(name, sizeof(struct dir24_8_tbl) +
@@ -590,11 +564,8 @@ dir24_8_create(const char *name, int socket_id, struct
rte_fib_conf *fib_conf)
return NULL;
}
- /* Init table with default value */
- write_to_fib(dp->tbl24, (def_nh << 1), nh_sz, 1 << 24);
-
snprintf(mem_name, sizeof(mem_name), "TBL8_%p", dp);
- uint64_t tbl8_sz = DIR24_8_TBL8_GRP_NUM_ENT * (1ULL << nh_sz) *
+ tbl8_sz = FIB_TBL8_GRP_NUM_ENT * (1ULL << nh_sz) *
(num_tbl8 + 1);
dp->tbl8 = rte_zmalloc_socket(mem_name, tbl8_sz,
RTE_CACHE_LINE_SIZE, socket_id);
@@ -608,16 +579,24 @@ dir24_8_create(const char *name, int socket_id, struct
rte_fib_conf *fib_conf)
dp->number_tbl8s = num_tbl8;
snprintf(mem_name, sizeof(mem_name), "TBL8_idxes_%p", dp);
- dp->tbl8_idxes = rte_zmalloc_socket(mem_name,
- RTE_ALIGN_CEIL(dp->number_tbl8s, 64) >> 3,
+ dp->tbl8_pool = rte_zmalloc_socket(mem_name,
+ sizeof(uint32_t) * dp->number_tbl8s,
RTE_CACHE_LINE_SIZE, socket_id);
- if (dp->tbl8_idxes == NULL) {
+ if (dp->tbl8_pool == NULL) {
rte_errno = ENOMEM;
rte_free(dp->tbl8);
rte_free(dp);
return NULL;
}
+ /* Init pool with all tbl8 indices free */
+ for (i = 0; i < dp->number_tbl8s; i++)
+ dp->tbl8_pool[i] = i;
+ dp->tbl8_pool_pos = 0;
+
+ /* Init table with default value */
+ fib_tbl8_write(dp->tbl24, (def_nh << 1), nh_sz, 1 << 24);
+
return dp;
}
@@ -627,7 +606,7 @@ dir24_8_free(void *p)
struct dir24_8_tbl *dp = (struct dir24_8_tbl *)p;
rte_rcu_qsbr_dq_delete(dp->dq);
- rte_free(dp->tbl8_idxes);
+ rte_free(dp->tbl8_pool);
rte_free(dp->tbl8);
rte_free(dp);
}
diff --git a/lib/fib/dir24_8.h b/lib/fib/dir24_8.h
index b343b5d686..e75bd120ad 100644
--- a/lib/fib/dir24_8.h
+++ b/lib/fib/dir24_8.h
@@ -14,24 +14,21 @@
#include <rte_branch_prediction.h>
#include <rte_rcu_qsbr.h>
+#include "fib_tbl8.h"
+
/**
* @file
* DIR24_8 algorithm
*/
#define DIR24_8_TBL24_NUM_ENT (1 << 24)
-#define DIR24_8_TBL8_GRP_NUM_ENT 256U
#define DIR24_8_EXT_ENT 1
#define DIR24_8_TBL24_MASK 0xffffff00
-#define BITMAP_SLAB_BIT_SIZE_LOG2 6
-#define BITMAP_SLAB_BIT_SIZE (1 << BITMAP_SLAB_BIT_SIZE_LOG2)
-#define BITMAP_SLAB_BITMASK (BITMAP_SLAB_BIT_SIZE - 1)
-
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 */
+ uint32_t tbl8_pool_pos; /**< Next free index in pool */
enum rte_fib_dir24_8_nh_sz nh_sz; /**< Size of nexthop entry */
/* RCU config. */
enum rte_fib_qsbr_mode rcu_mode;/* Blocking, defer queue. */
@@ -39,7 +36,7 @@ struct dir24_8_tbl {
struct rte_rcu_qsbr_dq *dq; /* RCU QSBR defer queue. */
uint64_t def_nh; /**< Default next hop */
uint64_t *tbl8; /**< tbl8 table. */
- uint64_t *tbl8_idxes; /**< bitmap containing free tbl8 idxes*/
+ uint32_t *tbl8_pool; /**< Stack of free tbl8 indices */
/* tbl24 table. */
alignas(RTE_CACHE_LINE_SIZE) uint64_t tbl24[];
};
@@ -72,7 +69,7 @@ get_tbl24_idx(uint32_t ip)
static inline uint32_t
get_tbl8_idx(uint32_t res, uint32_t ip)
{
- return (res >> 1) * DIR24_8_TBL8_GRP_NUM_ENT + (uint8_t)ip;
+ return (res >> 1) * FIB_TBL8_GRP_NUM_ENT + (uint8_t)ip;
}
static inline uint64_t
@@ -133,14 +130,14 @@ static inline void dir24_8_lookup_bulk_##suffix(void *p,
const uint32_t *ips, \
tmp = ((type *)dp->tbl24)[ips[i] >> 8]; \
if (unlikely(is_entry_extended(tmp))) \
tmp = ((type *)dp->tbl8)[(uint8_t)ips[i] + \
- ((tmp >> 1) * DIR24_8_TBL8_GRP_NUM_ENT)]; \
+ ((tmp >> 1) * FIB_TBL8_GRP_NUM_ENT)]; \
next_hops[i] = tmp >> 1; \
} \
for (; i < n; i++) { \
tmp = ((type *)dp->tbl24)[ips[i] >> 8]; \
if (unlikely(is_entry_extended(tmp))) \
tmp = ((type *)dp->tbl8)[(uint8_t)ips[i] + \
- ((tmp >> 1) * DIR24_8_TBL8_GRP_NUM_ENT)]; \
+ ((tmp >> 1) * FIB_TBL8_GRP_NUM_ENT)]; \
next_hops[i] = tmp >> 1; \
} \
} \
diff --git a/lib/fib/fib_tbl8.h b/lib/fib/fib_tbl8.h
new file mode 100644
index 0000000000..b345c1e489
--- /dev/null
+++ b/lib/fib/fib_tbl8.h
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2026 Maxime Leroy, Free Mobile
+ */
+
+#ifndef _FIB_TBL8_H_
+#define _FIB_TBL8_H_
+
+/**
+ * @file
+ * Common tbl8 definitions shared by dir24_8 and trie backends.
+ */
+
+#include <stdint.h>
+
+#define FIB_TBL8_GRP_NUM_ENT 256U
+
+/** Nexthop size (log2 of byte width) */
+enum fib_nh_sz {
+ FIB_NH_SZ_1B = 0,
+ FIB_NH_SZ_2B = 1,
+ FIB_NH_SZ_4B = 2,
+ FIB_NH_SZ_8B = 3,
+};
+
+static inline void
+fib_tbl8_write(void *ptr, uint64_t val, uint8_t nh_sz, int n)
+{
+ int i;
+
+ switch (nh_sz) {
+ case FIB_NH_SZ_1B:
+ for (i = 0; i < n; i++)
+ ((uint8_t *)ptr)[i] = (uint8_t)val;
+ break;
+ case FIB_NH_SZ_2B:
+ for (i = 0; i < n; i++)
+ ((uint16_t *)ptr)[i] = (uint16_t)val;
+ break;
+ case FIB_NH_SZ_4B:
+ for (i = 0; i < n; i++)
+ ((uint32_t *)ptr)[i] = (uint32_t)val;
+ break;
+ case FIB_NH_SZ_8B:
+ for (i = 0; i < n; i++)
+ ((uint64_t *)ptr)[i] = (uint64_t)val;
+ break;
+ }
+}
+
+#endif /* _FIB_TBL8_H_ */
diff --git a/lib/fib/trie.c b/lib/fib/trie.c
index fa5d9ec6b0..198fc54395 100644
--- a/lib/fib/trie.c
+++ b/lib/fib/trie.c
@@ -16,6 +16,10 @@
#include "fib_log.h"
#include "trie.h"
+static_assert((int)FIB_NH_SZ_2B == (int)RTE_FIB6_TRIE_2B, "nh_sz 2B mismatch");
+static_assert((int)FIB_NH_SZ_4B == (int)RTE_FIB6_TRIE_4B, "nh_sz 4B mismatch");
+static_assert((int)FIB_NH_SZ_8B == (int)RTE_FIB6_TRIE_8B, "nh_sz 8B mismatch");
+
#ifdef CC_AVX512_SUPPORT
#include "trie_avx512.h"
@@ -95,30 +99,6 @@ trie_get_lookup_fn(void *p, enum rte_fib6_lookup_type type)
return NULL;
}
-static void
-write_to_dp(void *ptr, uint64_t val, enum rte_fib_trie_nh_sz size, int n)
-{
- int i;
- uint16_t *ptr16 = (uint16_t *)ptr;
- uint32_t *ptr32 = (uint32_t *)ptr;
- uint64_t *ptr64 = (uint64_t *)ptr;
-
- switch (size) {
- case RTE_FIB6_TRIE_2B:
- for (i = 0; i < n; i++)
- ptr16[i] = (uint16_t)val;
- break;
- case RTE_FIB6_TRIE_4B:
- for (i = 0; i < n; i++)
- ptr32[i] = (uint32_t)val;
- break;
- case RTE_FIB6_TRIE_8B:
- for (i = 0; i < n; i++)
- ptr64[i] = (uint64_t)val;
- break;
- }
-}
-
static void
tbl8_pool_init(struct rte_trie_tbl *dp)
{
@@ -170,19 +150,19 @@ tbl8_alloc(struct rte_trie_tbl *dp, uint64_t nh)
if (tbl8_idx < 0)
return tbl8_idx;
tbl8_ptr = get_tbl_p_by_idx(dp->tbl8,
- tbl8_idx * TRIE_TBL8_GRP_NUM_ENT, dp->nh_sz);
+ tbl8_idx * FIB_TBL8_GRP_NUM_ENT, dp->nh_sz);
/*Init tbl8 entries with nexthop from tbl24*/
- write_to_dp((void *)tbl8_ptr, nh, dp->nh_sz,
- TRIE_TBL8_GRP_NUM_ENT);
+ fib_tbl8_write((void *)tbl8_ptr, nh, dp->nh_sz,
+ FIB_TBL8_GRP_NUM_ENT);
return tbl8_idx;
}
static void
tbl8_cleanup_and_free(struct rte_trie_tbl *dp, uint64_t tbl8_idx)
{
- uint8_t *ptr = (uint8_t *)dp->tbl8 + (tbl8_idx * TRIE_TBL8_GRP_NUM_ENT
<< dp->nh_sz);
+ uint8_t *ptr = (uint8_t *)dp->tbl8 + (tbl8_idx * FIB_TBL8_GRP_NUM_ENT
<< dp->nh_sz);
- memset(ptr, 0, TRIE_TBL8_GRP_NUM_ENT << dp->nh_sz);
+ memset(ptr, 0, FIB_TBL8_GRP_NUM_ENT << dp->nh_sz);
tbl8_put(dp, tbl8_idx);
}
@@ -206,39 +186,39 @@ tbl8_recycle(struct rte_trie_tbl *dp, void *par, uint64_t
tbl8_idx)
switch (dp->nh_sz) {
case RTE_FIB6_TRIE_2B:
ptr16 = &((uint16_t *)dp->tbl8)[tbl8_idx *
- TRIE_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr16;
if (nh & TRIE_EXT_ENT)
return;
- for (i = 1; i < TRIE_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr16[i])
return;
}
- write_to_dp(par, nh, dp->nh_sz, 1);
+ fib_tbl8_write(par, nh, dp->nh_sz, 1);
break;
case RTE_FIB6_TRIE_4B:
ptr32 = &((uint32_t *)dp->tbl8)[tbl8_idx *
- TRIE_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr32;
if (nh & TRIE_EXT_ENT)
return;
- for (i = 1; i < TRIE_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr32[i])
return;
}
- write_to_dp(par, nh, dp->nh_sz, 1);
+ fib_tbl8_write(par, nh, dp->nh_sz, 1);
break;
case RTE_FIB6_TRIE_8B:
ptr64 = &((uint64_t *)dp->tbl8)[tbl8_idx *
- TRIE_TBL8_GRP_NUM_ENT];
+ FIB_TBL8_GRP_NUM_ENT];
nh = *ptr64;
if (nh & TRIE_EXT_ENT)
return;
- for (i = 1; i < TRIE_TBL8_GRP_NUM_ENT; i++) {
+ for (i = 1; i < FIB_TBL8_GRP_NUM_ENT; i++) {
if (nh != ptr64[i])
return;
}
- write_to_dp(par, nh, dp->nh_sz, 1);
+ fib_tbl8_write(par, nh, dp->nh_sz, 1);
break;
}
@@ -265,7 +245,7 @@ get_idx(const struct rte_ipv6_addr *ip, uint32_t prev_idx,
int bytes, int first_
bitshift = (int8_t)(((first_byte + bytes - 1) - i)*BYTE_SIZE);
idx |= ip->a[i] << bitshift;
}
- return (prev_idx * TRIE_TBL8_GRP_NUM_ENT) + idx;
+ return (prev_idx * FIB_TBL8_GRP_NUM_ENT) + idx;
}
static inline uint64_t
@@ -303,7 +283,7 @@ recycle_root_path(struct rte_trie_tbl *dp, const uint8_t
*ip_part,
if (common_tbl8 != 0) {
p = get_tbl_p_by_idx(dp->tbl8, (val >> 1) *
- TRIE_TBL8_GRP_NUM_ENT + *ip_part, dp->nh_sz);
+ FIB_TBL8_GRP_NUM_ENT + *ip_part, dp->nh_sz);
recycle_root_path(dp, ip_part + 1, common_tbl8 - 1, p);
}
tbl8_recycle(dp, prev, val >> 1);
@@ -327,7 +307,7 @@ build_common_root(struct rte_trie_tbl *dp, const struct
rte_ipv6_addr *ip,
idx = tbl8_alloc(dp, val);
if (unlikely(idx < 0))
return idx;
- write_to_dp(tbl_ptr, (idx << 1) |
+ fib_tbl8_write(tbl_ptr, (idx << 1) |
TRIE_EXT_ENT, dp->nh_sz, 1);
prev_idx = idx;
} else
@@ -336,7 +316,7 @@ build_common_root(struct rte_trie_tbl *dp, const struct
rte_ipv6_addr *ip,
j = i;
cur_tbl = dp->tbl8;
}
- *tbl = get_tbl_p_by_idx(cur_tbl, prev_idx * TRIE_TBL8_GRP_NUM_ENT,
+ *tbl = get_tbl_p_by_idx(cur_tbl, prev_idx * FIB_TBL8_GRP_NUM_ENT,
dp->nh_sz);
return 0;
}
@@ -361,22 +341,22 @@ write_edge(struct rte_trie_tbl *dp, const uint8_t
*ip_part, uint64_t next_hop,
val = (tbl8_idx << 1)|TRIE_EXT_ENT;
}
p = get_tbl_p_by_idx(dp->tbl8, (tbl8_idx *
- TRIE_TBL8_GRP_NUM_ENT) + *ip_part, dp->nh_sz);
+ FIB_TBL8_GRP_NUM_ENT) + *ip_part, dp->nh_sz);
ret = write_edge(dp, ip_part + 1, next_hop, len - 1, edge, p);
if (ret < 0)
return ret;
if (edge == LEDGE) {
- write_to_dp(RTE_PTR_ADD(p, (uintptr_t)(1) << dp->nh_sz),
+ fib_tbl8_write(RTE_PTR_ADD(p, (uintptr_t)(1) <<
dp->nh_sz),
next_hop << 1, dp->nh_sz, UINT8_MAX - *ip_part);
} else {
- write_to_dp(get_tbl_p_by_idx(dp->tbl8, tbl8_idx *
- TRIE_TBL8_GRP_NUM_ENT, dp->nh_sz),
+ fib_tbl8_write(get_tbl_p_by_idx(dp->tbl8, tbl8_idx *
+ FIB_TBL8_GRP_NUM_ENT, dp->nh_sz),
next_hop << 1, dp->nh_sz, *ip_part);
}
tbl8_recycle(dp, &val, tbl8_idx);
}
- write_to_dp(ent, val, dp->nh_sz, 1);
+ fib_tbl8_write(ent, val, dp->nh_sz, 1);
return ret;
}
@@ -444,7 +424,7 @@ install_to_dp(struct rte_trie_tbl *dp, const struct
rte_ipv6_addr *ledge,
if (right_idx > left_idx + 1) {
ent = get_tbl_p_by_idx(common_root_tbl, left_idx + 1,
dp->nh_sz);
- write_to_dp(ent, next_hop << 1, dp->nh_sz,
+ fib_tbl8_write(ent, next_hop << 1, dp->nh_sz,
right_idx - (left_idx + 1));
}
ent = get_tbl_p_by_idx(common_root_tbl, right_idx, dp->nh_sz);
@@ -686,10 +666,10 @@ trie_create(const char *name, int socket_id,
return dp;
}
- write_to_dp(&dp->tbl24, (def_nh << 1), nh_sz, 1 << 24);
+ fib_tbl8_write(&dp->tbl24, (def_nh << 1), nh_sz, 1 << 24);
snprintf(mem_name, sizeof(mem_name), "TBL8_%p", dp);
- dp->tbl8 = rte_zmalloc_socket(mem_name, TRIE_TBL8_GRP_NUM_ENT *
+ dp->tbl8 = rte_zmalloc_socket(mem_name, FIB_TBL8_GRP_NUM_ENT *
(1ll << nh_sz) * (num_tbl8 + 1),
RTE_CACHE_LINE_SIZE, socket_id);
if (dp->tbl8 == NULL) {
diff --git a/lib/fib/trie.h b/lib/fib/trie.h
index c34cc2c057..30fa886792 100644
--- a/lib/fib/trie.h
+++ b/lib/fib/trie.h
@@ -11,6 +11,8 @@
#include <rte_common.h>
#include <rte_fib6.h>
+#include "fib_tbl8.h"
+
/**
* @file
* RTE IPv6 Longest Prefix Match (LPM)
@@ -18,21 +20,14 @@
/* @internal Total number of tbl24 entries. */
#define TRIE_TBL24_NUM_ENT (1 << 24)
-/* @internal Number of entries in a tbl8 group. */
-#define TRIE_TBL8_GRP_NUM_ENT 256ULL
/* @internal Total number of tbl8 groups in the tbl8. */
#define TRIE_TBL8_NUM_GROUPS 65536
/* @internal bitmask with valid and valid_group fields set */
#define TRIE_EXT_ENT 1
-#define BITMAP_SLAB_BIT_SIZE_LOG2 6
-#define BITMAP_SLAB_BIT_SIZE (1ULL << BITMAP_SLAB_BIT_SIZE_LOG2)
-#define BITMAP_SLAB_BITMASK (BITMAP_SLAB_BIT_SIZE - 1)
-
struct rte_trie_tbl {
uint32_t number_tbl8s; /**< Total number of tbl8s */
uint32_t rsvd_tbl8s; /**< Number of reserved tbl8s */
- uint32_t cur_tbl8s; /**< Current cumber of tbl8s */
uint64_t def_nh; /**< Default next hop */
enum rte_fib_trie_nh_sz nh_sz; /**< Size of nexthop entry */
uint64_t *tbl8; /**< tbl8 table. */
@@ -124,7 +119,7 @@ static inline void rte_trie_lookup_bulk_##suffix(void *p,
\
j = 3; \
while (is_entry_extended(tmp)) { \
tmp = ((type *)dp->tbl8)[ips[i].a[j++] + \
- ((tmp >> 1) * TRIE_TBL8_GRP_NUM_ENT)]; \
+ ((tmp >> 1) * FIB_TBL8_GRP_NUM_ENT)]; \
} \
next_hops[i] = tmp >> 1; \
} \
--
2.43.0