0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-18 09:08:42 +00:00

Corking also feed start to keep BIRD running when refeeds would easily cause congestion

This commit is contained in:
Maria Matejka 2021-11-15 22:48:24 +01:00
parent 0fd1c1d091
commit df476c2e5d
2 changed files with 26 additions and 12 deletions

View File

@ -883,6 +883,7 @@ channel_setup_in_table(struct channel *c, int best)
cat->tab_cf.name = cat->name; cat->tab_cf.name = cat->name;
cat->tab_cf.addr_type = c->net_type; cat->tab_cf.addr_type = c->net_type;
cat->tab_cf.cork_limit = 4 * page_size / sizeof(struct rt_pending_export);
c->in_table = &cat->cat; c->in_table = &cat->cat;
c->in_table->push = (struct rt_import_request) { c->in_table->push = (struct rt_import_request) {
@ -926,6 +927,7 @@ channel_setup_out_table(struct channel *c)
cat->tab_cf.name = cat->name; cat->tab_cf.name = cat->name;
cat->tab_cf.addr_type = c->net_type; cat->tab_cf.addr_type = c->net_type;
cat->tab_cf.cork_limit = 4 * page_size / sizeof(struct rt_pending_export);
c->out_table = &cat->cat; c->out_table = &cat->cat;
c->out_table->push = (struct rt_import_request) { c->out_table->push = (struct rt_import_request) {

View File

@ -1099,8 +1099,13 @@ rte_announce(rtable_private *tab, net *net, struct rte_storage *new, struct rte_
if (tab->first_export == NULL) if (tab->first_export == NULL)
tab->first_export = rpe; tab->first_export = rpe;
if ((tab->first_export->seq + tab->config->cork_limit <= tab->next_export_seq) && !tab->cork_active) if (!EMPTY_LIST(tab->exports) &&
(tab->first_export->seq + tab->config->cork_limit <= tab->next_export_seq) &&
!tab->cork_active)
{ {
if (config->table_debug)
log(L_TRACE "%s: cork activated", tab->name);
ev_cork(&rt_cork); ev_cork(&rt_cork);
tab->cork_active = 1; tab->cork_active = 1;
} }
@ -1777,22 +1782,14 @@ rt_request_export(rtable *t, struct rt_export_request *req)
rt_set_export_state(hook, TES_HUNGRY); rt_set_export_state(hook, TES_HUNGRY);
struct rt_pending_export *rpe = rt_last_export(tab);
DBG("store hook=%p last_export=%p seq=%lu\n", hook, rpe, rpe ? rpe->seq : 0);
atomic_store_explicit(&hook->last_export, rpe, memory_order_relaxed);
hook->n = (node) {}; hook->n = (node) {};
add_tail(&tab->exports, &hook->n); add_tail(&tab->exports, &hook->n);
FIB_ITERATE_INIT(&hook->feed_fit, &tab->fib);
DBG("New export hook %p req %p in table %s uc=%u\n", hook, req, tab->name, tab->use_count); DBG("New export hook %p req %p in table %s uc=%u\n", hook, req, tab->name, tab->use_count);
hook->event = ev_new_init(p, rt_feed_channel, hook); hook->event = ev_new_init(p, rt_feed_channel, hook);
RT_UNLOCK(t); RT_UNLOCK(t);
rt_set_export_state(hook, TES_FEEDING);
ASSERT_DIE(hook->export_state == TES_FEEDING);
rt_send_export_event(hook); rt_send_export_event(hook);
} }
@ -2506,6 +2503,8 @@ done:;
{ {
tab->cork_active = 0; tab->cork_active = 0;
ev_uncork(&rt_cork); ev_uncork(&rt_cork);
if (config->table_debug)
log(L_TRACE "%s: cork released", tab->name);
} }
} }
@ -2955,10 +2954,23 @@ rt_feed_channel(void *data)
struct fib_iterator *fit = &c->feed_fit; struct fib_iterator *fit = &c->feed_fit;
int max_feed = 256; int max_feed = 256;
RT_LOCK(c->table); rtable_private *tab;
rtable_private *tab = RT_PRIV(c->table); if (c->export_state == TES_HUNGRY)
{
rt_set_export_state(c, TES_FEEDING);
ASSERT(atomic_load_explicit(&c->export_state, memory_order_relaxed) == TES_FEEDING); tab = RT_LOCK(c->table);
struct rt_pending_export *rpe = rt_last_export(tab);
DBG("store hook=%p last_export=%p seq=%lu\n", c, rpe, rpe ? rpe->seq : 0);
atomic_store_explicit(&c->last_export, rpe, memory_order_relaxed);
FIB_ITERATE_INIT(&c->feed_fit, &tab->fib);
}
else
tab = RT_LOCK(c->table);
ASSERT_DIE(c->export_state == TES_FEEDING);
redo: redo:
FIB_ITERATE_START(&tab->fib, fit, net, n) FIB_ITERATE_START(&tab->fib, fit, net, n)