/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
+ * Copyright (c) 2016-2019 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
#include <svm/svm_fifo_segment.h>
-svm_fifo_segment_main_t svm_fifo_segment_main;
+static void
+fifo_init_for_segment (svm_fifo_segment_header_t * fsh, u8 * fifo_space,
+ u32 size, u32 freelist_index)
+{
+ svm_fifo_t *f;
+
+ f = (svm_fifo_t *) fifo_space;
+ f->freelist_index = freelist_index;
+ f->default_chunk.next = &f->default_chunk;
+ f->default_chunk.start_byte = 0;
+ f->default_chunk.length = size;
+ f->head_chunk = &f->default_chunk;
+ f->tail_chunk = &f->default_chunk;
+ f->next = fsh->free_fifos[freelist_index];
+ fsh->free_fifos[freelist_index] = f;
+}
static void
allocate_new_fifo_chunk (svm_fifo_segment_header_t * fsh,
return;
/* Carve fifo space */
- f = (svm_fifo_t *) fifo_space;
for (i = 0; i < chunk_size; i++)
{
- f->freelist_index = freelist_index;
- f->next = fsh->free_fifos[freelist_index];
- fsh->free_fifos[freelist_index] = f;
+ fifo_init_for_segment (fsh, fifo_space, rounded_data_size,
+ freelist_index);
fifo_space += sizeof (*f) + rounded_data_size;
- f = (svm_fifo_t *) fifo_space;
}
}
}
/* Carve rx fifo space */
- f = (svm_fifo_t *) rx_fifo_space;
for (i = 0; i < pairs_to_allocate; i++)
{
- f->freelist_index = rx_freelist_index;
- f->next = fsh->free_fifos[rx_freelist_index];
- fsh->free_fifos[rx_freelist_index] = f;
+ fifo_init_for_segment (fsh, rx_fifo_space, rx_rounded_data_size,
+ rx_freelist_index);
rx_fifo_space += sizeof (*f) + rx_rounded_data_size;
- f = (svm_fifo_t *) rx_fifo_space;
}
/* Carve tx fifo space */
- f = (svm_fifo_t *) tx_fifo_space;
for (i = 0; i < pairs_to_allocate; i++)
{
- f->freelist_index = tx_freelist_index;
- f->next = fsh->free_fifos[tx_freelist_index];
- fsh->free_fifos[tx_freelist_index] = f;
+ fifo_init_for_segment (fsh, tx_fifo_space, tx_rounded_data_size,
+ tx_freelist_index);
tx_fifo_space += sizeof (*f) + tx_rounded_data_size;
- f = (svm_fifo_t *) tx_fifo_space;
}
/* Account for the pairs allocated */
* Create an svm fifo segment and initialize as master
*/
int
-svm_fifo_segment_create (svm_fifo_segment_create_args_t * a)
+svm_fifo_segment_create (svm_fifo_segment_main_t * sm,
+ svm_fifo_segment_create_args_t * a)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
svm_fifo_segment_private_t *s;
int rv;
* Create an svm fifo segment in process-private memory
*/
int
-svm_fifo_segment_create_process_private (svm_fifo_segment_create_args_t * a)
+svm_fifo_segment_create_process_private (svm_fifo_segment_main_t * sm,
+ svm_fifo_segment_create_args_t * a)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
svm_fifo_segment_private_t *s;
ssvm_shared_header_t *sh;
u32 rnd_size = 0;
* Attach as slave to an svm fifo segment
*/
int
-svm_fifo_segment_attach (svm_fifo_segment_create_args_t * a)
+svm_fifo_segment_attach (svm_fifo_segment_main_t * sm,
+ svm_fifo_segment_create_args_t * a)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
svm_fifo_segment_private_t *s;
int rv;
}
void
-svm_fifo_segment_delete (svm_fifo_segment_private_t * s)
+svm_fifo_segment_delete (svm_fifo_segment_main_t * sm,
+ svm_fifo_segment_private_t * s)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
-
ssvm_delete (&s->ssvm);
clib_memset (s, 0xfe, sizeof (*s));
pool_put (sm->segments, s);
* Allocate fifo in svm segment
*/
svm_fifo_t *
-svm_fifo_segment_alloc_fifo (svm_fifo_segment_private_t * s,
+svm_fifo_segment_alloc_fifo (svm_fifo_segment_private_t * fs,
u32 data_size_in_bytes,
svm_fifo_segment_freelist_t list_index)
{
freelist_index = max_log2 (data_size_in_bytes)
- max_log2 (FIFO_SEGMENT_MIN_FIFO_SIZE);
- sh = s->ssvm.sh;
+ sh = fs->ssvm.sh;
ssvm_lock_non_recursive (sh, 1);
fsh = (svm_fifo_segment_header_t *) sh->opaque[0];
f = fsh->free_fifos[freelist_index];
if (PREDICT_FALSE (!f))
{
- /* Preallocated and no fifo left. Don't even try */
- if (fsh->flags & FIFO_SEGMENT_F_IS_PREALLOCATED)
- goto done;
-
oldheap = ssvm_push_heap (sh);
allocate_new_fifo_chunk (fsh, data_size_in_bytes,
FIFO_SEGMENT_ALLOC_CHUNK_SIZE);
fsh->free_fifos[freelist_index] = f->next;
/* (re)initialize the fifo, as in svm_fifo_create */
clib_memset (f, 0, sizeof (*f));
- f->nitems = data_size_in_bytes;
- f->ooos_list_head = OOO_SEGMENT_INVALID_INDEX;
- f->ct_session_index = SVM_FIFO_INVALID_SESSION_INDEX;
- f->refcnt = 1;
- f->freelist_index = freelist_index;
+ svm_fifo_init (f, data_size_in_bytes);
goto found;
}
break;
{
ssvm_shared_header_t *sh;
svm_fifo_segment_header_t *fsh;
- void *oldheap;
int freelist_index;
ASSERT (f->refcnt > 0);
ASSERT (freelist_index < vec_len (fsh->free_fifos));
ssvm_lock_non_recursive (sh, 2);
- oldheap = ssvm_push_heap (sh);
switch (list_index)
{
}
fsh->n_active_fifos--;
- ssvm_pop_heap (oldheap);
ssvm_unlock_non_recursive (sh);
}
void
-svm_fifo_segment_main_init (u64 baseva, u32 timeout_in_seconds)
+svm_fifo_segment_main_init (svm_fifo_segment_main_t * sm, u64 baseva,
+ u32 timeout_in_seconds)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
-
sm->next_baseva = baseva;
sm->timeout_in_seconds = timeout_in_seconds;
}
u32
-svm_fifo_segment_index (svm_fifo_segment_private_t * s)
+svm_fifo_segment_index (svm_fifo_segment_main_t * sm,
+ svm_fifo_segment_private_t * s)
{
- return s - svm_fifo_segment_main.segments;
+ return s - sm->segments;
}
/**
* Retrieve svm segments pool. Used only for debug purposes.
*/
svm_fifo_segment_private_t *
-svm_fifo_segment_segments_pool (void)
+svm_fifo_segment_segments_pool (svm_fifo_segment_main_t * sm)
{
- svm_fifo_segment_main_t *sm = &svm_fifo_segment_main;
return sm->segments;
}
}
void
-svm_fifo_segment_info (svm_fifo_segment_private_t * seg, uword * address,
- u64 * size)
+svm_fifo_segment_info (svm_fifo_segment_private_t * seg, char **address,
+ size_t * size)
{
if (ssvm_type (&seg->ssvm) == SSVM_SEGMENT_PRIVATE)
{
heap_header = mheap_header (seg->ssvm.sh->heap);
*size = heap_header->max_size;
#else
- mspace_get_address_and_size (seg->ssvm.sh->heap,
- (unsigned long long *) address,
- (unsigned long long *) size);
+ mspace_get_address_and_size (seg->ssvm.sh->heap, address, size);
#endif
}
else
{
- *address = seg->ssvm.sh->ssvm_va;
+ *address = (char *) seg->ssvm.sh->ssvm_va;
*size = seg->ssvm.ssvm_size;
}
}