Overall tcp performance improvements (VPP-846)
[vpp.git] / src / vnet / session / application.c
index 5a45537..4bdb102 100644 (file)
@@ -87,14 +87,17 @@ application_new ()
 void
 application_del (application_t * app)
 {
-  api_main_t *am = &api_main;
-  void *oldheap;
   segment_manager_t *sm;
   u64 handle;
   u32 index, *handles = 0;
   int i;
   vnet_unbind_args_t _a, *a = &_a;
 
+  /*
+   * The app event queue allocated in first segment is cleared with
+   * the segment manager. No need to explicitly free it.
+   */
+
   /*
    * Cleanup segment managers
    */
@@ -114,20 +117,12 @@ application_del (application_t * app)
   /* Actual listener cleanup */
   for (i = 0; i < vec_len (handles); i++)
     {
-      a->app_index = app->api_client_index;
+      a->app_index = app->index;
       a->handle = handles[i];
       /* seg manager is removed when unbind completes */
       vnet_unbind (a);
     }
 
-  /*
-   * Free the event fifo in the /vpe-api shared-memory segment
-   */
-  oldheap = svm_push_data_heap (am->vlib_rp);
-  if (app->event_queue)
-    unix_shared_memory_queue_free (app->event_queue);
-  svm_pop_heap (oldheap);
-
   application_table_del (app);
   pool_put (app_pool, app);
 }
@@ -149,30 +144,14 @@ int
 application_init (application_t * app, u32 api_client_index, u64 * options,
                  session_cb_vft_t * cb_fns)
 {
-  api_main_t *am = &api_main;
   segment_manager_t *sm;
   segment_manager_properties_t *props;
-  void *oldheap;
-  u32 app_evt_queue_size;
+  u32 app_evt_queue_size, first_seg_size;
   int rv;
 
   app_evt_queue_size = options[APP_EVT_QUEUE_SIZE] > 0 ?
     options[APP_EVT_QUEUE_SIZE] : default_app_evt_queue_size;
 
-  /* Allocate event fifo in the /vpe-api shared-memory segment */
-  oldheap = svm_push_data_heap (am->vlib_rp);
-
-  /* Allocate server event queue */
-  app->event_queue =
-    unix_shared_memory_queue_init (app_evt_queue_size,
-                                  sizeof (session_fifo_event_t),
-                                  0 /* consumer pid */ ,
-                                  0
-                                  /* (do not) signal when queue non-empty */
-    );
-
-  svm_pop_heap (oldheap);
-
   /* Setup segment manager */
   sm = segment_manager_new ();
   sm->app_index = app->index;
@@ -181,16 +160,22 @@ application_init (application_t * app, u32 api_client_index, u64 * options,
   props->rx_fifo_size = options[SESSION_OPTIONS_RX_FIFO_SIZE];
   props->tx_fifo_size = options[SESSION_OPTIONS_TX_FIFO_SIZE];
   props->add_segment = props->add_segment_size != 0;
+  props->preallocated_fifo_pairs = options[APP_OPTIONS_PREALLOC_FIFO_PAIRS];
+  props->use_private_segment = options[APP_OPTIONS_FLAGS]
+    & APP_OPTIONS_FLAGS_BUILTIN_APP;
 
-  if ((rv = segment_manager_init (sm, props,
-                                 options[SESSION_OPTIONS_SEGMENT_SIZE])))
+  first_seg_size = options[SESSION_OPTIONS_SEGMENT_SIZE];
+  if ((rv = segment_manager_init (sm, props, first_seg_size)))
     return rv;
 
   app->first_segment_manager = segment_manager_index (sm);
   app->api_client_index = api_client_index;
-  app->flags = options[SESSION_OPTIONS_FLAGS];
+  app->flags = options[APP_OPTIONS_FLAGS];
   app->cb_fns = *cb_fns;
 
+  /* Allocate app event queue in the first shared-memory segment */
+  app->event_queue = segment_manager_alloc_queue (sm, app_evt_queue_size);
+
   /* Check that the obvious things are properly set up */
   application_verify_cb_fns (cb_fns);
 
@@ -411,7 +396,7 @@ application_format_connects (application_t * app, int verbose)
   vlib_main_t *vm = vlib_get_main ();
   segment_manager_t *sm;
   u8 *app_name, *s = 0;
-  int i, j;
+  int j;
 
   /* Header */
   if (app == 0)
@@ -435,24 +420,18 @@ application_format_connects (application_t * app, int verbose)
   for (j = 0; j < vec_len (sm->segment_indices); j++)
     {
       svm_fifo_segment_private_t *fifo_segment;
-      svm_fifo_t **fifos;
+      svm_fifo_t *fifo;
       u8 *str;
 
       fifo_segment = svm_fifo_get_segment (sm->segment_indices[j]);
-      fifos = svm_fifo_segment_get_fifos (fifo_segment);
-      for (i = 0; i < vec_len (fifos); i++)
+      fifo = svm_fifo_segment_get_fifo_list (fifo_segment);
+      while (fifo)
        {
-         svm_fifo_t *fifo;
          u32 session_index, thread_index;
          stream_session_t *session;
 
-         /* There are 2 fifos/session. Avoid printing twice. */
-         if (i % 2)
-           continue;
-
-         fifo = fifos[i];
-         session_index = fifo->server_session_index;
-         thread_index = fifo->server_thread_index;
+         session_index = fifo->master_session_index;
+         thread_index = fifo->master_thread_index;
 
          session = stream_session_get (session_index, thread_index);
          str = format (0, "%U", format_stream_session, session, verbose);
@@ -464,9 +443,10 @@ application_format_connects (application_t * app, int verbose)
            s = format (s, "%-40s%-20s", str, app_name);
 
          vlib_cli_output (vm, "%v", s);
-
          vec_reset_length (s);
          vec_free (str);
+
+         fifo = fifo->next;
        }
       vec_free (s);
     }