Hey folks, Maxime Leroy, Mar 23, 2026 at 15:53: > Fair point on VLAN subinterfaces and MPLS VPN. SRv6 L3VPN (End.DT4/ > End.DT6) also fits that pattern after decap. > > I agree DPDK often pre-allocates for performance, but I wonder if the > flat TBL24 actually helps here. Each VRF's working set is spread > 128 MB apart in the flat table. Would regrouping packets by VRF and > doing one bulk lookup per VRF with separate contiguous TBL24s be > more cache-friendly than a single mixed-VRF gather? Do you have > benchmarks comparing the two approaches?
> On the memory trade-off and VRF ID mapping: the API uses vrf_id as > a direct index (0 to max_vrfs-1). With 256 VRFs and 8B nexthops, > TBL24 alone costs 32 GB for IPv4 and 32 GB for IPv6 -- 64 GB total > at startup. In grout, VRF IDs are interface IDs that can be any > uint16_t, so we would also need to maintain a mapping between our > VRF IDs and FIB slot indices. We would need to introduce a max_vrfs > limit, which forces a bad trade-off: either set it low (e.g. 16) > and limit deployments, or set it high (e.g. 256) and pay 64 GB at > startup even with a single VRF. With separate FIB instances per VRF, > we only allocate what we use. I am also concerned about the global memory consumption. Taking grout as a live example, we currently support up to 1024 VRFs (each VRF is an interface so the upper limit is just the number of interfaces). Pre-allocating 1024 rte_fib and rte_fib6 is virtually impossible. > On the IPv4/IPv6 TBL8 pool: I was not suggesting merging FIBs, just > sharing the TBL8 block allocator between separate FIB instances. > This is possible since dir24_8 and trie use the same TBL8 block > format (256 entries, same encoding, same size). > > Would it be possible to pass a shared TBL8 pool at rte_fib_create() > time? Each FIB keeps its own TBL24 and RIB, but TBL8 is shared > across all FIBs and potentially across IPv4/IPv6. Users would no > longer have to guess num_tbl8 per FIB. +1 to this. That would help a lot to have a common tbl8 pool. That way we could keep the single VRF per fib/rib but have a global tbl8 pool that we can tune to our use case. Cheers,

