diff options
author | Damjan Marion <damarion@cisco.com> | 2018-03-13 21:32:17 +0100 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2018-03-14 16:38:06 +0000 |
commit | d1274cb207a48f0142a5a6cbcd22d61c22dbc230 (patch) | |
tree | bad838ef9e2d89271f7222b341935f6d1958af8a /src/vlib/buffer.h | |
parent | 1f15facc74b1313dd680cf20eb6f490cc743b2a1 (diff) |
vlib: internal buffer manager rework
- buffer_main is no longer part of vlib_main_t
- pool of free lists is still part of vlib_main_t
- mheap is not used anymore for buffer allocation
- simple bitmap bassed buffer alloc scheme is introduced
Change-Id: I3e1e6d00e2c8122293ed0a741245eb841315a1ff
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vlib/buffer.h')
-rw-r--r-- | src/vlib/buffer.h | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/vlib/buffer.h b/src/vlib/buffer.h index bf09eb9863c..48988222de7 100644 --- a/src/vlib/buffer.h +++ b/src/vlib/buffer.h @@ -190,12 +190,6 @@ typedef struct #define vlib_prefetch_buffer_header(b,type) CLIB_PREFETCH (b, 64, type) -always_inline vlib_buffer_t * -vlib_buffer_next_contiguous (vlib_buffer_t * b, u32 buffer_bytes) -{ - return (void *) (b + 1) + buffer_bytes; -} - always_inline void vlib_buffer_struct_is_sane (vlib_buffer_t * b) { @@ -362,9 +356,8 @@ typedef struct vlib_buffer_free_list_t /* Number of data bytes for buffers in this free list. */ u32 n_data_bytes; - /* Number of buffers to allocate when we need to allocate new buffers - from physmem heap. */ - u32 min_n_buffers_each_physmem_alloc; + /* Number of buffers to allocate when we need to allocate new buffers */ + u32 min_n_buffers_each_alloc; /* Total number of buffers allocated from this free list. */ u32 n_alloc; @@ -372,16 +365,8 @@ typedef struct vlib_buffer_free_list_t /* Vector of free buffers. Each element is a byte offset into I/O heap. */ u32 *buffers; - /* global vector of free buffers, used only on main thread. - Bufers are returned to global buffers only in case when number of - buffers on free buffers list grows about threshold */ - u32 *global_buffers; - clib_spinlock_t global_buffers_lock; - - /* Memory chunks allocated for this free list - recorded here so they can be freed when free list - is deleted. */ - void **buffer_memory_allocated; + /* index of buffer pool used to get / put buffers */ + u8 buffer_pool_index; /* Free list name. */ u8 *name; @@ -431,8 +416,18 @@ typedef struct CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); uword start; uword size; + uword log2_page_size; vlib_physmem_region_index_t physmem_region; - int alloc_chunk_size; + + u32 *buffers; + + u16 buffer_size; + uword buffers_per_page; + uword n_elts; + uword n_used; + uword next_clear; + uword *bitmap; + clib_spinlock_t lock; } vlib_buffer_pool_t; typedef struct @@ -448,11 +443,6 @@ typedef struct u32 (*buffer_free_callback) (struct vlib_main_t * vm, u32 * buffers, u32 n_buffers, u32 follow_buffer_next); - /* Pool of buffer free lists. - Multiple free lists exist for packet generator which uses - separate free lists for each packet stream --- so as to avoid - initializing static data for each packet generated. */ - vlib_buffer_free_list_t *buffer_free_list_pool; #define VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX (0) #define VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES VLIB_BUFFER_DATA_SIZE @@ -467,16 +457,23 @@ typedef struct uword *buffer_known_hash; clib_spinlock_t buffer_known_hash_lockp; - /* List of free-lists needing Blue Light Special announcements */ - vlib_buffer_free_list_t **announce_list; - /* Callbacks */ vlib_buffer_callbacks_t cb; int callbacks_registered; } vlib_buffer_main_t; -u8 vlib_buffer_add_physmem_region (struct vlib_main_t *vm, - vlib_physmem_region_index_t region); +extern vlib_buffer_main_t buffer_main; + +static_always_inline vlib_buffer_pool_t * +vlib_buffer_pool_get (u8 buffer_pool_index) +{ + vlib_buffer_main_t *bm = &buffer_main; + return vec_elt_at_index (bm->buffer_pools, buffer_pool_index); +} + +u8 vlib_buffer_pool_create (struct vlib_main_t * vm, + vlib_physmem_region_index_t region, + u16 buffer_size); clib_error_t *vlib_buffer_main_init (struct vlib_main_t *vm); |