vppinfra: get_mempolicy instead of move_pages for mem init 87/41287/6
authorFlorin Coras <[email protected]>
Mon, 22 Jul 2024 19:09:53 +0000 (12:09 -0700)
committerDamjan Marion <[email protected]>
Tue, 23 Jul 2024 07:41:56 +0000 (07:41 +0000)
Use get_mempolicy instead of move_pages to detect numa nodes. Avoids
issues whereby move_pages could stall if another rt thread spin waits
instead of yielding the cpu.

Type: improvement

Signed-off-by: Tatsushi Kanemoto <[email protected]>
Signed-off-by: Florin Coras <[email protected]>
Change-Id: I7db2073ed82bb0b1e707130d9bd8f54bea333840

src/vppinfra/linux/mem.c

index 21aaa55..17b4412 100644 (file)
@@ -101,11 +101,13 @@ legacy_get_log2_default_hugepage_size (void)
 void
 clib_mem_main_init (void)
 {
+  unsigned long nodemask = 0, maxnode = CLIB_MAX_NUMAS;
+  unsigned long flags = MPOL_F_MEMS_ALLOWED;
   clib_mem_main_t *mm = &clib_mem_main;
   long sysconf_page_size;
   uword page_size;
-  void *va;
-  int fd;
+  void *va = 0;
+  int fd, mode;
 
   if (mm->log2_page_sz != CLIB_MEM_PAGE_SZ_UNKNOWN)
     return;
@@ -131,23 +133,8 @@ clib_mem_main_init (void)
   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);
-  if (va == MAP_FAILED)
-    return;
-
-  if (mlock (va, page_size))
-    goto done;
-
-  for (int i = 0; i < CLIB_MAX_NUMAS; i++)
-    {
-      int status;
-      if (syscall (__NR_move_pages, 0, 1, &va, &i, &status, 0) == 0)
-       mm->numa_node_bitmap |= 1ULL << i;
-    }
-
-done:
-  munmap (va, page_size);
+  if (syscall (__NR_get_mempolicy, &mode, &nodemask, maxnode, va, flags) == 0)
+    mm->numa_node_bitmap = nodemask;
 }
 
 __clib_export u64