diff options
author | Damjan Marion <damarion@cisco.com> | 2017-08-29 00:15:35 +0200 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2017-08-30 16:27:59 +0000 |
commit | b6a8ed7fa0709bbf8e091826803f50e6330689cf (patch) | |
tree | c2ef25e9c05c4a2685d3b207b82929c932cfaeff /src/vlib/buffer.c | |
parent | 50958959b57c9c2d3fc72ae7588c53d1804aeb86 (diff) |
Thread safe internal buffer manager, take two
First attempt to make internal buffer manager thread safe was not
succesfull, so trying again. This time with more testing.
Change-Id: I01b8385a9c26d233934a3339255ea4bd31c865ac
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vlib/buffer.c')
-rw-r--r-- | src/vlib/buffer.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/vlib/buffer.c b/src/vlib/buffer.c index a5c955c76e6..908368c080b 100644 --- a/src/vlib/buffer.c +++ b/src/vlib/buffer.c @@ -396,6 +396,8 @@ vlib_buffer_create_free_list_helper (vlib_main_t * vm, hash_set (bm->free_list_by_size, f->n_data_bytes, f->index); } + clib_spinlock_init (&f->global_buffers_lock); + for (i = 1; i < vec_len (vlib_mains); i++) { vlib_buffer_main_t *wbm = vlib_mains[i]->buffer_main; @@ -509,6 +511,7 @@ fill_free_list (vlib_main_t * vm, vlib_buffer_free_list_t * fl, uword min_free_buffers) { vlib_buffer_t *buffers, *b; + vlib_buffer_free_list_t *mfl; int n, n_bytes, i; u32 *bi; u32 n_remaining, n_alloc, n_this_chunk; @@ -518,6 +521,22 @@ fill_free_list (vlib_main_t * vm, if (n <= 0) return min_free_buffers; + mfl = vlib_buffer_get_free_list (vlib_mains[0], fl->index); + if (vec_len (mfl->global_buffers) > 0) + { + int n_copy, n_left; + clib_spinlock_lock (&mfl->global_buffers_lock); + n_copy = clib_min (vec_len (mfl->global_buffers), n); + n_left = vec_len (mfl->global_buffers) - n_copy; + vec_add_aligned (fl->buffers, mfl->global_buffers + n_left, n_copy, + CLIB_CACHE_LINE_BYTES); + _vec_len (mfl->global_buffers) = n_left; + clib_spinlock_unlock (&mfl->global_buffers_lock); + n = min_free_buffers - vec_len (fl->buffers); + if (n <= 0) + return min_free_buffers; + } + /* Always allocate round number of buffers. */ n = round_pow2 (n, CLIB_CACHE_LINE_BYTES / sizeof (u32)); |