+static clib_error_t *
+segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ svm_fifo_segment_private_t *segments, *seg;
+ segment_manager_t *sm;
+ u8 show_segments = 0, verbose = 0, *name;
+ uword address;
+ u64 size;
+ u32 active_fifos;
+ u32 free_fifos;
+
+ mheap_t *heap_header;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "segments"))
+ show_segments = 1;
+ else if (unformat (input, "verbose"))
+ 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 (segment_managers));
+ if (verbose && pool_elts (segment_managers))
+ {
+ vlib_cli_output (vm, "%-10s%=15s%=12s", "Index", "App Index",
+ "Segments");
+
+ /* *INDENT-OFF* */
+ pool_foreach (sm, segment_managers, ({
+ vlib_cli_output (vm, "%-10d%=15d%=12d", segment_manager_index(sm),
+ sm->app_index, vec_len (sm->segment_indices));
+ }));
+ /* *INDENT-ON* */
+
+ }
+ if (show_segments)
+ {
+ segments = svm_fifo_segment_segments_pool ();
+ vlib_cli_output (vm, "%d svm fifo segments allocated",
+ pool_elts (segments));
+ vlib_cli_output (vm, "%-20s%=12s%=16s%=16s%=16s", "Name",
+ "HeapSize (M)", "ActiveFifos", "FreeFifos", "Address");
+
+ /* *INDENT-OFF* */
+ pool_foreach (seg, segments, ({
+ if (seg->h->flags & FIFO_SEGMENT_F_IS_PRIVATE)
+ {
+ address = pointer_to_uword (seg->ssvm.sh->heap);
+ if (seg->h->flags & FIFO_SEGMENT_F_IS_MAIN_HEAP)
+ name = format (0, "main heap");
+ else
+ name = format (0, "private heap");
+ heap_header = mheap_header (seg->ssvm.sh->heap);
+ size = heap_header->max_size;
+ }
+ else
+ {
+ address = seg->ssvm.sh->ssvm_va;
+ size = seg->ssvm.ssvm_size;
+ name = seg->ssvm.sh->name;
+ }
+ active_fifos = svm_fifo_segment_num_fifos (seg);
+ free_fifos = svm_fifo_segment_num_free_fifos (seg, ~0 /* size */);
+ vlib_cli_output (vm, "%-20v%=16llu%=16u%=16u%16llx",
+ name, size >> 20ULL, active_fifos, free_fifos,
+ address);
+ if (verbose)
+ vlib_cli_output (vm, "%U",
+ format_svm_fifo_segment, seg, verbose);
+ if (seg->h->flags & FIFO_SEGMENT_F_IS_PRIVATE)
+ vec_free (name);
+ }));
+ /* *INDENT-ON* */
+
+ }
+ return 0;
+}
+
+ /* *INDENT-OFF* */
+VLIB_CLI_COMMAND (segment_manager_show_command, static) =
+{
+ .path = "show segment-manager",
+ .short_help = "show segment-manager [segments][verbose]",
+ .function = segment_manager_show_fn,
+};
+/* *INDENT-ON* */
+