X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Ffifo_segment.c;h=986778dfe82a31e08ffdbc46ad6af3258dd3fc57;hb=eafb5db63f20975076de8e35932f1ed306a2743e;hp=9f1e46c9df690b5fd33c7625975bf71017ff6f8e;hpb=cbb5e824afc3f6de0663e7b9a201d4c281c36ec0;p=vpp.git diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c index 9f1e46c9df6..986778dfe82 100644 --- a/src/svm/fifo_segment.c +++ b/src/svm/fifo_segment.c @@ -811,6 +811,8 @@ fifo_segment_cleanup (fifo_segment_t *fs) for (slice_index = 0; slice_index < fs->n_slices; slice_index++) clib_mem_bulk_destroy (fs->slices[slice_index].fifos); + vec_free (fs->slices); + vec_foreach (fs->mqs, mq) vec_free (mq->rings); @@ -969,7 +971,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 +997,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;