From: Theo Buehler Subject: Re: bgpd: rework rde out filters To: tech@openbsd.org Date: Fri, 13 Feb 2026 00:22:07 +0100 On Thu, Feb 12, 2026 at 04:40:10PM +0100, Claudio Jeker wrote: > The out filters are currently very expensive because at 700 peers > rde_filter_out() is chasing memory all over the place and spends lot of > time waiting for RAM access into pretty fat objects. > > Do the same thing as was done for filter_sets. Use a rde_filter struct > that uses an array of match rules and on top of this use a hash table > and refcnt to dedup equal filters. > > This diff reduces the initial load of my test IXP RS setup from 25min to > around 18min. So this change is a significant speedup on busy systems. > > I want to apply the same for inbound filters but that requires a fair > amount of reshuffling which will take some time. > ok tb Two very minor comments below. [...] > > Index: usr.sbin/bgpd/rde_filter.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde_filter.c,v > diff -u -p -r1.144 rde_filter.c > --- usr.sbin/bgpd/rde_filter.c 11 Feb 2026 12:25:57 -0000 1.144 > +++ usr.sbin/bgpd/rde_filter.c 11 Feb 2026 22:03:30 -0000 > @@ -56,6 +56,20 @@ struct rde_filter_set { > struct rde_filter_set_elm set[0]; > }; > > +struct rde_filter_rule { > + struct filter_match match; > + struct rde_filter_set *rde_set; > + enum filter_actions action; > + uint8_t quick; Nit: we usually indent with an extra space when there's no * [...] > +static int > +rde_filtertable_equal(const struct rde_filter *arf, > + const struct rde_filter *brf) > +{ > + if (arf->len != brf->len) > + return 0; > + if (memcmp(arf->rules, brf->rules, > + arf->len * sizeof(arf->rules[0])) != 0) > + return 0; > + return 1; Nit: I'd write this as return memcmp(...) == 0;