svm: minimal initial fifo 35/24735/13
authorFlorin Coras <fcoras@cisco.com>
Sun, 2 Feb 2020 19:30:39 +0000 (19:30 +0000)
committerDave Barach <openvpp@barachs.net>
Tue, 25 Feb 2020 19:18:49 +0000 (19:18 +0000)
Type: refactor

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

src/plugins/hs_apps/echo_client.c
src/plugins/hs_apps/echo_server.c
src/plugins/unittest/svm_fifo_test.c
src/svm/fifo_segment.c
src/svm/fifo_types.h
src/svm/svm_fifo.c
src/vnet/session/application.c
src/vnet/session/application_interface.h
src/vnet/session/segment_manager.c
src/vnet/session/segment_manager.h
src/vnet/session/session.api

index 35cd608..551e46b 100644 (file)
@@ -635,7 +635,7 @@ echo_clients_attach (u8 * appns_id, u64 appns_flags, u64 appns_secret)
   u32 prealloc_fifos, segment_size = 256 << 20;
   echo_client_main_t *ecm = &echo_client_main;
   vnet_app_attach_args_t _a, *a = &_a;
-  u64 options[16];
+  u64 options[17];
   int rv;
 
   clib_memset (a, 0, sizeof (*a));
@@ -661,6 +661,7 @@ echo_clients_attach (u8 * appns_id, u64 appns_flags, u64 appns_secret)
   options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] = prealloc_fifos;
   options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_IS_BUILTIN;
   options[APP_OPTIONS_TLS_ENGINE] = ecm->tls_engine;
+  options[APP_OPTIONS_PCT_FIRST_ALLOC] = 100;
   if (appns_id)
     {
       options[APP_OPTIONS_FLAGS] |= appns_flags;
index 0da7bc0..362d278 100644 (file)
@@ -351,6 +351,7 @@ echo_server_attach (u8 * appns_id, u64 appns_flags, u64 appns_secret)
   a->options[APP_OPTIONS_TX_FIFO_SIZE] = esm->fifo_size;
   a->options[APP_OPTIONS_PRIVATE_SEGMENT_COUNT] = esm->private_segment_count;
   a->options[APP_OPTIONS_TLS_ENGINE] = esm->tls_engine;
+  a->options[APP_OPTIONS_PCT_FIRST_ALLOC] = 100;
   a->options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] =
     esm->prealloc_fifos ? esm->prealloc_fifos : 1;
 
index 8579cec..16fcf88 100644 (file)
@@ -2086,6 +2086,7 @@ sfifo_test_fifo_segment_fifo_grow (int verbose)
    * Alloc fifo
    */
   fs = fifo_segment_get_segment (sm, a->new_segment_indices[0]);
+  fs->h->pct_first_alloc = 100;
   f = fifo_segment_alloc_fifo (fs, fifo_size, FIFO_SEGMENT_RX_FIFO);
 
   SFIFO_TEST (f != 0, "svm_fifo_segment_alloc_fifo");
@@ -2464,6 +2465,7 @@ sfifo_test_fifo_segment_prealloc (int verbose)
   rv = fifo_segment_create (sm, a);
   SFIFO_TEST (!rv, "svm_fifo_segment_create returned %d", rv);
   fs = fifo_segment_get_segment (sm, a->new_segment_indices[0]);
+  fs->h->pct_first_alloc = 100;
 
   /*
    * Prealloc chunks and headers
index 88600b8..7b1163e 100644 (file)
@@ -294,8 +294,7 @@ fs_chunk_size_is_valid (fifo_segment_header_t * fsh, u32 size)
 }
 
 static svm_fifo_t *
-fs_try_alloc_fifo_freelist (fifo_segment_slice_t * fss,
-                           u32 fl_index, u32 data_bytes)
+fs_try_alloc_fifo_freelist (fifo_segment_slice_t * fss, u32 fl_index)
 {
   svm_fifo_chunk_t *c;
   svm_fifo_t *f;
@@ -471,14 +470,16 @@ fs_try_alloc_fifo (fifo_segment_header_t * fsh, fifo_segment_slice_t * fss,
   u32 fifo_sz, fl_index;
   svm_fifo_t *f = 0;
   uword n_free_bytes;
+  u32 min_size;
 
-  fl_index = fs_freelist_for_size (data_bytes);
+  min_size = clib_max ((fsh->pct_first_alloc * data_bytes) / 100, 4096);
+  fl_index = fs_freelist_for_size (min_size);
   fifo_sz = sizeof (svm_fifo_t) + sizeof (svm_fifo_chunk_t);
-  fifo_sz += 1 << max_log2 (data_bytes);
+  fifo_sz += 1 << max_log2 (min_size);
 
   if (fss->free_fifos && fss->free_chunks[fl_index])
     {
-      f = fs_try_alloc_fifo_freelist (fss, fl_index, data_bytes);
+      f = fs_try_alloc_fifo_freelist (fss, fl_index);
       if (f)
        {
          fsh_cached_bytes_sub (fsh, fs_freelist_index_to_size (fl_index));
@@ -494,7 +495,7 @@ fs_try_alloc_fifo (fifo_segment_header_t * fsh, fifo_segment_slice_t * fss,
                                   FIFO_SEGMENT_ALLOC_BATCH_SIZE))
        goto done;
 
-      f = fs_try_alloc_fifo_freelist (fss, fl_index, data_bytes);
+      f = fs_try_alloc_fifo_freelist (fss, fl_index);
       if (f)
        fsh_cached_bytes_sub (fsh, fs_freelist_index_to_size (fl_index));
       goto done;
@@ -502,7 +503,7 @@ fs_try_alloc_fifo (fifo_segment_header_t * fsh, fifo_segment_slice_t * fss,
   if (fifo_sz <= n_free_bytes)
     {
       void *oldheap = ssvm_push_heap (fsh->ssvm_sh);
-      f = svm_fifo_alloc (data_bytes);
+      f = svm_fifo_alloc (min_size);
       ssvm_pop_heap (oldheap);
       if (f)
        {
index f0a286d..a80130b 100644 (file)
@@ -120,6 +120,7 @@ struct fifo_segment_header_
   u8 n_slices;                         /**< Number of slices */
   u8 high_watermark;                   /**< Memory pressure watermark high */
   u8 low_watermark;                    /**< Memory pressure watermark low */
+  u8 pct_first_alloc;                  /**< Pct of fifo size to alloc */
 };
 
 #endif /* SRC_SVM_FIFO_TYPES_H_ */
index 0168c08..971eda3 100644 (file)
@@ -368,7 +368,7 @@ void
 svm_fifo_init (svm_fifo_t * f, u32 size)
 {
   svm_fifo_chunk_t *c, *prev;
-  u32 first_chunk, min_alloc;
+  u32 min_alloc;
 
   f->size = size;
   f->ooos_list_head = OOO_SEGMENT_INVALID_INDEX;
@@ -378,9 +378,8 @@ svm_fifo_init (svm_fifo_t * f, u32 size)
   f->head_chunk = f->tail_chunk = f->start_chunk;
   f->ooo_deq = f->ooo_enq = 0;
 
-  first_chunk = f->start_chunk->length;
-  min_alloc = first_chunk > 16 << 10 ? first_chunk >> 2 : 4096;
-  min_alloc = clib_min (first_chunk, 64 << 10);
+  min_alloc = size > 32 << 10 ? size >> 3 : 4096;
+  min_alloc = clib_min (min_alloc, 64 << 10);
   f->min_alloc = min_alloc;
 
   /*
index 7777c72..7923d2d 100644 (file)
@@ -556,6 +556,8 @@ application_alloc_and_init (app_init_args_t * a)
     props->high_watermark = options[APP_OPTIONS_HIGH_WATERMARK];
   if (options[APP_OPTIONS_LOW_WATERMARK])
     props->low_watermark = options[APP_OPTIONS_LOW_WATERMARK];
+  if (options[APP_OPTIONS_PCT_FIRST_ALLOC])
+    props->pct_first_alloc = options[APP_OPTIONS_PCT_FIRST_ALLOC];
   props->segment_type = seg_type;
 
   /* Add app to lookup by api_client_index table */
index 2ecabb0..bf94676 100644 (file)
@@ -208,6 +208,7 @@ typedef enum
   APP_OPTIONS_MAX_FIFO_SIZE,
   APP_OPTIONS_HIGH_WATERMARK,
   APP_OPTIONS_LOW_WATERMARK,
+  APP_OPTIONS_PCT_FIRST_ALLOC,
   APP_OPTIONS_N_OPTIONS
 } app_attach_options_index_t;
 
index eb3f63c..db38097 100644 (file)
@@ -171,6 +171,7 @@ segment_manager_add_segment (segment_manager_t * sm, uword segment_size)
    */
   fs->h->high_watermark = sm->high_watermark;
   fs->h->low_watermark = sm->low_watermark;
+  fs->h->pct_first_alloc = props->pct_first_alloc;
   fs->h->flags &= ~FIFO_SEGMENT_F_MEM_LIMIT;
 
 done:
index 688711a..cd02d54 100644 (file)
@@ -38,6 +38,7 @@ typedef struct _segment_manager_props
   u32 max_fifo_size;                   /**< max fifo size */
   u8 high_watermark;                   /**< memory usage high watermark % */
   u8 low_watermark;                    /**< memory usage low watermark % */
+  u8 pct_first_alloc;                  /**< pct of fifo size to alloc */
 } segment_manager_props_t;
 
 typedef struct _segment_manager
index 4f9ae12..8cfac3d 100644 (file)
@@ -29,7 +29,7 @@ option version = "1.7.0";
     u32 client_index;
     u32 context;
     u32 initial_segment_size;
-    u64 options[16];
+    u64 options[17];
     u8 namespace_id_len;
     u8 namespace_id [64];
  };
@@ -72,7 +72,7 @@ define application_attach_reply {
  define app_attach {
     u32 client_index;
     u32 context;
-    u64 options[16];
+    u64 options[17];
     u8 namespace_id_len;
     u8 namespace_id[64];
  };