From: Florin Coras Date: Wed, 24 Jan 2018 18:49:23 +0000 (-0800) Subject: session: use clib rwlocks instead of custom implementation X-Git-Tag: v18.04-rc1~423 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=84a30ef2b51d0dc60176f4a93c90134bb443a260 session: use clib rwlocks instead of custom implementation Change-Id: I68933d709ce9cc686ba06466e136434b663920ef Signed-off-by: Florin Coras --- 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]); } /**