From: Florin Coras Date: Sat, 27 Sep 2025 00:59:57 +0000 (-0400) Subject: session: add option to not dump segments in cores X-Git-Url: https://gerrit.fd.io/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F81%2F43781%2F3;p=vpp.git session: add option to not dump segments in cores Type: improvement Change-Id: Icdddfe2d610945e329ef86ec1244c3b53f227ace Signed-off-by: Florin Coras --- diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index afe7a5eb3d8..63b6adf1bd7 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -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)) diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index c29e67f9747..d88c1c30c32 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -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 { diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index f7f88cb1401..b18bfcea8f8 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -16,6 +16,7 @@ #include #include #include +#include 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 * diff --git a/src/vnet/session/segment_manager.h b/src/vnet/session/segment_manager.h index 7f73b7964b0..38dabab8248 100644 --- a/src/vnet/session/segment_manager.h +++ b/src/vnet/session/segment_manager.h @@ -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); diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index 211cb8f80bf..031d0a0e49b 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -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 */ diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 59771548938..62f79bc3270 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -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;