diff options
author | Dave Barach <dave@barachs.net> | 2020-01-21 12:34:55 -0500 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2020-02-05 23:38:56 +0000 |
commit | a690fdbfe179e0ea65818c03b52535bf9210efd0 (patch) | |
tree | 345200955b873dbc2f5bb6857b1acc7966ffed90 /src/vppinfra/vec.c | |
parent | 86e8bce44f43c1f3c50a3397f9ab850f484f4cad (diff) |
vppinfra: numa vector placement support
Type: feature
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I7e7d95a089dd849c1f01ecea84529d8dbf239f21
Diffstat (limited to 'src/vppinfra/vec.c')
-rw-r--r-- | src/vppinfra/vec.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/vppinfra/vec.c b/src/vppinfra/vec.c index 16372e9ef22..2ee78952d19 100644 --- a/src/vppinfra/vec.c +++ b/src/vppinfra/vec.c @@ -44,16 +44,24 @@ void * vec_resize_allocate_memory (void *v, word length_increment, uword data_bytes, - uword header_bytes, uword data_align) + uword header_bytes, uword data_align, + uword numa_id) { vec_header_t *vh = _vec_find (v); uword old_alloc_bytes, new_alloc_bytes; void *old, *new; + void *oldheap; header_bytes = vec_header_bytes (header_bytes); data_bytes += header_bytes; + if (PREDICT_FALSE (numa_id != VEC_NUMA_UNSPECIFIED)) + { + oldheap = clib_mem_get_per_cpu_heap (); + clib_mem_set_per_cpu_heap (clib_mem_get_per_numa_heap (numa_id)); + } + if (!v) { new = clib_mem_alloc_aligned_at_offset (data_bytes, data_align, header_bytes, 1 /* yes, call os_out_of_memory */ @@ -64,6 +72,9 @@ vec_resize_allocate_memory (void *v, CLIB_MEM_POISON (new + data_bytes, new_alloc_bytes - data_bytes); v = new + header_bytes; _vec_len (v) = length_increment; + _vec_numa (v) = numa_id; + if (PREDICT_FALSE (numa_id != VEC_NUMA_UNSPECIFIED)) + clib_mem_set_per_cpu_heap (oldheap); return v; } @@ -79,6 +90,8 @@ vec_resize_allocate_memory (void *v, if (data_bytes <= old_alloc_bytes) { CLIB_MEM_UNPOISON (v, data_bytes); + if (PREDICT_FALSE (numa_id != VEC_NUMA_UNSPECIFIED)) + clib_mem_set_per_cpu_heap (oldheap); return v; } @@ -110,6 +123,10 @@ vec_resize_allocate_memory (void *v, memset (v + old_alloc_bytes, 0, new_alloc_bytes - old_alloc_bytes); CLIB_MEM_POISON (new + data_bytes, new_alloc_bytes - data_bytes); + _vec_numa ((v + header_bytes)) = numa_id; + if (PREDICT_FALSE (numa_id != VEC_NUMA_UNSPECIFIED)) + clib_mem_set_per_cpu_heap (oldheap); + return v + header_bytes; } |