summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/svm/fifo_segment.c15
-rw-r--r--src/svm/fifo_types.h1
2 files changed, 9 insertions, 7 deletions
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c
index 9f1e46c9df6..5408567b8f4 100644
--- a/src/svm/fifo_segment.c
+++ b/src/svm/fifo_segment.c
@@ -969,7 +969,10 @@ fifo_segment_detach_fifo (fifo_segment_t *fs, svm_fifo_t **f)
fsh_slice_collect_chunks (fs->h, fss, of->chunks_at_attach);
of->chunks_at_attach = 0;
- fss_fifo_free_list_push (fs->h, fss, of->shr);
+ /* Collect hdr that was provided in return for the detached */
+ fss_fifo_free_list_push (fs->h, fss, of->hdr_at_attach);
+ of->hdr_at_attach = 0;
+
clib_mem_bulk_free (pfss->fifos, *f);
*f = 0;
}
@@ -992,21 +995,19 @@ fifo_segment_attach_fifo (fifo_segment_t *fs, svm_fifo_t **f, u32 slice_index)
if (nf->flags & SVM_FIFO_F_LL_TRACKED)
pfss_fifo_add_active_list (pfss, nf);
- /* Update allocated chunks for fifo segment and build list of
- * chunks to be freed, i.e, returned to old slice at detach */
+ /* Allocate shared hdr and chunks to be collected at detach in return
+ * for those that are being attached now */
of = *f;
- of->shr = fsh_try_alloc_fifo_hdr (fs->h, fss);
+ of->hdr_at_attach = fsh_try_alloc_fifo_hdr (fs->h, fss);
c = fs_chunk_ptr (fs->h, nf->shr->start_chunk);
of->chunks_at_attach = pc = fsh_try_alloc_chunk (fs->h, fss, c->length);
- c = fs_chunk_ptr (fs->h, c->next);
- while (c)
+ while ((c = fs_chunk_ptr (fs->h, c->next)))
{
nc = fsh_try_alloc_chunk (fs->h, fss, c->length);
pc->next = fs_chunk_sptr (fs->h, nc);
pc = nc;
- c = fs_chunk_ptr (fs->h, c->next);
}
nf->shr->slice_index = slice_index;
diff --git a/src/svm/fifo_types.h b/src/svm/fifo_types.h
index a1b57748e09..670fd2aff1a 100644
--- a/src/svm/fifo_types.h
+++ b/src/svm/fifo_types.h
@@ -110,6 +110,7 @@ typedef struct _svm_fifo
struct _svm_fifo *prev; /**< prev in active chain */
svm_fifo_chunk_t *chunks_at_attach; /**< chunks to be accounted at detach */
+ svm_fifo_shared_t *hdr_at_attach; /**< hdr to be freed at detach */
#if SVM_FIFO_TRACE
svm_fifo_trace_elem_t *trace;