summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-08-30 18:05:00 +0200
committerMaria Matejka <mq@ucw.cz>2022-08-30 18:05:06 +0200
commit34912b029b161cbbed44057dfa913669ccb087eb (patch)
treefac2a2682594b9514434089a1b1a471d67f38eb8
parent95d970d7a0e7bd6cab03f3b8535eed031c43773c (diff)
Tables: Requesting prune only after export cleanup
We can't free the network structures before the export has been cleaned up, therefore it makes more sense to request prune only after export cleanup. This change also reduces prune calls on table shutdown.
-rw-r--r--nest/rt-table.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c
index 3ade4237..8e1e03fb 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1748,10 +1748,6 @@ rte_recalculate(struct rt_import_hook *c, net *net, rte *new, struct rte_src *sr
rte_announce(table, net, new_stored, old_stored,
net->routes, old_best_stored);
- if (!net->routes &&
- (table->gc_counter++ >= table->config->gc_threshold))
- rt_kick_prune_timer(table);
-
#if 0
/* Enable and reimplement these callbacks if anybody wants to use them */
if (old_ok && p->rte_remove)
@@ -2852,6 +2848,7 @@ rt_export_cleanup(rtable *tab)
u64 min_seq = ~((u64) 0);
struct rt_pending_export *last_export_to_free = NULL;
struct rt_pending_export *first = tab->exporter.first;
+ int want_prune = 0;
struct rt_export_hook *eh;
node *n;
@@ -2928,6 +2925,8 @@ rt_export_cleanup(rtable *tab)
/* First is now the next one */
net->first = atomic_load_explicit(&first->next, memory_order_relaxed);
+ want_prune += !net->routes && !net->first;
+
/* For now, the old route may be finally freed */
if (first->old)
{
@@ -3003,6 +3002,9 @@ done:;
rt_unlock_table(tab);
}
+ if ((tab->gc_counter += want_prune) >= tab->config->gc_threshold)
+ rt_kick_prune_timer(tab);
+
if (tab->export_used)
ev_schedule(tab->rt_event);