From 97fef28a0bd700d6ac6d8325e8a4335614d95bec Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 21 Dec 2023 19:41:12 -0800 Subject: session: make app listener pool global One less pointer chase when accepting sessions. Type: improvement Signed-off-by: Florin Coras Change-Id: I20dbb21d15d4a703f76e3b12f04a6f5b5d2a3cd8 --- src/vnet/session/application.c | 61 +++++++++++++++-------------------- src/vnet/session/application.h | 9 +++--- src/vnet/session/application_local.c | 10 ++++-- src/vnet/session/application_worker.c | 4 +-- src/vnet/session/session.c | 8 ++--- src/vnet/session/session_types.h | 7 ++-- 6 files changed, 45 insertions(+), 54 deletions(-) (limited to 'src/vnet/session') diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 5c8efe1c438..2c69138931d 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -31,10 +31,12 @@ static app_main_t app_main; static app_listener_t * app_listener_alloc (application_t * app) { + app_main_t *am = &app_main; app_listener_t *app_listener; - pool_get (app->listeners, app_listener); + + pool_get (am->listeners, app_listener); clib_memset (app_listener, 0, sizeof (*app_listener)); - app_listener->al_index = app_listener - app->listeners; + app_listener->al_index = app_listener - am->listeners; app_listener->app_index = app->app_index; app_listener->session_index = SESSION_INVALID_INDEX; app_listener->local_index = SESSION_INVALID_INDEX; @@ -43,19 +45,23 @@ app_listener_alloc (application_t * app) } app_listener_t * -app_listener_get (application_t * app, u32 app_listener_index) +app_listener_get (u32 app_listener_index) { - return pool_elt_at_index (app->listeners, app_listener_index); + app_main_t *am = &app_main; + + return pool_elt_at_index (am->listeners, app_listener_index); } static void app_listener_free (application_t * app, app_listener_t * app_listener) { + app_main_t *am = &app_main; + clib_bitmap_free (app_listener->workers); vec_free (app_listener->cl_listeners); if (CLIB_DEBUG) clib_memset (app_listener, 0xfa, sizeof (*app_listener)); - pool_put (app->listeners, app_listener); + pool_put (am->listeners, app_listener); } session_handle_t @@ -64,24 +70,14 @@ app_listener_handle (app_listener_t * al) return al->ls_handle; } -app_listener_t * -app_listener_get_w_session (session_t * ls) -{ - application_t *app; - - app = application_get_if_valid (ls->app_index); - if (!app) - return 0; - return app_listener_get (app, ls->al_index); -} - session_handle_t app_listen_session_handle (session_t * ls) { app_listener_t *al; - al = app_listener_get_w_session (ls); - if (!al) + /* TODO(fcoras): quic session handles */ + if (ls->al_index == SESSION_INVALID_INDEX) return listen_session_get_handle (ls); + al = app_listener_get (ls->al_index); return al->ls_handle; } @@ -92,7 +88,7 @@ app_listener_get_w_handle (session_handle_t handle) ls = session_get_from_handle_if_valid (handle); if (!ls) return 0; - return app_listener_get_w_session (ls); + return app_listener_get (ls->al_index); } app_listener_t * @@ -113,7 +109,7 @@ app_listener_lookup (application_t * app, session_endpoint_cfg_t * sep_ext) if (handle != SESSION_INVALID_HANDLE) { ls = listen_session_get_from_handle (handle); - return app_listener_get_w_session (ls); + return app_listener_get (ls->al_index); } } @@ -123,7 +119,7 @@ app_listener_lookup (application_t * app, session_endpoint_cfg_t * sep_ext) if (handle != SESSION_INVALID_HANDLE) { ls = listen_session_get_from_handle (handle); - return app_listener_get_w_session ((session_t *) ls); + return app_listener_get (ls->al_index); } /* @@ -145,7 +141,7 @@ app_listener_lookup (application_t * app, session_endpoint_cfg_t * sep_ext) if (handle != SESSION_INVALID_HANDLE) { ls = listen_session_get_from_handle (handle); - return app_listener_get_w_session ((session_t *) ls); + return app_listener_get (ls->al_index); } } } @@ -182,7 +178,6 @@ app_listener_alloc_and_init (application_t * app, local_st = session_type_from_proto_and_ip (TRANSPORT_PROTO_NONE, sep->is_ip4); ls = listen_session_alloc (0, local_st); - ls->app_index = app->app_index; ls->app_wrk_index = sep->app_wrk_index; lh = session_handle (ls); @@ -195,7 +190,7 @@ app_listener_alloc_and_init (application_t * app, } ls = session_get_from_handle (lh); - app_listener = app_listener_get (app, al_index); + app_listener = app_listener_get (al_index); app_listener->local_index = ls->session_index; app_listener->ls_handle = lh; ls->al_index = al_index; @@ -214,7 +209,6 @@ app_listener_alloc_and_init (application_t * app, * build it's own specific listening connection. */ ls = listen_session_alloc (0, st); - ls->app_index = app->app_index; ls->app_wrk_index = sep->app_wrk_index; /* Listen pool can be reallocated if the transport is @@ -229,7 +223,7 @@ app_listener_alloc_and_init (application_t * app, return rv; } ls = listen_session_get_from_handle (lh); - app_listener = app_listener_get (app, al_index); + app_listener = app_listener_get (al_index); app_listener->session_index = ls->session_index; app_listener->ls_handle = lh; ls->al_index = al_index; @@ -291,8 +285,9 @@ app_listener_cleanup (app_listener_t * al) } static app_worker_t * -app_listener_select_worker (application_t * app, app_listener_t * al) +app_listener_select_worker (app_listener_t *al) { + application_t *app; u32 wrk_index; app = application_get (al->app_index); @@ -1017,12 +1012,10 @@ application_n_workers (application_t * app) app_worker_t * application_listener_select_worker (session_t * ls) { - application_t *app; app_listener_t *al; - app = application_get (ls->app_index); - al = app_listener_get (app, ls->al_index); - return app_listener_select_worker (app, al); + al = app_listener_get (ls->al_index); + return app_listener_select_worker (al); } always_inline u32 @@ -1054,11 +1047,9 @@ session_t * app_listener_select_wrk_cl_session (session_t *ls, session_dgram_hdr_t *hdr) { u32 wrk_map_index = 0; - application_t *app; app_listener_t *al; - app = application_get (ls->app_index); - al = app_listener_get (app, ls->al_index); + al = app_listener_get (ls->al_index); /* Crude test to check if only worker 0 is set */ if (al->workers[0] != 1) { @@ -1548,7 +1539,7 @@ application_change_listener_owner (session_t * s, app_worker_t * app_wrk) if (!app) return SESSION_E_NOAPP; - app_listener = app_listener_get (app, s->al_index); + app_listener = app_listener_get (s->al_index); /* Only remove from lb for now */ app_listener->workers = clib_bitmap_set (app_listener->workers, diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h index 7c63b90ac5a..22896b174be 100644 --- a/src/vnet/session/application.h +++ b/src/vnet/session/application.h @@ -151,9 +151,6 @@ typedef struct application_ u16 proxied_transports; - /** Pool of listeners for the app */ - app_listener_t *listeners; - /** Preferred tls engine */ u8 tls_engine; @@ -200,6 +197,9 @@ typedef struct app_main_ */ application_t *app_pool; + /** Pool of app listeners */ + app_listener_t *listeners; + /** * Hash table of apps by api client index */ @@ -248,7 +248,7 @@ typedef struct _vnet_app_worker_add_del_args #define APP_NS_INVALID_INDEX ((u32)~0) #define APP_INVALID_SEGMENT_MANAGER_INDEX ((u32) ~0) -app_listener_t *app_listener_get (application_t * app, u32 al_index); +app_listener_t *app_listener_get (u32 al_index); int app_listener_alloc_and_init (application_t * app, session_endpoint_cfg_t * sep, app_listener_t ** listener); @@ -281,7 +281,6 @@ session_handle_t app_listen_session_handle (session_t * ls); * @return pointer to app listener or 0 */ app_listener_t *app_listener_get_w_handle (session_handle_t handle); -app_listener_t *app_listener_get_w_session (session_t * ls); session_t *app_listener_get_session (app_listener_t * al); session_t *app_listener_get_local_session (app_listener_t * al); session_t *app_listener_get_wrk_cl_session (app_listener_t *al, u32 wrk_index); diff --git a/src/vnet/session/application_local.c b/src/vnet/session/application_local.c index 8fd3d44efe0..8c6cf8a93fa 100644 --- a/src/vnet/session/application_local.c +++ b/src/vnet/session/application_local.c @@ -995,7 +995,7 @@ ct_session_connect (transport_endpoint_cfg_t * tep) goto global_scope; ll = listen_session_get_from_handle (lh); - al = app_listener_get_w_session (ll); + al = app_listener_get (ll->al_index); /* * Break loop if rule in local table points to connecting app. This @@ -1024,8 +1024,12 @@ global_scope: ll = session_lookup_listener_wildcard (table_index, sep); /* Avoid connecting app to own listener */ - if (ll && ll->app_index != app->app_index) - return ct_connect (app_wrk, ll, sep_ext); + if (ll) + { + al = app_listener_get (ll->al_index); + if (al->app_index != app->app_index) + return ct_connect (app_wrk, ll, sep_ext); + } /* Failed to connect but no error */ return SESSION_E_LOCAL_CONNECT; diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index ea5a4db7fd5..5a7402871b9 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -194,7 +194,7 @@ app_worker_alloc_wrk_cl_session (app_worker_t *app_wrk, session_t *ls) app_listener_t *al; session_t *s; - al = app_listener_get_w_session (ls); + al = app_listener_get (ls->al_index); sm = app_worker_get_listen_segment_manager (app_wrk, ls); lsh = session_handle (ls); @@ -230,7 +230,7 @@ app_worker_free_wrk_cl_session (app_worker_t *app_wrk, session_t *ls) app_listener_t *al; session_t *s; - al = app_listener_get_w_session (ls); + al = app_listener_get (ls->al_index); s = app_listener_get_wrk_cl_session (al, app_wrk->wrk_map_index); segment_manager_dealloc_fifos (s->rx_fifo, s->tx_fifo); diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index 0d2e1b1615e..79681829e50 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -209,7 +209,7 @@ session_alloc (u32 thread_index) clib_memset (s, 0, sizeof (*s)); s->session_index = s - wrk->sessions; s->thread_index = thread_index; - s->app_index = APP_INVALID_INDEX; + s->al_index = APP_INVALID_INDEX; return s; } @@ -318,7 +318,7 @@ session_cleanup_half_open (session_handle_t ho_handle) } /* Migrated transports are no longer half-opens */ transport_cleanup (session_get_transport_proto (ho), - ho->connection_index, ho->app_index /* overloaded */); + ho->connection_index, ho->al_index /* overloaded */); } else if (ho->session_state != SESSION_STATE_TRANSPORT_DELETED) { @@ -410,8 +410,8 @@ session_half_open_migrated_notify (transport_connection_t *tc) return -1; } ho->connection_index = tc->c_index; - /* Overload app index for half-open with new thread */ - ho->app_index = tc->thread_index; + /* Overload al_index for half-open with new thread */ + ho->al_index = tc->thread_index; return 0; } diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index be3f9ffc716..8ec972da832 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -219,17 +219,14 @@ typedef struct session_ /** Index of the transport connection associated to the session */ u32 connection_index; - /** Index of application that owns the listener. Set only if a listener */ - u32 app_index; + /** App listener index in app's listener pool if a listener */ + u32 al_index; union { /** Parent listener session index if the result of an accept */ session_handle_t listener_handle; - /** App listener index in app's listener pool if a listener */ - u32 al_index; - /** Index in app worker's half-open table if a half-open */ u32 ho_index; }; -- cgit 1.2.3-korg