summaryrefslogtreecommitdiffstats
path: root/src/svm
diff options
context:
space:
mode:
Diffstat (limited to 'src/svm')
-rw-r--r--src/svm/fifo_segment.c33
-rw-r--r--src/svm/fifo_segment.h9
-rw-r--r--src/svm/fifo_types.h1
3 files changed, 43 insertions, 0 deletions
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c
index 3e9aecb9dc8..76cc046efec 100644
--- a/src/svm/fifo_segment.c
+++ b/src/svm/fifo_segment.c
@@ -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)
{
diff --git a/src/svm/fifo_segment.h b/src/svm/fifo_segment.h
index 268b48b39f6..9d2ab281034 100644
--- a/src/svm/fifo_segment.h
+++ b/src/svm/fifo_segment.h
@@ -167,6 +167,15 @@ 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
*
* @param fs fifo segment for mq
diff --git a/src/svm/fifo_types.h b/src/svm/fifo_types.h
index 03adbd33c2c..7b844f00bfe 100644
--- a/src/svm/fifo_types.h
+++ b/src/svm/fifo_types.h
@@ -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 */
};