diff options
author | Damjan Marion <damarion@cisco.com> | 2020-09-17 10:40:44 +0200 |
---|---|---|
committer | Damjan Marion <damarion@cisco.com> | 2020-09-17 21:38:37 +0200 |
commit | bdbb0c5436b52b4dc6c35d05f227cdf934306d83 (patch) | |
tree | 1dd54d3763d44b3e1eabda6f592c766c31993549 /src/vpp | |
parent | e6b83059af3365ab12bbe93655a7dea6f691dbda (diff) |
stats: configurable page size
Type: improvement
Change-Id: I9973bce20a0a2a8a7e227cf96518de5b79374425
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vpp')
-rw-r--r-- | src/vpp/conf/startup.conf | 1 | ||||
-rw-r--r-- | src/vpp/stats/stat_segment.c | 34 | ||||
-rw-r--r-- | src/vpp/stats/stat_segment.h | 1 |
3 files changed, 23 insertions, 13 deletions
diff --git a/src/vpp/conf/startup.conf b/src/vpp/conf/startup.conf index 12679da778c..0be10d5ba19 100644 --- a/src/vpp/conf/startup.conf +++ b/src/vpp/conf/startup.conf @@ -186,6 +186,7 @@ cpu { # socket-name <filename>, name of the stats segment socket # defaults to /run/vpp/stats.sock # size <nnn>[KMG], size of the stats segment, defaults to 32mb + # page-size <nnn>, page size, ie. 2m, defaults to 4k # per-node-counters on | off, defaults to none # update-interval <f64-seconds>, sets the segment scrape / update interval # } diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c index 8255b16c010..968c0566b3f 100644 --- a/src/vpp/stats/stat_segment.c +++ b/src/vpp/stats/stat_segment.c @@ -316,32 +316,37 @@ vlib_map_stat_segment_init (void) stat_segment_main_t *sm = &stat_segment_main; stat_segment_shared_header_t *shared_header; void *oldheap; - ssize_t memory_size; + uword memory_size, sys_page_sz; int mfd; - char *mem_name = "stat_segment_test"; - void *memaddr; + char *mem_name = "stat segment"; + void *heap, *memaddr; memory_size = sm->memory_size; if (memory_size == 0) memory_size = STAT_SEGMENT_DEFAULT_SIZE; - /* Create shared memory segment */ - if ((mfd = memfd_create (mem_name, 0)) < 0) - return clib_error_return (0, "stat segment memfd_create failure"); + if (sm->log2_page_sz == CLIB_MEM_PAGE_SZ_UNKNOWN) + sm->log2_page_sz = CLIB_MEM_PAGE_SZ_DEFAULT; + + mfd = clib_mem_vm_create_fd (sm->log2_page_sz, mem_name); /* Set size */ if ((ftruncate (mfd, memory_size)) == -1) return clib_error_return (0, "stat segment ftruncate failure"); - if ((memaddr = - mmap (NULL, memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, - 0)) == MAP_FAILED) + if (mfd == -1) + return clib_error_return (0, "stat segment memory fd failure: %U", + format_clib_error, clib_mem_get_last_error ()); + + memaddr = clib_mem_vm_map_shared (0, memory_size, mfd, 0, mem_name); + + if (memaddr == CLIB_MEM_VM_MAP_FAILED) return clib_error_return (0, "stat segment mmap failure"); - void *heap; - heap = - create_mspace_with_base (((u8 *) memaddr) + getpagesize (), - memory_size - getpagesize (), 1 /* locked */ ); + sys_page_sz = clib_mem_get_page_size (); + + heap = create_mspace_with_base (((u8 *) memaddr) + sys_page_sz, memory_size + - sys_page_sz, 1 /* locked */ ); mspace_disable_expand (heap); sm->heap = heap; sm->memfd = mfd; @@ -904,6 +909,9 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input) else if (unformat (input, "size %U", unformat_memory_size, &sm->memory_size)) ; + else if (unformat (input, "page-size %U", + unformat_log2_page_size, &sm->log2_page_sz)) + ; else if (unformat (input, "per-node-counters on")) sm->node_counters_enabled = 1; else if (unformat (input, "per-node-counters off")) diff --git a/src/vpp/stats/stat_segment.h b/src/vpp/stats/stat_segment.h index a88067154f7..a048fa5b8ca 100644 --- a/src/vpp/stats/stat_segment.h +++ b/src/vpp/stats/stat_segment.h @@ -93,6 +93,7 @@ typedef struct clib_socket_t *socket; u8 *socket_name; ssize_t memory_size; + clib_mem_page_sz_t log2_page_sz; u8 node_counters_enabled; void *last; void *heap; |