u32 prealloc_fifos, segment_size = 256 << 20;
echo_client_main_t *ecm = &echo_client_main;
vnet_app_attach_args_t _a, *a = &_a;
- u64 options[16];
+ u64 options[17];
int rv;
clib_memset (a, 0, sizeof (*a));
options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] = prealloc_fifos;
options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_IS_BUILTIN;
options[APP_OPTIONS_TLS_ENGINE] = ecm->tls_engine;
+ options[APP_OPTIONS_PCT_FIRST_ALLOC] = 100;
if (appns_id)
{
options[APP_OPTIONS_FLAGS] |= appns_flags;
a->options[APP_OPTIONS_TX_FIFO_SIZE] = esm->fifo_size;
a->options[APP_OPTIONS_PRIVATE_SEGMENT_COUNT] = esm->private_segment_count;
a->options[APP_OPTIONS_TLS_ENGINE] = esm->tls_engine;
+ a->options[APP_OPTIONS_PCT_FIRST_ALLOC] = 100;
a->options[APP_OPTIONS_PREALLOC_FIFO_PAIRS] =
esm->prealloc_fifos ? esm->prealloc_fifos : 1;
* Alloc fifo
*/
fs = fifo_segment_get_segment (sm, a->new_segment_indices[0]);
+ fs->h->pct_first_alloc = 100;
f = fifo_segment_alloc_fifo (fs, fifo_size, FIFO_SEGMENT_RX_FIFO);
SFIFO_TEST (f != 0, "svm_fifo_segment_alloc_fifo");
rv = fifo_segment_create (sm, a);
SFIFO_TEST (!rv, "svm_fifo_segment_create returned %d", rv);
fs = fifo_segment_get_segment (sm, a->new_segment_indices[0]);
+ fs->h->pct_first_alloc = 100;
/*
* Prealloc chunks and headers
}
static svm_fifo_t *
-fs_try_alloc_fifo_freelist (fifo_segment_slice_t * fss,
- u32 fl_index, u32 data_bytes)
+fs_try_alloc_fifo_freelist (fifo_segment_slice_t * fss, u32 fl_index)
{
svm_fifo_chunk_t *c;
svm_fifo_t *f;
u32 fifo_sz, fl_index;
svm_fifo_t *f = 0;
uword n_free_bytes;
+ u32 min_size;
- fl_index = fs_freelist_for_size (data_bytes);
+ min_size = clib_max ((fsh->pct_first_alloc * data_bytes) / 100, 4096);
+ fl_index = fs_freelist_for_size (min_size);
fifo_sz = sizeof (svm_fifo_t) + sizeof (svm_fifo_chunk_t);
- fifo_sz += 1 << max_log2 (data_bytes);
+ fifo_sz += 1 << max_log2 (min_size);
if (fss->free_fifos && fss->free_chunks[fl_index])
{
- f = fs_try_alloc_fifo_freelist (fss, fl_index, data_bytes);
+ f = fs_try_alloc_fifo_freelist (fss, fl_index);
if (f)
{
fsh_cached_bytes_sub (fsh, fs_freelist_index_to_size (fl_index));
FIFO_SEGMENT_ALLOC_BATCH_SIZE))
goto done;
- f = fs_try_alloc_fifo_freelist (fss, fl_index, data_bytes);
+ f = fs_try_alloc_fifo_freelist (fss, fl_index);
if (f)
fsh_cached_bytes_sub (fsh, fs_freelist_index_to_size (fl_index));
goto done;
if (fifo_sz <= n_free_bytes)
{
void *oldheap = ssvm_push_heap (fsh->ssvm_sh);
- f = svm_fifo_alloc (data_bytes);
+ f = svm_fifo_alloc (min_size);
ssvm_pop_heap (oldheap);
if (f)
{
u8 n_slices; /**< Number of slices */
u8 high_watermark; /**< Memory pressure watermark high */
u8 low_watermark; /**< Memory pressure watermark low */
+ u8 pct_first_alloc; /**< Pct of fifo size to alloc */
};
#endif /* SRC_SVM_FIFO_TYPES_H_ */
svm_fifo_init (svm_fifo_t * f, u32 size)
{
svm_fifo_chunk_t *c, *prev;
- u32 first_chunk, min_alloc;
+ u32 min_alloc;
f->size = size;
f->ooos_list_head = OOO_SEGMENT_INVALID_INDEX;
f->head_chunk = f->tail_chunk = f->start_chunk;
f->ooo_deq = f->ooo_enq = 0;
- first_chunk = f->start_chunk->length;
- min_alloc = first_chunk > 16 << 10 ? first_chunk >> 2 : 4096;
- min_alloc = clib_min (first_chunk, 64 << 10);
+ min_alloc = size > 32 << 10 ? size >> 3 : 4096;
+ min_alloc = clib_min (min_alloc, 64 << 10);
f->min_alloc = min_alloc;
/*
props->high_watermark = options[APP_OPTIONS_HIGH_WATERMARK];
if (options[APP_OPTIONS_LOW_WATERMARK])
props->low_watermark = options[APP_OPTIONS_LOW_WATERMARK];
+ if (options[APP_OPTIONS_PCT_FIRST_ALLOC])
+ props->pct_first_alloc = options[APP_OPTIONS_PCT_FIRST_ALLOC];
props->segment_type = seg_type;
/* Add app to lookup by api_client_index table */
APP_OPTIONS_MAX_FIFO_SIZE,
APP_OPTIONS_HIGH_WATERMARK,
APP_OPTIONS_LOW_WATERMARK,
+ APP_OPTIONS_PCT_FIRST_ALLOC,
APP_OPTIONS_N_OPTIONS
} app_attach_options_index_t;
*/
fs->h->high_watermark = sm->high_watermark;
fs->h->low_watermark = sm->low_watermark;
+ fs->h->pct_first_alloc = props->pct_first_alloc;
fs->h->flags &= ~FIFO_SEGMENT_F_MEM_LIMIT;
done:
u32 max_fifo_size; /**< max fifo size */
u8 high_watermark; /**< memory usage high watermark % */
u8 low_watermark; /**< memory usage low watermark % */
+ u8 pct_first_alloc; /**< pct of fifo size to alloc */
} segment_manager_props_t;
typedef struct _segment_manager
u32 client_index;
u32 context;
u32 initial_segment_size;
- u64 options[16];
+ u64 options[17];
u8 namespace_id_len;
u8 namespace_id [64];
};
define app_attach {
u32 client_index;
u32 context;
- u64 options[16];
+ u64 options[17];
u8 namespace_id_len;
u8 namespace_id[64];
};