diff options
author | Florin Coras <fcoras@cisco.com> | 2018-01-24 10:49:23 -0800 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2018-01-27 19:02:12 +0000 |
commit | 84a30ef2b51d0dc60176f4a93c90134bb443a260 (patch) | |
tree | 58e8a07acc454c74f25c39526ce9863b15a6ac5e | |
parent | 6484a682153cf3ec057f0643d73cce688ad0eb41 (diff) |
session: use clib rwlocks instead of custom implementation
Change-Id: I68933d709ce9cc686ba06466e136434b663920ef
Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r-- | src/tests/vnet/session/udp_echo.c | 2 | ||||
-rw-r--r-- | src/vnet/session/session.c | 15 | ||||
-rw-r--r-- | src/vnet/session/session.h | 21 |
3 files changed, 10 insertions, 28 deletions
diff --git a/src/tests/vnet/session/udp_echo.c b/src/tests/vnet/session/udp_echo.c index e92bf4067ea..283895102a2 100644 --- a/src/tests/vnet/session/udp_echo.c +++ b/src/tests/vnet/session/udp_echo.c @@ -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) diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index ec6d7812f0b..ae8c42aa32b 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -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 diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index da9332a2a10..d0bf95c41e4 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -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]); } /** |