vppinfra: make default hugepage size configurable 66/33766/2
authorDamjan Marion <damarion@cisco.com>
Tue, 21 Sep 2021 09:38:04 +0000 (11:38 +0200)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 22 Sep 2021 08:29:23 +0000 (08:29 +0000)
i.e.

memory {
  default-hugepage-size 1G
}

Type: improvement
Change-Id: I822afb51712ae92f4e4992b8ffa33dcb15ccaef1
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vpp/conf/startup.conf
src/vpp/vnet/main.c
src/vppinfra/linux/mem.c
src/vppinfra/mem.h

index d96a430..ee10faa 100644 (file)
@@ -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 {
index bf1eb7a..695c358 100644 (file)
@@ -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 ();
index 036890f..3b752cf 100644 (file)
@@ -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)
index 1cab0ae..dfe8de9 100644 (file)
@@ -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);