Hi Vladimir,

On Tue, Mar 31, 2026 at 11:41 PM Maxime Leroy <[email protected]> wrote:
>
> This RFC proposes an optional shared tbl8 pool for FIB/FIB6,
> to address the difficulty of sizing num_tbl8 upfront.
>
> In practice, tbl8 usage depends on prefix distribution and
> evolves over time. In multi-VRF environments, some VRFs are
> elephants (full table, thousands of tbl8 groups) while others
> consume very little (mostly /24 or shorter). Per-FIB sizing
> forces each instance to provision for its worst case, leading
> to significant memory waste.
>
> A shared pool solves this: all FIBs draw from the same tbl8
> memory, so elephant VRFs use what they need while light VRFs
> cost almost nothing. The sharing granularity is flexible: one pool per
> VRF, per address family, a global pool, or no sharing at all.
>
> This series adds:
>
>   - A shared tbl8 pool, replacing per-backend allocation
>     (bitmap in dir24_8, stack in trie) with a common
>     refcounted O(1) stack allocator.
>   - An optional resizable mode (grow via alloc + copy + QSBR
>     synchronize), removing the need to guess peak usage at
>     creation time.
>   - A stats API (rte_fib_tbl8_pool_get_stats()) exposing
>     used/total/max counters.
>
> All features are opt-in:
>
>   - Existing per-FIB allocation remains the default.
>   - Shared pool is enabled via the tbl8_pool config field.
>   - Resize is enabled by setting max_tbl8 > 0 with QSBR.
>
> Shrinking (reducing pool capacity after usage drops) is not
> part of this series. It would always be best-effort since
> there is no compaction: if any tbl8 group near the end of the
> pool is still in use, the pool cannot shrink. The current LIFO
> free-list makes this less likely by immediately reusing freed
> high indices, which prevents a contiguous free tail from
> forming. A different allocation strategy (e.g. a min-heap
> favoring low indices) could improve shrink opportunities, but
> is better addressed separately.
>
> A working integration in Grout is available:
> https://github.com/DPDK/grout/pull/581 (still a draft)
>
> Maxime Leroy (5):
>   test/fib6: zero-initialize config struct
>   fib: share tbl8 definitions between fib and fib6
>   fib: add shared tbl8 pool
>   fib: add resizable tbl8 pool
>   fib: add tbl8 pool stats API
>
>  app/test/test_fib6.c        |  10 +-
>  lib/fib/dir24_8.c           | 234 ++++++++++---------------
>  lib/fib/dir24_8.h           |  17 +-
>  lib/fib/fib_tbl8.h          |  50 ++++++
>  lib/fib/fib_tbl8_pool.c     | 337 ++++++++++++++++++++++++++++++++++++
>  lib/fib/fib_tbl8_pool.h     | 113 ++++++++++++
>  lib/fib/meson.build         |   5 +-
>  lib/fib/rte_fib.h           |   3 +
>  lib/fib/rte_fib6.h          |   3 +
>  lib/fib/rte_fib_tbl8_pool.h | 149 ++++++++++++++++
>  lib/fib/trie.c              | 230 +++++++++---------------
>  lib/fib/trie.h              |  15 +-
>  12 files changed, 844 insertions(+), 322 deletions(-)
>  create mode 100644 lib/fib/fib_tbl8.h
>  create mode 100644 lib/fib/fib_tbl8_pool.c
>  create mode 100644 lib/fib/fib_tbl8_pool.h
>  create mode 100644 lib/fib/rte_fib_tbl8_pool.h
>

I’m following up on this RFC, which I sent at the end of March. Could
you please review it and let me know whether you have any feedback or
concerns?

Thanks,

-------------------------------
Maxime Leroy
[email protected]

Reply via email to