]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: fixed eattr cached pointer
authorJan Maria Matejka <mq@ucw.cz>
Tue, 19 Jun 2018 14:16:08 +0000 (16:16 +0200)
committerJan Maria Matejka <mq@ucw.cz>
Tue, 19 Jun 2018 14:51:40 +0000 (16:51 +0200)
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

index 6290e74a8b1255e28d8c42eeecf6d931f2490429..439fd5bfcea504e569af32bd3dfdc50aeed2638b 100644 (file)
@@ -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;