diff options
author | Florin Coras <fcoras@cisco.com> | 2020-12-11 13:58:12 -0800 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2020-12-29 12:11:07 -0800 |
commit | b462418890240b2e38dbf522f9dd0196b79e0fa8 (patch) | |
tree | 3ae26a22edb23da8d40f2c2b54eb96b056bca565 /src/vcl | |
parent | 04943b4c42db300d0d895644f32da79a6d411c51 (diff) |
svm: allow mq attachments at random offsets
Type: feature
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ic373cd2c11272da539eb4b0db27227f36f2f9688
Diffstat (limited to 'src/vcl')
-rw-r--r-- | src/vcl/vcl_bapi.c | 16 | ||||
-rw-r--r-- | src/vcl/vcl_private.c | 44 | ||||
-rw-r--r-- | src/vcl/vcl_private.h | 5 | ||||
-rw-r--r-- | src/vcl/vcl_sapi.c | 15 | ||||
-rw-r--r-- | src/vcl/vppcom.c | 25 |
5 files changed, 77 insertions, 28 deletions
diff --git a/src/vcl/vcl_bapi.c b/src/vcl/vcl_bapi.c index e245c4dc865..a13948d754d 100644 --- a/src/vcl/vcl_bapi.c +++ b/src/vcl/vcl_bapi.c @@ -65,7 +65,6 @@ static void vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) { vcl_worker_t *wrk = vcl_worker_get (0); - svm_msg_q_t *ctrl_mq; u64 segment_handle; int *fds = 0, i, rv; u32 n_fds = 0; @@ -77,9 +76,6 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) goto failed; } - wrk->app_event_queue = uword_to_pointer (mp->app_mq, svm_msg_q_t *); - ctrl_mq = uword_to_pointer (mp->vpp_ctrl_mq, svm_msg_q_t *); - vcm->ctrl_mq = wrk->ctrl_mq = ctrl_mq; segment_handle = clib_net_to_host_u64 (mp->segment_handle); if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) { @@ -100,6 +96,11 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) fds[n_fds++])) goto failed; + vcl_segment_attach_mq (vcl_vpp_worker_segment_handle (0), + mp->vpp_ctrl_mq, mp->vpp_ctrl_mq_thread, + &wrk->ctrl_mq); + vcm->ctrl_mq = wrk->ctrl_mq; + if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT) { segment_name = vl_api_from_api_to_new_c_string (&mp->segment_name); @@ -111,6 +112,8 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp) goto failed; } + vcl_segment_attach_mq (segment_handle, mp->app_mq, 0, + &wrk->app_event_queue); if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { @@ -169,8 +172,6 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * return; wrk->vpp_wrk_index = clib_net_to_host_u32 (mp->wrk_index); - wrk->app_event_queue = uword_to_pointer (mp->app_event_queue_address, - svm_msg_q_t *); wrk->ctrl_mq = vcm->ctrl_mq; segment_handle = clib_net_to_host_u64 (mp->segment_handle); @@ -204,6 +205,9 @@ vl_api_app_worker_add_del_reply_t_handler (vl_api_app_worker_add_del_reply_t * goto failed; } + vcl_segment_attach_mq (segment_handle, mp->app_event_queue_address, 0, + &wrk->app_event_queue); + if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, fds[n_fds]); diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index ea938113615..5b412351c50 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -376,12 +376,14 @@ vcl_segment_detach (u64 segment_handle) int vcl_segment_attach_session (uword segment_handle, uword rxf_offset, - uword txf_offset, u8 is_ct, vcl_session_t *s) + uword txf_offset, uword mq_offset, u8 is_ct, + vcl_session_t *s) { svm_fifo_shared_t *rxsf, *txsf; + u32 fs_index, eqs_index; svm_fifo_t *rxf, *txf; fifo_segment_t *fs; - u32 fs_index; + u64 eqs_handle; fs_index = vcl_segment_table_lookup (segment_handle); if (fs_index == VCL_INVALID_SEGMENT_INDEX) @@ -391,6 +393,13 @@ vcl_segment_attach_session (uword segment_handle, uword rxf_offset, return -1; } + if (mq_offset != (uword) ~0) + { + eqs_handle = vcl_vpp_worker_segment_handle (0); + eqs_index = vcl_segment_table_lookup (eqs_handle); + ASSERT (eqs_index != VCL_INVALID_SEGMENT_INDEX); + } + rxsf = uword_to_pointer (rxf_offset, svm_fifo_shared_t *); txsf = uword_to_pointer (txf_offset, svm_fifo_shared_t *); @@ -400,6 +409,13 @@ vcl_segment_attach_session (uword segment_handle, uword rxf_offset, rxf = fifo_segment_alloc_fifo_w_shared (fs, rxsf); txf = fifo_segment_alloc_fifo_w_shared (fs, txsf); + if (!is_ct && mq_offset != (uword) ~0) + { + fs = fifo_segment_get_segment (&vcm->segment_main, eqs_index); + s->vpp_evt_q = + fifo_segment_msg_q_attach (fs, mq_offset, rxf->shr->slice_index); + } + clib_rwlock_reader_unlock (&vcm->segment_table_lock); if (!is_ct) @@ -420,6 +436,30 @@ vcl_segment_attach_session (uword segment_handle, uword rxf_offset, return 0; } +int +vcl_segment_attach_mq (uword segment_handle, uword mq_offset, u32 mq_index, + svm_msg_q_t **mq) +{ + fifo_segment_t *fs; + u32 fs_index; + + fs_index = vcl_segment_table_lookup (segment_handle); + if (fs_index == VCL_INVALID_SEGMENT_INDEX) + { + VDBG (0, "ERROR: mq segment %lx for is not attached!", segment_handle); + return -1; + } + + clib_rwlock_reader_lock (&vcm->segment_table_lock); + + fs = fifo_segment_get_segment (&vcm->segment_main, fs_index); + *mq = fifo_segment_msg_q_attach (fs, mq_offset, mq_index); + + clib_rwlock_reader_unlock (&vcm->segment_table_lock); + + return 0; +} + /* * fd.io coding-style-patch-verification: ON * diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h index 637581b1b4b..c864375dd31 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -686,7 +686,10 @@ void vcl_segment_detach (u64 segment_handle); void vcl_send_session_unlisten (vcl_worker_t * wrk, vcl_session_t * s); int vcl_segment_attach_session (uword segment_handle, uword rxf_offset, - uword txf_offset, u8 is_ct, vcl_session_t *s); + uword txf_offset, uword mq_offset, u8 is_ct, + vcl_session_t *s); +int vcl_segment_attach_mq (uword segment_handle, uword mq_offset, u32 mq_index, + svm_msg_q_t **mq); /* * VCL Binary API diff --git a/src/vcl/vcl_sapi.c b/src/vcl/vcl_sapi.c index 7651b3531fb..bc44272a5c9 100644 --- a/src/vcl/vcl_sapi.c +++ b/src/vcl/vcl_sapi.c @@ -46,7 +46,6 @@ vcl_api_attach_reply_handler (app_sapi_attach_reply_msg_t * mp, int *fds) { vcl_worker_t *wrk = vcl_worker_get_current (); int i, rv, n_fds_used = 0; - svm_msg_q_t *ctrl_mq; u64 segment_handle; u8 *segment_name; @@ -57,9 +56,6 @@ vcl_api_attach_reply_handler (app_sapi_attach_reply_msg_t * mp, int *fds) } wrk->api_client_handle = mp->api_client_handle; - wrk->app_event_queue = uword_to_pointer (mp->app_mq, svm_msg_q_t *); - ctrl_mq = uword_to_pointer (mp->vpp_ctrl_mq, svm_msg_q_t *); - vcm->ctrl_mq = wrk->ctrl_mq = ctrl_mq; segment_handle = mp->segment_handle; if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) { @@ -75,6 +71,10 @@ vcl_api_attach_reply_handler (app_sapi_attach_reply_msg_t * mp, int *fds) SSVM_SEGMENT_MEMFD, fds[n_fds_used++])) goto failed; + vcl_segment_attach_mq (vcl_vpp_worker_segment_handle (0), mp->vpp_ctrl_mq, + mp->vpp_ctrl_mq_thread, &wrk->ctrl_mq); + vcm->ctrl_mq = wrk->ctrl_mq; + if (mp->fd_flags & SESSION_FD_F_MEMFD_SEGMENT) { segment_name = format (0, "memfd-%ld%c", segment_handle, 0); @@ -85,6 +85,8 @@ vcl_api_attach_reply_handler (app_sapi_attach_reply_msg_t * mp, int *fds) goto failed; } + vcl_segment_attach_mq (segment_handle, mp->app_mq, 0, &wrk->app_event_queue); + if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, @@ -201,8 +203,6 @@ vcl_api_add_del_worker_reply_handler (app_sapi_worker_add_del_reply_msg_t * wrk = vcl_worker_get_current (); wrk->api_client_handle = mp->api_client_handle; wrk->vpp_wrk_index = mp->wrk_index; - wrk->app_event_queue = uword_to_pointer (mp->app_event_queue_address, - svm_msg_q_t *); wrk->ctrl_mq = vcm->ctrl_mq; segment_handle = mp->segment_handle; @@ -231,6 +231,9 @@ vcl_api_add_del_worker_reply_handler (app_sapi_worker_add_del_reply_msg_t * goto failed; } + vcl_segment_attach_mq (segment_handle, mp->app_event_queue_address, 0, + &wrk->app_event_queue); + if (mp->fd_flags & SESSION_FD_F_MQ_EVENTFD) { svm_msg_q_set_consumer_eventfd (wrk->app_event_queue, fds[n_fds]); diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 734d062669e..dbb2cd59a3b 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -374,11 +374,9 @@ vcl_session_accepted_handler (vcl_worker_t * wrk, session_accepted_msg_t * mp, goto error; } - session->vpp_evt_q = - uword_to_pointer (mp->vpp_event_queue_address, svm_msg_q_t *); - if (vcl_segment_attach_session (mp->segment_handle, mp->server_rx_fifo, - mp->server_tx_fifo, 0, session)) + mp->server_tx_fifo, + mp->vpp_event_queue_address, 0, session)) { VDBG (0, "failed to attach fifos for %u", session->session_index); goto error; @@ -412,7 +410,8 @@ vcl_session_accepted_handler (vcl_worker_t * wrk, session_accepted_msg_t * mp, return session->session_index; error: - evt_q = uword_to_pointer (mp->vpp_event_queue_address, svm_msg_q_t *); + vcl_segment_attach_mq (vcl_vpp_worker_segment_handle (0), + mp->vpp_event_queue_address, mp->mq_index, &evt_q); vcl_send_session_accepted_reply (evt_q, mp->context, mp->handle, VNET_API_ERROR_INVALID_ARGUMENT); vcl_session_free (wrk, session); @@ -444,11 +443,10 @@ vcl_session_connected_handler (vcl_worker_t * wrk, } session->vpp_handle = mp->handle; - session->vpp_evt_q = uword_to_pointer (mp->vpp_event_queue_address, - svm_msg_q_t *); if (vcl_segment_attach_session (mp->segment_handle, mp->server_rx_fifo, - mp->server_tx_fifo, 0, session)) + mp->server_tx_fifo, + mp->vpp_event_queue_address, 0, session)) { VDBG (0, "failed to attach fifos for %u", session->session_index); session->session_state = VCL_STATE_DETACHED; @@ -459,7 +457,7 @@ vcl_session_connected_handler (vcl_worker_t * wrk, if (mp->ct_rx_fifo) { if (vcl_segment_attach_session (mp->ct_segment_handle, mp->ct_rx_fifo, - mp->ct_tx_fifo, 1, session)) + mp->ct_tx_fifo, (uword) ~0, 1, session)) { VDBG (0, "failed to attach ct fifos for %u", session->session_index); session->session_state = VCL_STATE_DETACHED; @@ -571,12 +569,11 @@ vcl_session_bound_handler (vcl_worker_t * wrk, session_bound_msg_t * mp) session->transport.lcl_port = mp->lcl_port; vcl_session_table_add_listener (wrk, mp->handle, sid); session->session_state = VCL_STATE_LISTEN; - session->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *); if (vcl_session_is_cl (session)) { if (vcl_segment_attach_session (mp->segment_handle, mp->rx_fifo, - mp->tx_fifo, 0, session)) + mp->tx_fifo, mp->vpp_evt_q, 0, session)) { VDBG (0, "failed to attach fifos for %u", session->session_index); session->session_state = VCL_STATE_DETACHED; @@ -645,7 +642,9 @@ vcl_session_migrated_handler (vcl_worker_t * wrk, void *data) } s->vpp_handle = mp->new_handle; - s->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *); + + vcl_segment_attach_mq (vcl_vpp_worker_segment_handle (0), mp->vpp_evt_q, + mp->vpp_thread_index, &s->vpp_evt_q); vcl_session_table_del_vpp_handle (wrk, mp->handle); vcl_session_table_add_vpp_handle (wrk, mp->new_handle, s->session_index); @@ -856,7 +855,7 @@ vcl_session_worker_update_reply_handler (vcl_worker_t * wrk, void *data) if (s->rx_fifo) { if (vcl_segment_attach_session (msg->segment_handle, msg->rx_fifo, - msg->tx_fifo, 0, s)) + msg->tx_fifo, (uword) ~0, 0, s)) { VDBG (0, "failed to attach fifos for %u", s->session_index); return; |