vppinfra: make default hugepage size configurable
i.e. memory { default-hugepage-size 1G } Type: improvement Change-Id: I822afb51712ae92f4e4992b8ffa33dcb15ccaef1 Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:

committed by
Andrew Yourtchenko

parent
266929f2e4
commit
ff011b2560
@@ -51,6 +51,8 @@ socksvr {
|
||||
## special keyword 'default-hugepage' will use system default hugepage
|
||||
## size
|
||||
# main-heap-page-size 1G
|
||||
## Set the default huge page size.
|
||||
# default-hugepage-size 1G
|
||||
#}
|
||||
|
||||
cpu {
|
||||
|
@@ -111,6 +111,7 @@ main (int argc, char *argv[])
|
||||
u8 *sizep;
|
||||
u32 size;
|
||||
clib_mem_page_sz_t main_heap_log2_page_sz = CLIB_MEM_PAGE_SZ_DEFAULT;
|
||||
clib_mem_page_sz_t default_log2_hugepage_sz = CLIB_MEM_PAGE_SZ_UNKNOWN;
|
||||
unformat_input_t input, sub_input;
|
||||
u8 *s = 0, *v = 0;
|
||||
int main_core = 1;
|
||||
@@ -291,6 +292,10 @@ defaulted:
|
||||
unformat_log2_page_size,
|
||||
&main_heap_log2_page_sz))
|
||||
;
|
||||
else if (unformat (&sub_input, "default-hugepage-size %U",
|
||||
unformat_log2_page_size,
|
||||
&default_log2_hugepage_sz))
|
||||
;
|
||||
else
|
||||
{
|
||||
fformat (stderr, "unknown 'memory' config input '%U'\n",
|
||||
@@ -329,6 +334,9 @@ defaulted:
|
||||
/* Figure out which numa runs the main thread */
|
||||
__os_numa_index = clib_get_current_numa_node ();
|
||||
|
||||
if (default_log2_hugepage_sz != CLIB_MEM_PAGE_SZ_UNKNOWN)
|
||||
clib_mem_set_log2_default_hugepage_size (default_log2_hugepage_sz);
|
||||
|
||||
/* and use the main heap as that numa's numa heap */
|
||||
clib_mem_set_per_numa_heap (main_heap);
|
||||
vlib_main_init ();
|
||||
|
@@ -75,40 +75,6 @@ map_unlock ()
|
||||
clib_atomic_release (&clib_mem_main.map_lock);
|
||||
}
|
||||
|
||||
__clib_export uword
|
||||
clib_mem_get_default_hugepage_size (void)
|
||||
{
|
||||
unformat_input_t input;
|
||||
static u32 size = 0;
|
||||
int fd;
|
||||
|
||||
if (size)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* If the kernel doesn't support hugepages, /proc/meminfo won't
|
||||
* say anything about it. Use the regular page size as a default.
|
||||
*/
|
||||
size = clib_mem_get_page_size () / 1024;
|
||||
|
||||
if ((fd = open ("/proc/meminfo", 0)) == -1)
|
||||
return 0;
|
||||
|
||||
unformat_init_clib_file (&input, fd);
|
||||
|
||||
while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
|
||||
{
|
||||
if (unformat (&input, "Hugepagesize:%_%u kB", &size))
|
||||
;
|
||||
else
|
||||
unformat_skip_line (&input);
|
||||
}
|
||||
unformat_free (&input);
|
||||
close (fd);
|
||||
done:
|
||||
return 1024ULL * size;
|
||||
}
|
||||
|
||||
static clib_mem_page_sz_t
|
||||
legacy_get_log2_default_hugepage_size (void)
|
||||
{
|
||||
@@ -156,6 +122,8 @@ clib_mem_main_init ()
|
||||
else /* likely kernel older than 4.14 */
|
||||
mm->log2_default_hugepage_sz = legacy_get_log2_default_hugepage_size ();
|
||||
|
||||
mm->log2_sys_default_hugepage_sz = mm->log2_default_hugepage_sz;
|
||||
|
||||
/* numa nodes */
|
||||
va = mmap (0, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE |
|
||||
MAP_ANONYMOUS, -1, 0);
|
||||
@@ -270,7 +238,7 @@ clib_mem_vm_create_fd (clib_mem_page_sz_t log2_page_size, char *fmt, ...)
|
||||
|
||||
if (log2_page_size == mm->log2_page_sz)
|
||||
log2_page_size = CLIB_MEM_PAGE_SZ_DEFAULT;
|
||||
else if (log2_page_size == mm->log2_default_hugepage_sz)
|
||||
else if (log2_page_size == mm->log2_sys_default_hugepage_sz)
|
||||
log2_page_size = CLIB_MEM_PAGE_SZ_DEFAULT_HUGE;
|
||||
|
||||
switch (log2_page_size)
|
||||
|
@@ -130,9 +130,12 @@ typedef struct
|
||||
/* log2 system page size */
|
||||
clib_mem_page_sz_t log2_page_sz;
|
||||
|
||||
/* log2 system default hugepage size */
|
||||
/* log2 default hugepage size */
|
||||
clib_mem_page_sz_t log2_default_hugepage_sz;
|
||||
|
||||
/* log2 system default hugepage size */
|
||||
clib_mem_page_sz_t log2_sys_default_hugepage_sz;
|
||||
|
||||
/* bitmap of available numa nodes */
|
||||
u32 numa_node_bitmap;
|
||||
|
||||
@@ -470,15 +473,26 @@ clib_mem_get_page_size (void)
|
||||
return 1ULL << clib_mem_main.log2_page_sz;
|
||||
}
|
||||
|
||||
static_always_inline void
|
||||
clib_mem_set_log2_default_hugepage_size (clib_mem_page_sz_t log2_page_sz)
|
||||
{
|
||||
clib_mem_main.log2_default_hugepage_sz = log2_page_sz;
|
||||
}
|
||||
|
||||
static_always_inline clib_mem_page_sz_t
|
||||
clib_mem_get_log2_default_hugepage_size ()
|
||||
{
|
||||
return clib_mem_main.log2_default_hugepage_sz;
|
||||
}
|
||||
|
||||
static_always_inline uword
|
||||
clib_mem_get_default_hugepage_size (void)
|
||||
{
|
||||
return 1ULL << clib_mem_main.log2_default_hugepage_sz;
|
||||
}
|
||||
|
||||
int clib_mem_vm_create_fd (clib_mem_page_sz_t log2_page_size, char *fmt, ...);
|
||||
uword clib_mem_get_fd_page_size (int fd);
|
||||
uword clib_mem_get_default_hugepage_size (void);
|
||||
clib_mem_page_sz_t clib_mem_get_fd_log2_page_size (int fd);
|
||||
uword clib_mem_vm_reserve (uword start, uword size,
|
||||
clib_mem_page_sz_t log2_page_sz);
|
||||
|
Reference in New Issue
Block a user