From 94a6df005d9e94f3b836ad3c93d1464b4a840499 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 6 May 2021 15:32:14 -0700 Subject: session: connects seg manager is always first By convention, connects segment manager will be first. Therefore it will be the one with the first segment wherein lies the app's message queue. Saves us the trouble of allocating it on first connect, if app started by listening, and we no longer need to track if it's assignable to a listener or if it can be removed. Type: improvement Signed-off-by: Florin Coras Change-Id: Iba9a8ffaab618eeb41ec2144dcfee62d006dc7a2 --- src/vnet/session/application_worker.c | 74 ++++++----------------------------- 1 file changed, 13 insertions(+), 61 deletions(-) (limited to 'src/vnet/session/application_worker.c') diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index 8c3be22d4dc..7e03171b115 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -32,7 +32,6 @@ app_worker_alloc (application_t * app) app_wrk->app_index = app->app_index; app_wrk->wrk_map_index = ~0; app_wrk->connects_seg_manager = APP_INVALID_SEGMENT_MANAGER_INDEX; - app_wrk->first_segment_manager = APP_INVALID_SEGMENT_MANAGER_INDEX; clib_spinlock_init (&app_wrk->detached_seg_managers_lock); APP_DBG ("New app %v worker %u", app->name, app_wrk->wrk_index); return app_wrk; @@ -143,17 +142,6 @@ app_worker_free (app_worker_t * app_wrk) vec_free (app_wrk->detached_seg_managers); clib_spinlock_free (&app_wrk->detached_seg_managers_lock); - /* If first segment manager is used by a listener that recently - * stopped listening, mark it as detached */ - if (app_wrk->first_segment_manager != app_wrk->connects_seg_manager - && (sm = segment_manager_get_if_valid (app_wrk->first_segment_manager)) - && !segment_manager_app_detached (sm)) - { - sm->first_is_protected = 0; - sm->app_wrk_index = SEGMENT_MANAGER_INVALID_APP_INDEX; - segment_manager_init_free (sm); - } - if (CLIB_DEBUG) clib_memset (app_wrk, 0xfe, sizeof (*app_wrk)); pool_put (app_workers, app_wrk); @@ -172,19 +160,9 @@ app_worker_get_app (u32 wrk_index) static segment_manager_t * app_worker_alloc_segment_manager (app_worker_t * app_wrk) { - segment_manager_t *sm = 0; + segment_manager_t *sm; - /* If the first segment manager is not in use, don't allocate a new one */ - if (app_wrk->first_segment_manager != APP_INVALID_SEGMENT_MANAGER_INDEX - && app_wrk->first_segment_manager_in_use == 0) - { - sm = segment_manager_get (app_wrk->first_segment_manager); - app_wrk->first_segment_manager_in_use = 1; - } - else - { - sm = segment_manager_alloc (); - } + sm = segment_manager_alloc (); sm->app_wrk_index = app_wrk->wrk_index; segment_manager_init (sm); return sm; @@ -309,20 +287,21 @@ app_worker_stop_listen_session (app_worker_t * app_wrk, session_t * ls) /* Try to cleanup segment manager */ sm = segment_manager_get (*sm_indexp); - if (sm && segment_manager_has_fifos (sm)) - { - /* Delete sessions in CREATED state */ - vec_add1 (states, SESSION_STATE_CREATED); - segment_manager_del_sessions_filter (sm, states); - vec_free (states); - } - if (sm && app_wrk->first_segment_manager != *sm_indexp) + if (sm) { segment_manager_app_detach (sm); if (!segment_manager_has_fifos (sm)) - segment_manager_free (sm); + { + /* Empty segment manager, cleanup it up */ + segment_manager_free (sm); + } else { + /* Delete sessions in CREATED state */ + vec_add1 (states, SESSION_STATE_CREATED); + segment_manager_del_sessions_filter (sm, states); + vec_free (states); + /* Track segment manager in case app detaches and all the * outstanding sessions need to be closed */ app_worker_add_detached_sm (app_wrk, *sm_indexp); @@ -534,7 +513,7 @@ app_worker_own_session (app_worker_t * app_wrk, session_t * s) s->rx_fifo = 0; s->tx_fifo = 0; - sm = app_worker_get_or_alloc_connect_segment_manager (app_wrk); + sm = app_worker_get_connect_segment_manager (app_wrk); if (app_worker_alloc_session_fifos (sm, s)) return -1; @@ -555,10 +534,6 @@ app_worker_connect_session (app_worker_t * app_wrk, session_endpoint_t * sep, { int rv; - /* Make sure we have a segment manager for connects */ - if (app_worker_alloc_connects_segment_manager (app_wrk)) - return SESSION_E_ALLOC; - if ((rv = session_open (app_wrk->wrk_index, sep, api_context))) return rv; @@ -574,21 +549,6 @@ app_worker_session_fifo_tuning (app_worker_t * app_wrk, session_t * s, return app->cb_fns.fifo_tuning_callback (s, f, act, len); } -int -app_worker_alloc_connects_segment_manager (app_worker_t * app_wrk) -{ - segment_manager_t *sm; - - if (app_wrk->connects_seg_manager == APP_INVALID_SEGMENT_MANAGER_INDEX) - { - sm = app_worker_alloc_segment_manager (app_wrk); - if (sm == 0) - return -1; - app_wrk->connects_seg_manager = segment_manager_index (sm); - } - return 0; -} - segment_manager_t * app_worker_get_connect_segment_manager (app_worker_t * app) { @@ -596,14 +556,6 @@ app_worker_get_connect_segment_manager (app_worker_t * app) return segment_manager_get (app->connects_seg_manager); } -segment_manager_t * -app_worker_get_or_alloc_connect_segment_manager (app_worker_t * app_wrk) -{ - if (app_wrk->connects_seg_manager == (u32) ~ 0) - app_worker_alloc_connects_segment_manager (app_wrk); - return segment_manager_get (app_wrk->connects_seg_manager); -} - segment_manager_t * app_worker_get_listen_segment_manager (app_worker_t * app, session_t * listener) -- cgit 1.2.3-korg