From 1771f70d7473b8c8e0c6bd47d5c35cc5fbe7eb19 Mon Sep 17 00:00:00 2001 From: Jan Maria Matejka Date: Tue, 19 Jun 2018 16:16:08 +0200 Subject: [PATCH] Filter: fixed eattr cached pointer Use ACCESS_RTE to guard **f_rte, use ACCESS_EATTRS to guard **f_eattrs. Use f_rta_cow() before writing to rta or eattrs, use f_rte_cow() before writing preference (stored in rte). Do not access eattrs indirectly through (*f_rte)->attrs->eattrs, it is way too slow. The cached pointer is faster. --- filter/filter.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/filter/filter.c b/filter/filter.c index 6290e74a..439fd5bf 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -554,7 +554,6 @@ static inline void f_rte_cow(void) return; *f_rte = rte_do_cow(*f_rte); - f_eattrs = NULL; } /* @@ -615,7 +614,7 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS; return val; #define ACCESS_RTE \ - do { if (!f_rte) runtime("No route to access"); else f_cache_eattrs(); } while (0) + do { if (!f_rte) runtime("No route to access"); } while (0) #define ACCESS_EATTRS \ do { if (!f_eattrs) f_cache_eattrs(); } while (0) @@ -1753,6 +1752,7 @@ f_run(struct filter *filter, struct rte **rte, struct linpool *tmp_pool, int fla DBG( "Running filter `%s'...", filter->name ); f_rte = rte; + f_eattrs = NULL; f_old_rta = NULL; f_pool = tmp_pool; f_flags = flags; @@ -1797,6 +1797,7 @@ f_eval_rte(struct f_inst *expr, struct rte **rte, struct linpool *tmp_pool) { f_rte = rte; + f_eattrs = NULL; f_old_rta = NULL; f_pool = tmp_pool; f_flags = 0; @@ -1813,6 +1814,7 @@ struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool) { f_flags = 0; + f_eattrs = NULL; f_rte = NULL; f_pool = tmp_pool;