diff options
Diffstat (limited to 'src/vnet/session/segment_manager.c')
-rw-r--r-- | src/vnet/session/segment_manager.c | 134 |
1 files changed, 81 insertions, 53 deletions
diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index bfb44a26053..184d3fd597d 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -93,12 +93,14 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size, { segment_manager_main_t *smm = &sm_main; segment_manager_props_t *props; + app_worker_t *app_wrk; fifo_segment_t *fs; u32 fs_index = ~0; u8 *seg_name; int rv; props = segment_manager_properties_get (sm); + app_wrk = app_worker_get (sm->app_wrk_index); /* Not configured for addition of new segments and not first */ if (!props->add_segment && !segment_size) @@ -127,16 +129,8 @@ segment_manager_add_segment_inline (segment_manager_t *sm, uword segment_size, FIFO_SEGMENT_ALLOC_OVERHEAD; segment_size = round_pow2 (segment_size, clib_mem_get_page_size ()); - if (props->segment_type != SSVM_SEGMENT_PRIVATE) - { - seg_name = format (0, "%d-%d%c", getpid (), smm->seg_name_counter++, 0); - } - else - { - app_worker_t *app_wrk = app_worker_get (sm->app_wrk_index); - application_t *app = application_get (app_wrk->app_index); - seg_name = format (0, "%v segment%c", app->name, 0); - } + seg_name = format (0, "seg-%u-%u-%u%c", app_wrk->app_index, + app_wrk->wrk_index, smm->seg_name_counter++, 0); fs->ssvm.ssvm_size = segment_size; fs->ssvm.name = seg_name; @@ -1002,76 +996,110 @@ segment_manager_main_init (void) sm->default_low_watermark = 50; } +static u8 * +format_segment_manager (u8 *s, va_list *args) +{ + segment_manager_t *sm = va_arg (*args, segment_manager_t *); + int verbose = va_arg (*args, int); + app_worker_t *app_wrk; + uword max_fifo_size; + fifo_segment_t *seg; + application_t *app; + u8 custom_logic; + + app_wrk = app_worker_get_if_valid (sm->app_wrk_index); + app = app_wrk ? application_get (app_wrk->app_index) : 0; + custom_logic = (app && (app->cb_fns.fifo_tuning_callback)) ? 1 : 0; + max_fifo_size = sm->max_fifo_size; + + s = format (s, + "[%u] %v app-wrk: %u segs: %u max-fifo-sz: %U " + "wmarks: %u %u %s flags: 0x%x", + segment_manager_index (sm), app->name, sm->app_wrk_index, + pool_elts (sm->segments), format_memory_size, max_fifo_size, + sm->high_watermark, sm->low_watermark, + custom_logic ? "custom-tuning" : "no-tuning", sm->flags); + + if (!verbose || !pool_elts (sm->segments)) + return s; + + s = format (s, "\n\n"); + + segment_manager_foreach_segment_w_lock ( + seg, sm, ({ s = format (s, " *%U", format_fifo_segment, seg, verbose); })); + + return s; +} + static clib_error_t * segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { + unformat_input_t _line_input, *line_input = &_line_input; segment_manager_main_t *smm = &sm_main; u8 show_segments = 0, verbose = 0; - uword max_fifo_size; segment_manager_t *sm; - fifo_segment_t *seg; - app_worker_t *app_wrk; - application_t *app; - u8 custom_logic; + u32 sm_index = ~0; - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + if (!unformat_user (input, unformat_line_input, line_input)) { - if (unformat (input, "segments")) + vlib_cli_output (vm, "%d segment managers allocated", + pool_elts (smm->segment_managers)); + return 0; + } + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "segments")) show_segments = 1; - else if (unformat (input, "verbose")) + else if (unformat (line_input, "verbose")) verbose = 1; + else if (unformat (line_input, "index %u", &sm_index)) + ; else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + { + vlib_cli_output (vm, "unknown input [%U]", format_unformat_error, + line_input); + goto done; + } } - vlib_cli_output (vm, "%d segment managers allocated", - pool_elts (smm->segment_managers)); - if (verbose && pool_elts (smm->segment_managers)) + + if (!pool_elts (smm->segment_managers)) + goto done; + + if (sm_index != ~0) { - vlib_cli_output (vm, "%-6s%=10s%=10s%=13s%=11s%=11s%=12s", - "Index", "AppIndex", "Segments", "MaxFifoSize", - "HighWater", "LowWater", "FifoTuning"); + sm = segment_manager_get_if_valid (sm_index); + if (!sm) + { + vlib_cli_output (vm, "segment manager %u not allocated", sm_index); + goto done; + } + vlib_cli_output (vm, "%U", format_segment_manager, sm, 1 /* verbose */); + goto done; + } - /* *INDENT-OFF* */ + if (verbose || show_segments) + { pool_foreach (sm, smm->segment_managers) { - app_wrk = app_worker_get_if_valid (sm->app_wrk_index); - app = app_wrk ? application_get (app_wrk->app_index) : 0; - custom_logic = (app && (app->cb_fns.fifo_tuning_callback)) ? 1 : 0; - max_fifo_size = sm->max_fifo_size; - - vlib_cli_output (vm, "%-6d%=10d%=10d%=13U%=11d%=11d%=12s", - segment_manager_index (sm), - sm->app_wrk_index, pool_elts (sm->segments), - format_memory_size, max_fifo_size, - sm->high_watermark, sm->low_watermark, - custom_logic ? "custom" : "none"); + vlib_cli_output (vm, "%U", format_segment_manager, sm, + show_segments); } - /* *INDENT-ON* */ vlib_cli_output (vm, "\n"); } - if (show_segments) - { - vlib_cli_output (vm, "%U", format_fifo_segment, 0, verbose); - /* *INDENT-OFF* */ - pool_foreach (sm, smm->segment_managers) { - segment_manager_foreach_segment_w_lock (seg, sm, ({ - vlib_cli_output (vm, "%U", format_fifo_segment, seg, verbose); - })); - } - /* *INDENT-ON* */ +done: + + unformat_free (line_input); - } return 0; } /* *INDENT-OFF* */ -VLIB_CLI_COMMAND (segment_manager_show_command, static) = -{ +VLIB_CLI_COMMAND (segment_manager_show_command, static) = { .path = "show segment-manager", - .short_help = "show segment-manager [segments][verbose]", + .short_help = "show segment-manager [segments][verbose][index <nn>]", .function = segment_manager_show_fn, }; /* *INDENT-ON* */ |