+int
+fifo_segment_prealloc_fifo_hdrs (fifo_segment_t * fs, u32 batch_size)
+{
+ fifo_segment_header_t *fsh = fs->h;
+ svm_fifo_t *f;
+ void *oldheap;
+ u32 size;
+ u8 *fmem;
+ int i;
+
+ size = (sizeof (*f)) * batch_size;
+
+ oldheap = ssvm_push_heap (fs->ssvm.sh);
+ fmem = clib_mem_alloc_aligned_at_offset (size, CLIB_CACHE_LINE_BYTES,
+ 0 /* align_offset */ ,
+ 0 /* os_out_of_memory */ );
+ ssvm_pop_heap (oldheap);
+
+ /* Out of space.. */
+ if (fmem == 0)
+ return -1;
+
+ /* Carve fifo + chunk space */
+ for (i = 0; i < batch_size; i++)
+ {
+ f = (svm_fifo_t *) fmem;
+ memset (f, 0, sizeof (*f));
+ f->next = fsh->free_fifos;
+ fsh->free_fifos = f;
+ fmem += sizeof (*f);
+ }
+
+ fsh->n_free_bytes -= size;
+
+ return 0;
+}
+
+int
+fifo_segment_prealloc_fifo_chunks (fifo_segment_t * fs, u32 chunk_size,
+ u32 batch_size)
+{
+ fifo_segment_header_t *fsh = fs->h;
+ u32 size, rounded_data_size, fl_index;
+ svm_fifo_chunk_t *c;
+ void *oldheap;
+ u8 *cmem;
+ int i;
+
+ if (!fs_chunk_size_is_valid (chunk_size))
+ {
+ clib_warning ("chunk size out of range %d", chunk_size);
+ return -1;
+ }
+
+ fl_index = fs_freelist_for_size (chunk_size);
+ vec_validate_init_empty (fsh->free_chunks, fl_index, 0);
+ rounded_data_size = fs_freelist_index_to_size (fl_index);
+ size = (sizeof (*c) + rounded_data_size) * batch_size;
+
+ oldheap = ssvm_push_heap (fs->ssvm.sh);
+ cmem = clib_mem_alloc_aligned_at_offset (size, CLIB_CACHE_LINE_BYTES,
+ 0 /* align_offset */ ,
+ 0 /* os_out_of_memory */ );
+ ssvm_pop_heap (oldheap);
+
+ /* Out of space.. */
+ if (cmem == 0)
+ return -1;
+
+ /* Carve fifo + chunk space */
+ for (i = 0; i < batch_size; i++)
+ {
+ c = (svm_fifo_chunk_t *) cmem;
+ c->start_byte = 0;
+ c->length = rounded_data_size;
+ c->next = fsh->free_chunks[fl_index];
+ fsh->free_chunks[fl_index] = c;
+ cmem += sizeof (*c) + rounded_data_size;
+ }
+
+ fsh->n_fl_chunk_bytes += batch_size * rounded_data_size;
+ fsh->n_free_bytes -= size;
+
+ return 0;
+}
+