session: use clib rwlocks instead of custom implementation
Change-Id: I68933d709ce9cc686ba06466e136434b663920ef Signed-off-by: Florin Coras <fcoras@cisco.com>
This commit is contained in:
Florin Coras
committed by
Florin Coras
parent
6484a68215
commit
84a30ef2b5
@ -202,7 +202,7 @@ vl_api_application_attach_reply_t_handler (vl_api_application_attach_reply_t *
|
||||
mp)
|
||||
{
|
||||
uri_udp_test_main_t *utm = &uri_udp_test_main;
|
||||
svm_fifo_segment_create_args_t _a, *a = &_a;
|
||||
svm_fifo_segment_create_args_t _a = { 0 }, *a = &_a;
|
||||
int rv;
|
||||
|
||||
if (mp->retval)
|
||||
|
@ -85,12 +85,12 @@ session_alloc (u32 thread_index)
|
||||
pool_get_aligned_will_expand (smm->sessions[thread_index], will_expand,
|
||||
CLIB_CACHE_LINE_BYTES);
|
||||
/* If we have peekers, let them finish */
|
||||
if (PREDICT_FALSE (will_expand))
|
||||
if (PREDICT_FALSE (will_expand && vlib_num_workers ()))
|
||||
{
|
||||
clib_spinlock_lock_if_init (&smm->peekers_write_locks[thread_index]);
|
||||
clib_rwlock_writer_lock (&smm->peekers_rw_locks[thread_index]);
|
||||
pool_get_aligned (session_manager_main.sessions[thread_index], s,
|
||||
CLIB_CACHE_LINE_BYTES);
|
||||
clib_spinlock_unlock_if_init (&smm->peekers_write_locks[thread_index]);
|
||||
clib_rwlock_writer_unlock (&smm->peekers_rw_locks[thread_index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1133,9 +1133,7 @@ session_manager_main_enable (vlib_main_t * vm)
|
||||
vec_validate (smm->pending_disconnects, num_threads - 1);
|
||||
vec_validate (smm->free_event_vector, num_threads - 1);
|
||||
vec_validate (smm->vpp_event_queues, num_threads - 1);
|
||||
vec_validate (smm->session_peekers, num_threads - 1);
|
||||
vec_validate (smm->peekers_readers_locks, num_threads - 1);
|
||||
vec_validate (smm->peekers_write_locks, num_threads - 1);
|
||||
vec_validate (smm->peekers_rw_locks, num_threads - 1);
|
||||
|
||||
for (i = 0; i < TRANSPORT_N_PROTO; i++)
|
||||
for (j = 0; j < num_threads; j++)
|
||||
@ -1153,10 +1151,7 @@ session_manager_main_enable (vlib_main_t * vm)
|
||||
vec_validate (smm->pending_disconnects[i], 0);
|
||||
_vec_len (smm->pending_disconnects[i]) = 0;
|
||||
if (num_threads > 1)
|
||||
{
|
||||
clib_spinlock_init (&smm->peekers_readers_locks[i]);
|
||||
clib_spinlock_init (&smm->peekers_write_locks[i]);
|
||||
}
|
||||
clib_rwlock_init (&smm->peekers_rw_locks[i]);
|
||||
}
|
||||
|
||||
#if SESSION_DBG
|
||||
|
@ -118,12 +118,8 @@ struct _session_manager_main
|
||||
/** Per worker thread session pools */
|
||||
stream_session_t **sessions;
|
||||
|
||||
/** Per worker-thread count of threads peeking into the session pool */
|
||||
u32 *session_peekers;
|
||||
|
||||
/** Per worker-thread rw peekers locks */
|
||||
clib_spinlock_t *peekers_readers_locks;
|
||||
clib_spinlock_t *peekers_write_locks;
|
||||
/** Per worker-thread session pool peekers rw locks */
|
||||
clib_rwlock_t *peekers_rw_locks;
|
||||
|
||||
/** Pool of listen sessions. Same type as stream sessions to ease lookups */
|
||||
stream_session_t **listen_sessions;
|
||||
@ -316,11 +312,7 @@ session_pool_add_peeker (u32 thread_index)
|
||||
session_manager_main_t *smm = &session_manager_main;
|
||||
if (thread_index == vlib_get_thread_index ())
|
||||
return;
|
||||
clib_spinlock_lock_if_init (&smm->peekers_readers_locks[thread_index]);
|
||||
smm->session_peekers[thread_index] += 1;
|
||||
if (smm->session_peekers[thread_index] == 1)
|
||||
clib_spinlock_lock_if_init (&smm->peekers_write_locks[thread_index]);
|
||||
clib_spinlock_unlock_if_init (&smm->peekers_readers_locks[thread_index]);
|
||||
clib_rwlock_reader_lock (&smm->peekers_rw_locks[thread_index]);
|
||||
}
|
||||
|
||||
always_inline void
|
||||
@ -329,12 +321,7 @@ session_pool_remove_peeker (u32 thread_index)
|
||||
session_manager_main_t *smm = &session_manager_main;
|
||||
if (thread_index == vlib_get_thread_index ())
|
||||
return;
|
||||
ASSERT (session_manager_main.session_peekers[thread_index] > 0);
|
||||
clib_spinlock_lock_if_init (&smm->peekers_readers_locks[thread_index]);
|
||||
smm->session_peekers[thread_index] -= 1;
|
||||
if (smm->session_peekers[thread_index] == 0)
|
||||
clib_spinlock_unlock_if_init (&smm->peekers_write_locks[thread_index]);
|
||||
clib_spinlock_unlock_if_init (&smm->peekers_readers_locks[thread_index]);
|
||||
clib_rwlock_reader_unlock (&smm->peekers_rw_locks[thread_index]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user