X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Ffifo_segment.c;h=986778dfe82a31e08ffdbc46ad6af3258dd3fc57;hb=af2cc6425;hp=e3e6caaa6ccdaac0a4cf9702349ae7dffd5884e8;hpb=255554fd7e75a803569e311c28e8ec8da8e7a286;p=vpp.git diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c index e3e6caaa6cc..986778dfe82 100644 --- a/src/svm/fifo_segment.c +++ b/src/svm/fifo_segment.c @@ -418,6 +418,14 @@ fifo_segment_get_segment (fifo_segment_main_t * sm, u32 segment_index) return pool_elt_at_index (sm->segments, segment_index); } +fifo_segment_t * +fifo_segment_get_segment_if_valid (fifo_segment_main_t *sm, u32 segment_index) +{ + if (pool_is_free_index (sm->segments, segment_index)) + return 0; + return pool_elt_at_index (sm->segments, segment_index); +} + void fifo_segment_info (fifo_segment_t * seg, char **address, size_t * size) { @@ -783,9 +791,8 @@ fs_fifo_alloc (fifo_segment_t *fs, u32 slice_index) } void -fs_fifo_free (fifo_segment_t *fs, svm_fifo_t *f) +fs_fifo_free (fifo_segment_t *fs, svm_fifo_t *f, u32 slice_index) { - u32 slice_index = f->shr->slice_index; fifo_slice_private_t *pfss; if (CLIB_DEBUG) @@ -804,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); @@ -932,11 +941,17 @@ fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f) f->ooo_enq = f->ooo_deq = 0; f->prev = 0; - fs_fifo_free (fs, f); + fs_fifo_free (fs, f, f->shr->slice_index); fsh_active_fifos_update (fsh, -1); } +void +fifo_segment_free_client_fifo (fifo_segment_t *fs, svm_fifo_t *f) +{ + fs_fifo_free (fs, f, 0 /* clients attach fifos in slice 0 */); +} + void fifo_segment_detach_fifo (fifo_segment_t *fs, svm_fifo_t **f) { @@ -956,6 +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; + /* 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; } @@ -978,20 +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->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; @@ -1541,8 +1559,8 @@ format_fifo_segment (u8 * s, va_list * args) format_memory_size, chunk_bytes, chunk_bytes, format_memory_size, est_chunk_bytes, est_chunk_bytes, format_memory_size, tracked_cached_bytes, tracked_cached_bytes); - s = format (s, "%Ufifo active: %u hdr free bytes: %U (%u) \n", - format_white_space, indent + 2, fsh->n_active_fifos, + s = format (s, "%Ufifo active: %u hdr free: %u bytes: %U (%u) \n", + format_white_space, indent + 2, fsh->n_active_fifos, free_fifos, format_memory_size, fifo_hdr, fifo_hdr); s = format (s, "%Usegment usage: %.2f%% (%U / %U) virt: %U status: %s\n", format_white_space, indent + 2, usage, format_memory_size,