diff options
author | Florin Coras <fcoras@cisco.com> | 2021-02-25 09:57:04 -0800 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2021-02-26 15:51:00 +0000 |
commit | 9c499e3a686a2421102e3b86a3924382885e2280 (patch) | |
tree | 804634141d47448900884224f89fe6afee3c8c48 /src/svm | |
parent | 5599fc2dae024bcf150fa4b3b4584e19419f8079 (diff) |
svm: fix shared hdr migration
Avoid changing the header on attach as it may be in use. Instead, as for
chunks, allocate header to be collected on detach.
Type: fix
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ib316ecb5d61ae161032869b6f6a1863f1105a1d9
Diffstat (limited to 'src/svm')
-rw-r--r-- | src/svm/fifo_segment.c | 15 | ||||
-rw-r--r-- | src/svm/fifo_types.h | 1 |
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; |