}
/*
- * Allocate fifo segment and lock if needed
+ * Allocate fifo segment and grab lock if needed
*/
if (vlib_num_workers ())
clib_rwlock_writer_lock (&sm->segments_rwlock);
pool_get_zero (sm->segments, fs);
/*
- * Initialize ssvm segment and svm fifo private header
+ * Allocate ssvm segment
*/
segment_size = segment_size ? segment_size : props->add_segment_size;
page_size = clib_mem_get_page_size ();
- segment_size = (segment_size + page_size - 1) & ~(page_size - 1);
+ /* Protect against segment size u32 wrap */
+ segment_size = clib_max (segment_size + page_size - 1, segment_size);
+ segment_size = segment_size & ~(page_size - 1);
+
if (props->segment_type != SSVM_SEGMENT_PRIVATE)
{
seg_name = format (0, "%d-%d%c", getpid (), smm->seg_name_counter++, 0);
}
}
else
- seg_name = format (0, "%s%c", "process-private-segment", 0);
+ seg_name = format (0, "%s%c", "process-private", 0);
fs->ssvm.ssvm_size = segment_size;
fs->ssvm.name = seg_name;
goto done;
}
+ /*
+ * Initialize fifo segment
+ */
fifo_segment_init (fs);
/*
void
segment_manager_segment_reader_unlock (segment_manager_t * sm)
{
- ASSERT (sm->segments_rwlock->n_readers > 0);
clib_rwlock_reader_unlock (&sm->segments_rwlock);
}
return rv;
}
+int
+segment_manager_collect_fifo_chunks (segment_manager_t * sm, svm_fifo_t * f)
+{
+ fifo_segment_t *fs;
+ int rv;
+
+ fs = segment_manager_get_segment_w_lock (sm, f->segment_index);
+ rv = fifo_segment_collect_fifo_chunks (fs, f);
+ segment_manager_segment_reader_unlock (sm);
+
+ return rv;
+}
+
+int
+segment_manager_shrink_fifo (segment_manager_t * sm, svm_fifo_t * f, u32 size,
+ u8 is_producer)
+{
+ int rv;
+
+ rv = svm_fifo_reduce_size (f, size, is_producer);
+
+ /* Nothing to collect at this point */
+ if (!is_producer)
+ return rv;
+
+ if (f->flags & SVM_FIFO_F_COLLECT_CHUNKS)
+ segment_manager_collect_fifo_chunks (sm, f);
+
+ return rv;
+}
+
u32
segment_manager_evt_q_expected_size (u32 q_len)
{
oldheap = ssvm_push_heap (segment->ssvm.sh);
q = svm_msg_q_alloc (cfg);
+ fifo_segment_update_free_bytes (segment);
ssvm_pop_heap (oldheap);
if (props->use_mq_eventfd)
vlib_cli_command_t * cmd)
{
segment_manager_main_t *smm = &sm_main;
- fifo_segment_t *seg;
- segment_manager_t *sm;
u8 show_segments = 0, verbose = 0;
- char *address;
- size_t size;
- u32 active_fifos;
- u32 free_fifos;
+ segment_manager_t *sm;
+ fifo_segment_t *seg;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
}
if (show_segments)
{
- vlib_cli_output (vm, "%-15s%15s%15s%15s%15s%15s", "Name", "Type",
- "HeapSize (M)", "ActiveFifos", "FreeFifos", "Address");
+ 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, ({
- fifo_segment_info (seg, &address, &size);
- active_fifos = fifo_segment_num_fifos (seg);
- free_fifos = fifo_segment_num_free_fifos (seg, ~0 /* size */);
- vlib_cli_output (vm, "%-15v%15U%15llu%15u%15u%15llx",
- ssvm_name (&seg->ssvm), format_fifo_segment_type,
- seg, size >> 20ULL, active_fifos, free_fifos,
- address);
- if (verbose)
- vlib_cli_output (vm, "%U", format_fifo_segment, seg, verbose);
+ vlib_cli_output (vm, "%U", format_fifo_segment, seg, verbose);
}));
}));
/* *INDENT-ON* */