session: improve sh segment-manager cli

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I5d669fcba609bcdb35103f57c45e0a270213d84a
This commit is contained in:
Florin Coras
2021-12-16 10:09:17 -08:00
committed by Damjan Marion
parent 4ab6ad136b
commit a0024a66fe
2 changed files with 90 additions and 70 deletions

View File

@ -1536,22 +1536,15 @@ format_fifo_segment (u8 * s, va_list * args)
f64 usage; f64 usage;
fifo_segment_mem_status_t mem_st; fifo_segment_mem_status_t mem_st;
indent = format_get_indent (s) + 2; indent = format_get_indent (s);
if (fs == 0)
{
s = format (s, "%-20s%10s%15s%15s%15s%15s", "Name", "Type",
"HeapSize (M)", "ActiveFifos", "FreeFifos", "Address");
return s;
}
fifo_segment_info (fs, &address, &size); fifo_segment_info (fs, &address, &size);
active_fifos = fifo_segment_num_fifos (fs); active_fifos = fifo_segment_num_fifos (fs);
free_fifos = fifo_segment_num_free_fifos (fs); free_fifos = fifo_segment_num_free_fifos (fs);
s = format (s, "%-20v%10U%15llu%15u%15u%15llx", ssvm_name (&fs->ssvm), s = format (s, "%U%v type: %U size: %U active fifos: %u", format_white_space,
format_fifo_segment_type, fs, size >> 20ULL, active_fifos, 2, ssvm_name (&fs->ssvm), format_fifo_segment_type, fs,
free_fifos, address); format_memory_size, size, active_fifos);
if (!verbose) if (!verbose)
return s; return s;
@ -1560,9 +1553,8 @@ format_fifo_segment (u8 * s, va_list * args)
free_chunks = fifo_segment_num_free_chunks (fs, ~0); free_chunks = fifo_segment_num_free_chunks (fs, ~0);
if (free_chunks) if (free_chunks)
s = s = format (s, "\n\n%UFree/Allocated chunks by size:\n",
format (s, "\n\n%UFree/Allocated chunks by size:\n", format_white_space, format_white_space, indent + 2);
indent + 2);
else else
s = format (s, "\n"); s = format (s, "\n");

View File

@ -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_main_t *smm = &sm_main;
segment_manager_props_t *props; segment_manager_props_t *props;
app_worker_t *app_wrk;
fifo_segment_t *fs; fifo_segment_t *fs;
u32 fs_index = ~0; u32 fs_index = ~0;
u8 *seg_name; u8 *seg_name;
int rv; int rv;
props = segment_manager_properties_get (sm); 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 */ /* Not configured for addition of new segments and not first */
if (!props->add_segment && !segment_size) 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; FIFO_SEGMENT_ALLOC_OVERHEAD;
segment_size = round_pow2 (segment_size, clib_mem_get_page_size ()); segment_size = round_pow2 (segment_size, clib_mem_get_page_size ());
if (props->segment_type != SSVM_SEGMENT_PRIVATE) seg_name = format (0, "seg-%u-%u-%u%c", app_wrk->app_index,
{ app_wrk->wrk_index, smm->seg_name_counter++, 0);
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);
}
fs->ssvm.ssvm_size = segment_size; fs->ssvm.ssvm_size = segment_size;
fs->ssvm.name = seg_name; fs->ssvm.name = seg_name;
@ -1002,76 +996,110 @@ segment_manager_main_init (void)
sm->default_low_watermark = 50; 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 * static clib_error_t *
segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input, segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd) vlib_cli_command_t * cmd)
{ {
unformat_input_t _line_input, *line_input = &_line_input;
segment_manager_main_t *smm = &sm_main; segment_manager_main_t *smm = &sm_main;
u8 show_segments = 0, verbose = 0; u8 show_segments = 0, verbose = 0;
uword max_fifo_size;
segment_manager_t *sm; segment_manager_t *sm;
fifo_segment_t *seg; u32 sm_index = ~0;
app_worker_t *app_wrk;
application_t *app;
u8 custom_logic;
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",
show_segments = 1; pool_elts (smm->segment_managers));
else if (unformat (input, "verbose")) return 0;
verbose = 1;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);
} }
vlib_cli_output (vm, "%d segment managers allocated",
pool_elts (smm->segment_managers)); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
if (verbose && pool_elts (smm->segment_managers))
{ {
vlib_cli_output (vm, "%-6s%=10s%=10s%=13s%=11s%=11s%=12s", if (unformat (line_input, "segments"))
"Index", "AppIndex", "Segments", "MaxFifoSize", show_segments = 1;
"HighWater", "LowWater", "FifoTuning"); else if (unformat (line_input, "verbose"))
verbose = 1;
else if (unformat (line_input, "index %u", &sm_index))
;
else
{
vlib_cli_output (vm, "unknown input [%U]", format_unformat_error,
line_input);
goto done;
}
}
/* *INDENT-OFF* */ if (!pool_elts (smm->segment_managers))
goto done;
if (sm_index != ~0)
{
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;
}
if (verbose || show_segments)
{
pool_foreach (sm, smm->segment_managers) { pool_foreach (sm, smm->segment_managers) {
app_wrk = app_worker_get_if_valid (sm->app_wrk_index); vlib_cli_output (vm, "%U", format_segment_manager, sm,
app = app_wrk ? application_get (app_wrk->app_index) : 0; show_segments);
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");
} }
/* *INDENT-ON* */
vlib_cli_output (vm, "\n"); vlib_cli_output (vm, "\n");
} }
if (show_segments)
{
vlib_cli_output (vm, "%U", format_fifo_segment, 0, verbose);
/* *INDENT-OFF* */ done:
pool_foreach (sm, smm->segment_managers) {
segment_manager_foreach_segment_w_lock (seg, sm, ({ unformat_free (line_input);
vlib_cli_output (vm, "%U", format_fifo_segment, seg, verbose);
}));
}
/* *INDENT-ON* */
}
return 0; return 0;
} }
/* *INDENT-OFF* */ /* *INDENT-OFF* */
VLIB_CLI_COMMAND (segment_manager_show_command, static) = VLIB_CLI_COMMAND (segment_manager_show_command, static) = {
{
.path = "show segment-manager", .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, .function = segment_manager_show_fn,
}; };
/* *INDENT-ON* */ /* *INDENT-ON* */