svm vcl: add helper fn that discovers mqs in segment

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I1b083ee793a7cf91b1001bfe88353fa5e6515c42
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c
index 3e9aecb..76cc046 100644
--- a/src/svm/fifo_segment.c
+++ b/src/svm/fifo_segment.c
@@ -301,6 +301,7 @@
   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 @@
   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 268b48b..9d2ab28 100644
--- a/src/svm/fifo_segment.h
+++ b/src/svm/fifo_segment.h
@@ -167,6 +167,15 @@
 					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 03adbd3..7b844f0 100644
--- a/src/svm/fifo_types.h
+++ b/src/svm/fifo_types.h
@@ -150,6 +150,7 @@
   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 */
 };