svm: move active fifo list to private slice
Type: improvement Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: I7672d0715348d30c0aa718e21ed86c96402c6d69
This commit is contained in:

committed by
Dave Barach

parent
5481ad4eb7
commit
1f952d386d
@ -52,6 +52,13 @@ fsh_slice_get (fifo_segment_header_t * fsh, u32 slice_index)
|
|||||||
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[] = {
|
static char *fifo_segment_mem_status_strings[] = {
|
||||||
#define _(sym,str) str,
|
#define _(sym,str) str,
|
||||||
foreach_segment_mem_status
|
foreach_segment_mem_status
|
||||||
@ -194,25 +201,25 @@ fss_chunk_free_list_pop (fifo_segment_header_t *fsh, fifo_segment_slice_t *fss,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
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 (fss->fifos)
|
if (pfss->active_fifos)
|
||||||
{
|
{
|
||||||
fss->fifos->prev = f;
|
pfss->active_fifos->prev = f;
|
||||||
f->next = fss->fifos;
|
f->next = pfss->active_fifos;
|
||||||
}
|
}
|
||||||
fss->fifos = f;
|
pfss->active_fifos = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
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->flags & SVM_FIFO_F_LL_TRACKED)
|
||||||
{
|
{
|
||||||
if (f->prev)
|
if (f->prev)
|
||||||
f->prev->next = f->next;
|
f->prev->next = f->next;
|
||||||
else
|
else
|
||||||
fss->fifos = f->next;
|
pfss->active_fifos = f->next;
|
||||||
if (f->next)
|
if (f->next)
|
||||||
f->next->prev = f->prev;
|
f->next->prev = f->prev;
|
||||||
}
|
}
|
||||||
@ -770,6 +777,7 @@ fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, u32 slice_index,
|
|||||||
u32 data_bytes, fifo_segment_ftype_t ftype)
|
u32 data_bytes, fifo_segment_ftype_t ftype)
|
||||||
{
|
{
|
||||||
fifo_segment_header_t *fsh = fs->h;
|
fifo_segment_header_t *fsh = fs->h;
|
||||||
|
fifo_slice_private_t *pfss;
|
||||||
fifo_segment_slice_t *fss;
|
fifo_segment_slice_t *fss;
|
||||||
svm_fifo_shared_t *sf;
|
svm_fifo_shared_t *sf;
|
||||||
svm_fifo_t *f = 0;
|
svm_fifo_t *f = 0;
|
||||||
@ -790,6 +798,7 @@ fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, u32 slice_index,
|
|||||||
svm_fifo_init (f, data_bytes);
|
svm_fifo_init (f, data_bytes);
|
||||||
|
|
||||||
fss = fsh_slice_get (fsh, slice_index);
|
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,
|
/* 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
|
* we need a list of active sessions that should be disconnected. Since
|
||||||
@ -797,7 +806,7 @@ fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, u32 slice_index,
|
|||||||
* only one. */
|
* only one. */
|
||||||
if (ftype == FIFO_SEGMENT_RX_FIFO)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -828,6 +837,7 @@ void
|
|||||||
fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
||||||
{
|
{
|
||||||
fifo_segment_header_t *fsh = fs->h;
|
fifo_segment_header_t *fsh = fs->h;
|
||||||
|
fifo_slice_private_t *pfss;
|
||||||
fifo_segment_slice_t *fss;
|
fifo_segment_slice_t *fss;
|
||||||
svm_fifo_shared_t *sf;
|
svm_fifo_shared_t *sf;
|
||||||
|
|
||||||
@ -842,6 +852,7 @@ fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
|||||||
|
|
||||||
sf = f->shr;
|
sf = f->shr;
|
||||||
fss = fsh_slice_get (fsh, sf->slice_index);
|
fss = fsh_slice_get (fsh, sf->slice_index);
|
||||||
|
pfss = fs_slice_private_get (fs, sf->slice_index);
|
||||||
|
|
||||||
/* Free fifo chunks */
|
/* Free fifo chunks */
|
||||||
fsh_slice_collect_chunks (fsh, fss, fs_chunk_ptr (fsh, f->shr->start_chunk));
|
fsh_slice_collect_chunks (fsh, fss, fs_chunk_ptr (fsh, f->shr->start_chunk));
|
||||||
@ -862,7 +873,7 @@ fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
|||||||
/* Remove from active list. Only rx fifos are tracked */
|
/* Remove from active list. Only rx fifos are tracked */
|
||||||
if (f->flags & SVM_FIFO_F_LL_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -886,6 +897,7 @@ fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
|||||||
void
|
void
|
||||||
fifo_segment_detach_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
fifo_segment_detach_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
||||||
{
|
{
|
||||||
|
fifo_slice_private_t *pfss;
|
||||||
fifo_segment_slice_t *fss;
|
fifo_segment_slice_t *fss;
|
||||||
svm_fifo_chunk_t *c;
|
svm_fifo_chunk_t *c;
|
||||||
u32 fl_index;
|
u32 fl_index;
|
||||||
@ -893,9 +905,10 @@ fifo_segment_detach_fifo (fifo_segment_t * fs, svm_fifo_t * f)
|
|||||||
ASSERT (f->refcnt == 1);
|
ASSERT (f->refcnt == 1);
|
||||||
|
|
||||||
fss = fsh_slice_get (fs->h, f->shr->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);
|
fss->virtual_mem -= svm_fifo_size (f);
|
||||||
if (f->flags & SVM_FIFO_F_LL_TRACKED)
|
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);
|
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
|
||||||
while (c)
|
while (c)
|
||||||
@ -910,15 +923,17 @@ void
|
|||||||
fifo_segment_attach_fifo (fifo_segment_t * fs, svm_fifo_t * f,
|
fifo_segment_attach_fifo (fifo_segment_t * fs, svm_fifo_t * f,
|
||||||
u32 slice_index)
|
u32 slice_index)
|
||||||
{
|
{
|
||||||
|
fifo_slice_private_t *pfss;
|
||||||
fifo_segment_slice_t *fss;
|
fifo_segment_slice_t *fss;
|
||||||
svm_fifo_chunk_t *c;
|
svm_fifo_chunk_t *c;
|
||||||
u32 fl_index;
|
u32 fl_index;
|
||||||
|
|
||||||
f->shr->slice_index = slice_index;
|
f->shr->slice_index = slice_index;
|
||||||
fss = fsh_slice_get (fs->h, f->shr->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);
|
fss->virtual_mem += svm_fifo_size (f);
|
||||||
if (f->flags & SVM_FIFO_F_LL_TRACKED)
|
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);
|
c = fs_chunk_ptr (fs->h, f->shr->start_chunk);
|
||||||
while (c)
|
while (c)
|
||||||
@ -1201,11 +1216,10 @@ fifo_segment_has_fifos (fifo_segment_t * fs)
|
|||||||
svm_fifo_t *
|
svm_fifo_t *
|
||||||
fifo_segment_get_slice_fifo_list (fifo_segment_t * fs, u32 slice_index)
|
fifo_segment_get_slice_fifo_list (fifo_segment_t * fs, u32 slice_index)
|
||||||
{
|
{
|
||||||
fifo_segment_header_t *fsh = fs->h;
|
fifo_slice_private_t *pfss;
|
||||||
fifo_segment_slice_t *fss;
|
|
||||||
|
|
||||||
fss = fsh_slice_get (fsh, slice_index);
|
pfss = fs_slice_private_get (fs, slice_index);
|
||||||
return fss->fifos;
|
return pfss->active_fifos;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8
|
u8
|
||||||
|
@ -119,7 +119,6 @@ typedef struct fifo_segment_slice_
|
|||||||
{
|
{
|
||||||
svm_fifo_chunk_ptr_t
|
svm_fifo_chunk_ptr_t
|
||||||
free_chunks[FS_CHUNK_VEC_LEN]; /**< Free chunks by size */
|
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 */
|
svm_fifo_shared_t *free_fifos; /**< Freelists of fifo shared hdrs */
|
||||||
uword n_fl_chunk_bytes; /**< Chunk bytes on freelist */
|
uword n_fl_chunk_bytes; /**< Chunk bytes on freelist */
|
||||||
uword virtual_mem; /**< Slice sum of all fifo sizes */
|
uword virtual_mem; /**< Slice sum of all fifo sizes */
|
||||||
@ -133,6 +132,7 @@ typedef struct fifo_slice_private_
|
|||||||
{
|
{
|
||||||
clib_mem_bulk_handle_t fifos; /**< Bulk fifo allocator */
|
clib_mem_bulk_handle_t fifos; /**< Bulk fifo allocator */
|
||||||
uword virtual_mem; /**< Slice sum of all fifo sizes */
|
uword virtual_mem; /**< Slice sum of all fifo sizes */
|
||||||
|
svm_fifo_t *active_fifos; /**< Linked list of active RX fifos */
|
||||||
} fifo_slice_private_t;
|
} fifo_slice_private_t;
|
||||||
|
|
||||||
struct fifo_segment_header_
|
struct fifo_segment_header_
|
||||||
|
Reference in New Issue
Block a user