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:

committed by
Dave Barach

parent
2f4586d9b3
commit
5bd96b7733
@ -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)
|
||||
|
Reference in New Issue
Block a user