HomeFreeBSD

fib_dxr: check if cached fib_data matches the new request in dxr_init()

Description

fib_dxr: check if cached fib_data matches the new request in dxr_init()

When calling dxr_init(), the FIB_ALGO infrastructure may provide a
pointer to a previous dxr instance, which permits reuse of auxiliary
dxr structures, i.e. incremental lookup structure updates. For dxr this
is a crucial feature provided by FIB_ALGO, since dxr incremental updates
are typically several orders of magnitude faster than full lookup table
rebuilds.

However, the auxiliary dxr structure caches a pointer to struct fib_data and
relies upon it for performing incremental updates. Apparently, incremental
rebuild requests from FIB_ALGO, i.e. a calls to dxr_init() with a pointer
old_data set, may (under not yet fully understood circumstances) be invoked
within a different fib_data context than the one cached in the previous
version of dxr auxiliary structures. In such (rare) events, we ignore the
offered old dxr context, and proceed with a full lookup structure rebuild
instead of attempting an incremental one using a fib_data context which
may or may not no longer be valid, and thus lead to a system crash.

PR: 278422
MFC after: 1 week
Approved by: re (cperciva)

(cherry picked from commit 4ab122e8ef127d36d95f874e85600c36c87c8c22)
(cherry picked from commit d6e32525c778d92c26a37f4e1b562e80b18a9af7)

Details

Provenance
zecAuthored on Fri, May 17, 3:55 PM
Parents
rG0e5e6a9419ea: fib_dxr: s/KASSERT/MPASS/
Branches
Unknown
Tags
Unknown