+ segment_manager_segment_reader_unlock (sm);
+}
+
+/*
+ * Init segment vm address allocator
+ */
+void
+segment_manager_main_init (segment_manager_main_init_args_t * a)
+{
+ segment_manager_main_t *sm = &segment_manager_main;
+ clib_valloc_chunk_t _ip, *ip = &_ip;
+
+ ip->baseva = a->baseva;
+ ip->size = a->size;
+
+ clib_valloc_init (&sm->va_allocator, ip, 1 /* lock */ );
+}
+
+static clib_error_t *
+segment_manager_show_fn (vlib_main_t * vm, unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ segment_manager_main_t *smm = &segment_manager_main;
+ svm_fifo_segment_private_t *seg;
+ segment_manager_t *sm;
+ u8 show_segments = 0, verbose = 0;
+ uword address;
+ u64 size;
+ u32 active_fifos;
+ u32 free_fifos;
+
+ 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 (smm->segment_managers));
+ if (verbose && pool_elts (smm->segment_managers))
+ {
+ vlib_cli_output (vm, "%-10s%=15s%=12s", "Index", "App Index",
+ "Segments");
+
+ /* *INDENT-OFF* */
+ pool_foreach (sm, smm->segment_managers, ({
+ vlib_cli_output (vm, "%-10d%=15d%=12d", segment_manager_index(sm),
+ sm->app_index, pool_elts (sm->segments));
+ }));
+ /* *INDENT-ON* */
+
+ }
+ if (show_segments)
+ {
+ vlib_cli_output (vm, "%-15s%15s%15s%15s%15s%15s", "Name", "Type",
+ "HeapSize (M)", "ActiveFifos", "FreeFifos", "Address");
+
+ /* *INDENT-OFF* */
+ pool_foreach (sm, smm->segment_managers, ({
+ segment_manager_foreach_segment_w_lock (seg, sm, ({
+ svm_fifo_segment_info (seg, &address, &size);
+ active_fifos = svm_fifo_segment_num_fifos (seg);
+ free_fifos = svm_fifo_segment_num_free_fifos (seg, ~0 /* size */);
+ vlib_cli_output (vm, "%-15v%15U%15llu%15u%15u%15llx",
+ ssvm_name (&seg->ssvm), format_svm_fifo_segment_type,
+ seg, size >> 20ULL, active_fifos, free_fifos,
+ address);
+ if (verbose)
+ vlib_cli_output (vm, "%U", format_svm_fifo_segment, seg, verbose);
+ }));
+ }));
+ /* *INDENT-ON* */
+
+ }
+ return 0;