session: fix workers race to allocate lookup table

Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I60600452c91184da571d4630bf2f0d9c24a3e85e
This commit is contained in:
Florin Coras
2024-03-20 16:31:38 -07:00
committed by Dave Barach
parent 2f4586d9b3
commit 5bd96b7733

View File

@ -161,20 +161,27 @@ session_table_alloc_needs_sync (void)
return !vlib_thread_is_main_w_barrier () && (vlib_num_workers () > 1);
}
static_always_inline u8
session_table_is_alloced (u8 fib_proto, u32 fib_index)
{
return (vec_len (fib_index_to_table_index[fib_proto]) > fib_index &&
fib_index_to_table_index[fib_proto][fib_index] != ~0);
}
static session_table_t *
session_table_get_or_alloc (u8 fib_proto, u32 fib_index)
{
session_table_t *st;
u32 table_index;
ASSERT (fib_index != ~0);
if (vec_len (fib_index_to_table_index[fib_proto]) > fib_index &&
fib_index_to_table_index[fib_proto][fib_index] != ~0)
if (session_table_is_alloced (fib_proto, fib_index))
{
table_index = fib_index_to_table_index[fib_proto][fib_index];
return session_table_get (table_index);
}
else
{
u8 needs_sync = session_table_alloc_needs_sync ();
session_lookup_main_t *slm = &sl_main;
@ -188,13 +195,22 @@ session_table_get_or_alloc (u8 fib_proto, u32 fib_index)
clib_spinlock_lock (&slm->st_alloc_lock);
}
/* Another worker just allocated this table */
if (session_table_is_alloced (fib_proto, fib_index))
{
table_index = fib_index_to_table_index[fib_proto][fib_index];
st = session_table_get (table_index);
}
else
{
st = session_table_alloc ();
table_index = session_table_index (st);
vec_validate_init_empty (fib_index_to_table_index[fib_proto], fib_index,
~0);
fib_index_to_table_index[fib_proto][fib_index] = table_index;
st->active_fib_proto = fib_proto;
session_table_init (st, fib_proto);
vec_validate_init_empty (fib_index_to_table_index[fib_proto], fib_index,
~0);
table_index = session_table_index (st);
fib_index_to_table_index[fib_proto][fib_index] = table_index;
}
if (needs_sync)
{
@ -204,7 +220,6 @@ session_table_get_or_alloc (u8 fib_proto, u32 fib_index)
return st;
}
}
static session_table_t *
session_table_get_or_alloc_for_connection (transport_connection_t * tc)