diff options
author | Marko Zec <zec@FreeBSD.org> | 2021-09-15 20:36:59 +0000 |
---|---|---|
committer | Marko Zec <zec@FreeBSD.org> | 2021-09-18 17:37:35 +0000 |
commit | ad2cca48ed53e3282e9bc490074e75ccb50bffb9 (patch) | |
tree | c0d13af8d0535905a1a4997d67c8fe579b9898ef | |
parent | d3b9b83623f2b7ab89d9c09b3e93360e0b72402b (diff) |
[fib algo][dxr] Optimize trie updating.
Don't rebuild in vain trie parts unaffected by accumulated incremental
RIB updates.
PR: 257965
Tested by: Konrad Kreciwilk
MFC after: 3 days
(cherry picked from commit b51f8bae570b4e908191a1dae9da38aacf8c0fab)
-rw-r--r-- | sys/netinet/in_fib_dxr.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/netinet/in_fib_dxr.c b/sys/netinet/in_fib_dxr.c index 7afe2a3da024..3c4e5700cd6c 100644 --- a/sys/netinet/in_fib_dxr.c +++ b/sys/netinet/in_fib_dxr.c @@ -915,7 +915,14 @@ dxr2_try_squeeze: for (i = da->updates_low >> dxr_x; i <= da->updates_high >> dxr_x; i++) { - trie_unref(da, i); + if (!trie_rebuild) { + m = 0; + for (int j = 0; j < (1 << dxr_x); j += 32) + m |= da->updates_mask[((i << dxr_x) + j) >> 5]; + if (m == 0) + continue; + trie_unref(da, i); + } ti = trie_ref(da, i); if (ti < 0) return; |