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/vcl_private.c | |
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/vcl_private.c')
-rw-r--r-- | src/vcl/vcl_private.c | 44 |
1 files changed, 42 insertions, 2 deletions
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 * |