session: set maximum memory for fifos 82/43382/5
authorAlexander Maltsev <[email protected]>
Sat, 19 Jul 2025 16:50:45 +0000 (21:50 +0500)
committerFlorin Coras <[email protected]>
Tue, 22 Jul 2025 05:14:20 +0000 (05:14 +0000)
Add APP_OPTIONS_MAX_FIFO_MEMORY to set upper limit on how much memory
could be used by fifos. It is rounded upwards to nearest segment size.
If not specified, no limit is set.

Type: feature
Change-Id: I7fb87808973e761b7c40b734b18d55b8a8d8296e
Signed-off-by: Alexander Maltsev <[email protected]>
src/vnet/session/application.c
src/vnet/session/application_interface.h
src/vnet/session/segment_manager.c
src/vnet/session/segment_manager.h

index 1ba4604..2d1b58d 100644 (file)
@@ -855,6 +855,13 @@ application_alloc_and_init (app_init_args_t *a)
     props->low_watermark = opts[APP_OPTIONS_LOW_WATERMARK];
   if (opts[APP_OPTIONS_PCT_FIRST_ALLOC])
     props->pct_first_alloc = opts[APP_OPTIONS_PCT_FIRST_ALLOC];
+  if (opts[APP_OPTIONS_MAX_FIFO_MEMORY])
+    {
+      /* Round upwards to nearest segment_size */
+      props->max_segments =
+       (opts[APP_OPTIONS_MAX_FIFO_MEMORY] + props->segment_size - 1) /
+       props->segment_size;
+    }
   props->segment_type = seg_type;
 
   if (opts[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_EVT_COLLECTOR)
@@ -1825,9 +1832,11 @@ format_application (u8 * s, va_list * args)
   s = format (s, "app-name %v app-index %u ns-index %u seg-size %U\n",
              app_name, app->app_index, app->ns_index,
              format_memory_size, props->add_segment_size);
-  s = format (s, "rx-fifo-size %U tx-fifo-size %U workers:\n",
-             format_memory_size, props->rx_fifo_size,
-             format_memory_size, props->tx_fifo_size);
+  s =
+    format (s, "rx-fifo-size %U tx-fifo-size %U max-fifo-memory %U workers:\n",
+           format_memory_size, props->rx_fifo_size, format_memory_size,
+           props->tx_fifo_size, format_memory_size,
+           props->max_segments * props->segment_size);
 
   pool_foreach (wrk_map, app->worker_maps)  {
       app_wrk = app_worker_get (wrk_map->wrk_index);
index 342d9cf..b1569f0 100644 (file)
@@ -181,7 +181,7 @@ typedef enum
   APP_OPTIONS_EVT_QUEUE_SIZE,
   APP_OPTIONS_SEGMENT_SIZE,
   APP_OPTIONS_ADD_SEGMENT_SIZE,
-  APP_OPTIONS_UNUSED1,
+  APP_OPTIONS_MAX_FIFO_MEMORY,
   APP_OPTIONS_RX_FIFO_SIZE,
   APP_OPTIONS_TX_FIFO_SIZE,
   APP_OPTIONS_PREALLOC_FIFO_PAIRS,
index 341b700..f7f88cb 100644 (file)
@@ -115,6 +115,13 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size,
   if (need_lock)
     clib_rwlock_writer_lock (&sm->segments_rwlock);
 
+  if (props->max_segments && pool_elts (sm->segments) >= props->max_segments)
+    {
+      SESSION_DBG (
+       "max number of segments allocated, can't allocate new segment");
+      goto done;
+    }
+
   pool_get_zero (sm->segments, fs);
 
   /*
index 0fb957a..7f73b79 100644 (file)
@@ -41,6 +41,7 @@ typedef struct _segment_manager_props
   u8 low_watermark;                    /**< memory usage low watermark % */
   u8 pct_first_alloc;                  /**< pct of fifo size to alloc */
   u8 huge_page;                                /**< use hugepage */
+  u32 max_segments; /**< max number of segments, 0 for unlimited */
 } segment_manager_props_t;
 
 #define foreach_seg_manager_flag                                              \