session: add option to not dump segments in cores 81/43781/3
authorFlorin Coras <[email protected]>
Sat, 27 Sep 2025 00:59:57 +0000 (20:59 -0400)
committerDamjan Marion <[email protected]>
Tue, 30 Sep 2025 09:44:41 +0000 (09:44 +0000)
Type: improvement

Change-Id: Icdddfe2d610945e329ef86ec1244c3b53f227ace
Signed-off-by: Florin Coras <[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
src/vnet/session/session.c
src/vnet/session/session.h

index afe7a5e..63b6adf 100644 (file)
@@ -837,7 +837,7 @@ application_alloc_and_init (app_init_args_t *a)
       props->add_segment = 1;
     }
   if (opts[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_USE_HUGE_PAGE)
-    props->huge_page = 1;
+    props->use_huge_page = 1;
   if (opts[APP_OPTIONS_RX_FIFO_SIZE])
     props->rx_fifo_size = opts[APP_OPTIONS_RX_FIFO_SIZE];
   if (opts[APP_OPTIONS_TX_FIFO_SIZE])
@@ -867,6 +867,8 @@ application_alloc_and_init (app_init_args_t *a)
 
   if (opts[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_EVT_COLLECTOR)
     app->cb_fns.app_evt_callback = app_evt_collector_get_cb_fn ();
+  if (opts[APP_OPTIONS_FLAGS] & APP_OPTIONS_FLAGS_NO_DUMP_SEGMENTS)
+    props->no_dump_segments = 1;
 
   /* Add app to lookup by api_client_index table */
   if (!application_is_builtin (app))
index c29e67f..d88c1c3 100644 (file)
@@ -216,7 +216,8 @@ typedef enum
   _ (MEMFD_FOR_BUILTIN, "Use memfd for builtin app segs")                     \
   _ (USE_HUGE_PAGE, "Use huge page for FIFO")                                 \
   _ (GET_ORIGINAL_DST, "Get original dst enabled")                            \
-  _ (EVT_COLLECTOR, "App requests event collector")
+  _ (EVT_COLLECTOR, "App requests event collector")                           \
+  _ (NO_DUMP_SEGMENTS, "Do not dump segments in core dumps")
 
 typedef enum _app_options
 {
index f7f88cb..b18bfce 100644 (file)
@@ -16,6 +16,7 @@
 #include <vnet/session/segment_manager.h>
 #include <vnet/session/session.h>
 #include <vnet/session/application.h>
+#include <sys/mman.h>
 
 typedef struct segment_manager_main_
 {
@@ -31,6 +32,7 @@ typedef struct segment_manager_main_
   u32 default_max_fifo_size;   /**< default max fifo size */
   u8 default_high_watermark;   /**< default high watermark % */
   u8 default_low_watermark;    /**< default low watermark % */
+  u8 no_dump_segments;         /**< don't dump segs in core files */
 } segment_manager_main_t;
 
 static segment_manager_main_t sm_main;
@@ -135,7 +137,7 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size,
     vlib_thread_main.n_vlib_mains * sizeof (fifo_segment_slice_t) +
     FIFO_SEGMENT_ALLOC_OVERHEAD;
 
-  if (props->huge_page)
+  if (props->use_huge_page)
     {
       uword hugepage_size = clib_mem_get_default_hugepage_size ();
       segment_size = round_pow2 (segment_size, hugepage_size);
@@ -159,6 +161,12 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size,
       goto done;
     }
 
+  if (props->no_dump_segments || smm->no_dump_segments)
+    {
+      if (madvise (fs->ssvm.sh, fs->ssvm.ssvm_size, MADV_DONTDUMP) != 0)
+       clib_warning ("madvise MADV_DONTDUMP failed for seg %s", seg_name);
+    }
+
   /*
    * Initialize fifo segment
    */
@@ -1014,7 +1022,7 @@ segment_manager_dealloc_queue (segment_manager_t * sm, svm_queue_t * q)
  * Init segment vm address allocator
  */
 void
-segment_manager_main_init (void)
+segment_manager_main_init (u8 no_dump_segments)
 {
   segment_manager_main_t *sm = &sm_main;
 
@@ -1024,6 +1032,7 @@ segment_manager_main_init (void)
   sm->default_max_fifo_size = 4 << 20;
   sm->default_high_watermark = 80;
   sm->default_low_watermark = 50;
+  sm->no_dump_segments = no_dump_segments;
 }
 
 static u8 *
index 7f73b79..38dabab 100644 (file)
@@ -32,7 +32,9 @@ typedef struct _segment_manager_props
   uword add_segment_size;              /**< additional segment size */
   u8 add_segment:1;                    /**< can add new segments flag */
   u8 use_mq_eventfd:1;                 /**< use eventfds for mqs flag */
-  u8 reserved:6;                       /**< reserved flags */
+  u8 use_huge_page : 1;                        /**< use hugepage */
+  u8 no_dump_segments : 1;             /**< don't dump segs in core files */
+  u8 reserved : 4;                     /**< reserved flags */
   u8 n_slices;                         /**< number of fs slices/threads */
   ssvm_segment_type_t segment_type;    /**< seg type: if set to SSVM_N_TYPES,
                                             private segments are used */
@@ -40,7 +42,6 @@ typedef struct _segment_manager_props
   u8 high_watermark;                   /**< memory usage high watermark % */
   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;
 
@@ -189,7 +190,7 @@ void segment_manager_del_sessions_filter (segment_manager_t *sm,
                                          session_state_t *states);
 void segment_manager_format_sessions (segment_manager_t * sm, int verbose);
 
-void segment_manager_main_init (void);
+void segment_manager_main_init (u8 no_dump_segments);
 
 segment_manager_props_t *segment_manager_props_init (segment_manager_props_t *
                                                     sm);
index 211cb8f..031d0a0 100644 (file)
@@ -1921,7 +1921,7 @@ session_manager_main_enable (vlib_main_t *vm,
   session_vpp_wrk_mqs_alloc (smm);
 
   /* Initialize segment manager properties */
-  segment_manager_main_init ();
+  segment_manager_main_init (smm->no_dump_segments);
 
   /* Preallocate sessions */
   if (smm->preallocated_sessions)
@@ -2278,6 +2278,8 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
          smm->original_dst_lookup = vlib_get_plugin_symbol (
            "nat_plugin.so", "nat44_original_dst_lookup");
        }
+      else if (unformat (input, "no-dump-segments"))
+       smm->no_dump_segments = 1;
       /*
        * Deprecated but maintained for compatibility
        */
index 5977154..62f79bc 100644 (file)
@@ -297,10 +297,14 @@ typedef struct session_main_
   /** Preallocate session config parameter */
   u32 preallocated_sessions;
 
-  u16 msg_id_base;
-
   /** Query nat44-ed session to get original dst ip4 & dst port. */
   nat44_original_dst_lookup_fn original_dst_lookup;
+
+  /** Do not dump segments in core file */
+  u8 no_dump_segments;
+
+  u16 msg_id_base;
+
   session_stats_segs_indicies_t stats_seg_idx;
 } session_main_t;