Type: improvement
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I7672d0715348d30c0aa718e21ed86c96402c6d69
return &fsh->slices[slice_index];
}
return &fsh->slices[slice_index];
}
+static inline fifo_slice_private_t *
+fs_slice_private_get (fifo_segment_t *fs, u32 slice_index)
+{
+ ASSERT (slice_index < fs->n_slices);
+ return &fs->slices[slice_index];
+}
+
static char *fifo_segment_mem_status_strings[] = {
#define _(sym,str) str,
foreach_segment_mem_status
static char *fifo_segment_mem_status_strings[] = {
#define _(sym,str) str,
foreach_segment_mem_status
-fss_fifo_add_active_list (fifo_segment_slice_t * fss, svm_fifo_t * f)
+pfss_fifo_add_active_list (fifo_slice_private_t *pfss, svm_fifo_t *f)
+ if (pfss->active_fifos)
- fss->fifos->prev = f;
- f->next = fss->fifos;
+ pfss->active_fifos->prev = f;
+ f->next = pfss->active_fifos;
+ pfss->active_fifos = f;
-fss_fifo_del_active_list (fifo_segment_slice_t * fss, svm_fifo_t * f)
+pfss_fifo_del_active_list (fifo_slice_private_t *pfss, svm_fifo_t *f)
{
if (f->flags & SVM_FIFO_F_LL_TRACKED)
{
if (f->prev)
f->prev->next = f->next;
else
{
if (f->flags & SVM_FIFO_F_LL_TRACKED)
{
if (f->prev)
f->prev->next = f->next;
else
+ pfss->active_fifos = f->next;
if (f->next)
f->next->prev = f->prev;
}
if (f->next)
f->next->prev = f->prev;
}
u32 data_bytes, fifo_segment_ftype_t ftype)
{
fifo_segment_header_t *fsh = fs->h;
u32 data_bytes, fifo_segment_ftype_t ftype)
{
fifo_segment_header_t *fsh = fs->h;
+ fifo_slice_private_t *pfss;
fifo_segment_slice_t *fss;
svm_fifo_shared_t *sf;
svm_fifo_t *f = 0;
fifo_segment_slice_t *fss;
svm_fifo_shared_t *sf;
svm_fifo_t *f = 0;
svm_fifo_init (f, data_bytes);
fss = fsh_slice_get (fsh, slice_index);
svm_fifo_init (f, data_bytes);
fss = fsh_slice_get (fsh, slice_index);
+ pfss = fs_slice_private_get (fs, slice_index);
/* If rx fifo type add to active fifos list. When cleaning up segment,
* we need a list of active sessions that should be disconnected. Since
/* If rx fifo type add to active fifos list. When cleaning up segment,
* we need a list of active sessions that should be disconnected. Since
* only one. */
if (ftype == FIFO_SEGMENT_RX_FIFO)
{
* only one. */
if (ftype == FIFO_SEGMENT_RX_FIFO)
{
- fss_fifo_add_active_list (fss, f);
+ pfss_fifo_add_active_list (pfss, f);
f->flags |= SVM_FIFO_F_LL_TRACKED;
}
f->flags |= SVM_FIFO_F_LL_TRACKED;
}
fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
{
fifo_segment_header_t *fsh = fs->h;
fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
{
fifo_segment_header_t *fsh = fs->h;
+ fifo_slice_private_t *pfss;
fifo_segment_slice_t *fss;
svm_fifo_shared_t *sf;
fifo_segment_slice_t *fss;
svm_fifo_shared_t *sf;
sf = f->shr;
fss = fsh_slice_get (fsh, sf->slice_index);
sf = f->shr;
fss = fsh_slice_get (fsh, sf->slice_index);
+ pfss = fs_slice_private_get (fs, sf->slice_index);
/* Free fifo chunks */
fsh_slice_collect_chunks (fsh, fss, fs_chunk_ptr (fsh, f->shr->start_chunk));
/* Free fifo chunks */
fsh_slice_collect_chunks (fsh, fss, fs_chunk_ptr (fsh, f->shr->start_chunk));
/* Remove from active list. Only rx fifos are tracked */
if (f->flags & SVM_FIFO_F_LL_TRACKED)
{
/* Remove from active list. Only rx fifos are tracked */
if (f->flags & SVM_FIFO_F_LL_TRACKED)
{
- fss_fifo_del_active_list (fss, f);
+ pfss_fifo_del_active_list (pfss, f);
f->flags &= ~SVM_FIFO_F_LL_TRACKED;
}
f->flags &= ~SVM_FIFO_F_LL_TRACKED;
}
void
fifo_segment_detach_fifo (fifo_segment_t * fs, svm_fifo_t * f)
{
void
fifo_segment_detach_fifo (fifo_segment_t * fs, svm_fifo_t * f)
{
+ fifo_slice_private_t *pfss;
fifo_segment_slice_t *fss;
svm_fifo_chunk_t *c;
u32 fl_index;
fifo_segment_slice_t *fss;
svm_fifo_chunk_t *c;
u32 fl_index;
ASSERT (f->refcnt == 1);
fss = fsh_slice_get (fs->h, f->shr->slice_index);
ASSERT (f->refcnt == 1);
fss = fsh_slice_get (fs->h, f->shr->slice_index);
+ pfss = fs_slice_private_get (fs, f->shr->slice_index);
fss->virtual_mem -= svm_fifo_size (f);
if (f->flags & SVM_FIFO_F_LL_TRACKED)
fss->virtual_mem -= svm_fifo_size (f);
if (f->flags & SVM_FIFO_F_LL_TRACKED)
- fss_fifo_del_active_list (fss, f);
+ pfss_fifo_del_active_list (pfss, f);
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
while (c)
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
while (c)
fifo_segment_attach_fifo (fifo_segment_t * fs, svm_fifo_t * f,
u32 slice_index)
{
fifo_segment_attach_fifo (fifo_segment_t * fs, svm_fifo_t * f,
u32 slice_index)
{
+ fifo_slice_private_t *pfss;
fifo_segment_slice_t *fss;
svm_fifo_chunk_t *c;
u32 fl_index;
f->shr->slice_index = slice_index;
fss = fsh_slice_get (fs->h, f->shr->slice_index);
fifo_segment_slice_t *fss;
svm_fifo_chunk_t *c;
u32 fl_index;
f->shr->slice_index = slice_index;
fss = fsh_slice_get (fs->h, f->shr->slice_index);
+ pfss = fs_slice_private_get (fs, f->shr->slice_index);
fss->virtual_mem += svm_fifo_size (f);
if (f->flags & SVM_FIFO_F_LL_TRACKED)
fss->virtual_mem += svm_fifo_size (f);
if (f->flags & SVM_FIFO_F_LL_TRACKED)
- fss_fifo_add_active_list (fss, f);
+ pfss_fifo_add_active_list (pfss, f);
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
while (c)
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
while (c)
svm_fifo_t *
fifo_segment_get_slice_fifo_list (fifo_segment_t * fs, u32 slice_index)
{
svm_fifo_t *
fifo_segment_get_slice_fifo_list (fifo_segment_t * fs, u32 slice_index)
{
- fifo_segment_header_t *fsh = fs->h;
- fifo_segment_slice_t *fss;
+ fifo_slice_private_t *pfss;
- fss = fsh_slice_get (fsh, slice_index);
- return fss->fifos;
+ pfss = fs_slice_private_get (fs, slice_index);
+ return pfss->active_fifos;
{
svm_fifo_chunk_ptr_t
free_chunks[FS_CHUNK_VEC_LEN]; /**< Free chunks by size */
{
svm_fifo_chunk_ptr_t
free_chunks[FS_CHUNK_VEC_LEN]; /**< Free chunks by size */
- svm_fifo_t *fifos; /**< Linked list of active RX fifos */
svm_fifo_shared_t *free_fifos; /**< Freelists of fifo shared hdrs */
uword n_fl_chunk_bytes; /**< Chunk bytes on freelist */
uword virtual_mem; /**< Slice sum of all fifo sizes */
svm_fifo_shared_t *free_fifos; /**< Freelists of fifo shared hdrs */
uword n_fl_chunk_bytes; /**< Chunk bytes on freelist */
uword virtual_mem; /**< Slice sum of all fifo sizes */
{
clib_mem_bulk_handle_t fifos; /**< Bulk fifo allocator */
uword virtual_mem; /**< Slice sum of all fifo sizes */
{
clib_mem_bulk_handle_t fifos; /**< Bulk fifo allocator */
uword virtual_mem; /**< Slice sum of all fifo sizes */
+ svm_fifo_t *active_fifos; /**< Linked list of active RX fifos */
} fifo_slice_private_t;
struct fifo_segment_header_
} fifo_slice_private_t;
struct fifo_segment_header_