svm vcl: add helper fn that discovers mqs in segment 61/30961/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 28 Jan 2021 02:08:25 +0000 (18:08 -0800)
committerDave Barach <openvpp@barachs.net>
Thu, 28 Jan 2021 15:57:33 +0000 (15:57 +0000)
Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I1b083ee793a7cf91b1001bfe88353fa5e6515c42

src/svm/fifo_segment.c
src/svm/fifo_segment.h
src/svm/fifo_types.h
src/vcl/vcl_bapi.c
src/vcl/vcl_private.c
src/vcl/vcl_private.h
src/vcl/vcl_sapi.c

index 3e9aecb..76cc046 100644 (file)
@@ -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)
 {
index 268b48b..9d2ab28 100644 (file)
@@ -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
  *
index 03adbd3..7b844f0 100644 (file)
@@ -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 */
 };
index 48695a3..618a46d 100644 (file)
@@ -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
index b9745d2..85fe0a8 100644 (file)
@@ -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
  *
index 7104adc..e4e73e0 100644 (file)
@@ -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
index 1bab7ea..5258722 100644 (file)
@@ -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;