20/10/2026 15:21, Vladimir Medvedkin:
> Currently, `install_to_dp()` builds one tbl8 level more than a route
> range needs when the range ends on a byte boundary. If the range
> spans a whole table at its first uncommon byte, e.g. a /32 or a /40,
> `build_common_root()` allocates a tbl8 one level too deep, all of
> its entries get the same next hop and `recycle_root_path()` frees it
> again. Below /24, an edge aligned on /24, e.g. of a /16, gets a tbl8 that
> `write_edge()` fills and recycles at once.
>
> These temporary tbl8s are not covered by `rsvd_tbl8s`, which counts
> only the levels the route set keeps. With a nearly full pool, an add
> that passed the reservation check runs out of tbl8s in the middle of the
> install, the tbl8 already linked into the dataplane is leaked and a later
> add that fits is refused. A /32 can not be added to a pool of one tbl8,
> nor deleted from a full pool.
>
> Fix it by not building these levels.
>
> Bugzilla ID: 1970
> Fixes: c3e12e0f0354 ("fib: add dataplane algorithm for IPv6")
> Cc: [email protected]
>
> Reported-by: Maxime Leroy <[email protected]>
> Signed-off-by: Vladimir Medvedkin <[email protected]>
Series applies, thanks.