svm vcl: add helper fn that discovers mqs in segment
Type: improvement Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I1b083ee793a7cf91b1001bfe88353fa5e6515c42
This commit is contained in:

committed by
Dave Barach

parent
b13ba133fb
commit
80b742592b
@ -301,6 +301,7 @@ fifo_segment_init (fifo_segment_t * fs)
|
||||
fsh->max_log2_fifo_size = min_log2 (max_fifo);
|
||||
fsh->n_cached_bytes = 0;
|
||||
fsh->n_reserved_bytes = fsh->byte_index;
|
||||
fsh->start_byte_index = fsh->byte_index;
|
||||
ASSERT (fsh->max_byte_index <= sh->ssvm_size - offset);
|
||||
|
||||
fs->max_byte_index = fsh->max_byte_index;
|
||||
@ -1054,6 +1055,38 @@ fifo_segment_msg_q_attach (fifo_segment_t *fs, uword offset, u32 mq_index)
|
||||
return mq;
|
||||
}
|
||||
|
||||
void
|
||||
fifo_segment_msg_qs_discover (fifo_segment_t *fs, int *fds, u32 n_fds)
|
||||
{
|
||||
svm_msg_q_shared_t *smq;
|
||||
u32 n_mqs, size, i;
|
||||
uword offset = 0, n_alloced;
|
||||
svm_msg_q_t *mq;
|
||||
|
||||
n_mqs = fs->h->n_mqs;
|
||||
if (n_fds && n_mqs != n_fds)
|
||||
{
|
||||
clib_warning ("expected %u fds got %u", n_mqs, n_fds);
|
||||
return;
|
||||
}
|
||||
|
||||
vec_validate (fs->mqs, n_mqs - 1);
|
||||
n_alloced = fs->h->n_reserved_bytes - fs->h->start_byte_index;
|
||||
ASSERT (n_alloced % n_mqs == 0);
|
||||
size = n_alloced / n_mqs;
|
||||
|
||||
offset = fs->h->start_byte_index;
|
||||
for (i = 0; i < n_mqs; i++)
|
||||
{
|
||||
mq = vec_elt_at_index (fs->mqs, i);
|
||||
smq = (svm_msg_q_shared_t *) ((u8 *) fs->h + offset);
|
||||
svm_msg_q_attach (mq, smq);
|
||||
if (n_fds)
|
||||
svm_msg_q_set_eventfd (mq, fds[i]);
|
||||
offset += size;
|
||||
}
|
||||
}
|
||||
|
||||
uword
|
||||
fifo_segment_msg_q_offset (fifo_segment_t *fs, u32 mq_index)
|
||||
{
|
||||
|
@ -166,6 +166,15 @@ svm_msg_q_t *fifo_segment_msg_q_alloc (fifo_segment_t *fs, u32 mq_index,
|
||||
svm_msg_q_t *fifo_segment_msg_q_attach (fifo_segment_t *fs, uword offset,
|
||||
u32 mq_index);
|
||||
|
||||
/**
|
||||
* Discover mqs on mq only segment
|
||||
*
|
||||
* @param fs fifo segment for mq
|
||||
* @param fds array of fds is mqs use eventfds
|
||||
* @param n_fds number of fds
|
||||
*/
|
||||
void fifo_segment_msg_qs_discover (fifo_segment_t *fs, int *fds, u32 n_fds);
|
||||
|
||||
/**
|
||||
* Message queue offset on segment
|
||||
*
|
||||
|
@ -150,6 +150,7 @@ struct fifo_segment_header_
|
||||
CLIB_CACHE_LINE_ALIGN_MARK (allocator);
|
||||
uword byte_index;
|
||||
uword max_byte_index;
|
||||
uword start_byte_index;
|
||||
CLIB_CACHE_LINE_ALIGN_MARK (slice);
|
||||
fifo_segment_slice_t slices[0]; /** Fixed array of slices */
|
||||
};
|
||||
|
@ -100,11 +100,6 @@ 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);
|
||||
@ -126,6 +121,13 @@ vl_api_app_attach_reply_t_handler (vl_api_app_attach_reply_t * mp)
|
||||
n_fds++;
|
||||
}
|
||||
|
||||
vcl_segment_discover_mqs (vcl_vpp_worker_segment_handle (0), fds + n_fds,
|
||||
mp->n_fds - n_fds);
|
||||
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;
|
||||
|
||||
vec_free (fds);
|
||||
}
|
||||
else
|
||||
|
@ -456,6 +456,29 @@ vcl_segment_attach_mq (uword segment_handle, uword mq_offset, u32 mq_index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
vcl_segment_discover_mqs (uword segment_handle, int *fds, u32 n_fds)
|
||||
{
|
||||
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);
|
||||
fifo_segment_msg_qs_discover (fs, fds, n_fds);
|
||||
|
||||
clib_rwlock_reader_unlock (&vcm->segment_table_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fd.io coding-style-patch-verification: ON
|
||||
*
|
||||
|
@ -699,6 +699,7 @@ int vcl_segment_attach_session (uword segment_handle, uword rxf_offset,
|
||||
vcl_session_t *s);
|
||||
int vcl_segment_attach_mq (uword segment_handle, uword mq_offset, u32 mq_index,
|
||||
svm_msg_q_t **mq);
|
||||
int vcl_segment_discover_mqs (uword segment_handle, int *fds, u32 n_fds);
|
||||
|
||||
/*
|
||||
* VCL Binary API
|
||||
|
@ -71,10 +71,6 @@ 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);
|
||||
@ -93,6 +89,12 @@ vcl_api_attach_reply_handler (app_sapi_attach_reply_msg_t * mp, int *fds)
|
||||
vcl_mq_epoll_add_evfd (wrk, wrk->app_event_queue);
|
||||
}
|
||||
|
||||
vcl_segment_discover_mqs (vcl_vpp_worker_segment_handle (0),
|
||||
fds + n_fds_used, mp->n_fds - n_fds_used);
|
||||
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;
|
||||
|
||||
vcm->app_index = mp->app_index;
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user