vlib: fix code of getting numa node with specific cpu_id 95/25195/1
authorLijian.Zhang <Lijian.Zhang@arm.com>
Fri, 14 Feb 2020 07:16:49 +0000 (15:16 +0800)
committerLijian.Zhang <Lijian.Zhang@arm.com>
Mon, 17 Feb 2020 09:05:17 +0000 (17:05 +0800)
Use below sysfs files to check which numa node a specific cpu_id belongs to.

/sys/devices/system/node/online
/sys/devices/system/node/node0/cpulist
/sys/devices/system/node/node1/cpulist

Type: fix

Change-Id: I124b80b1fd4a20dd7bd76f0ae27d5ab23a3a8ff1
Signed-off-by: Lijian Zhang <Lijian.Zhang@arm.com>
src/vlib/threads.c

index 1ce4dc1..3f09054 100644 (file)
@@ -598,15 +598,30 @@ void
 vlib_get_thread_core_numa (vlib_worker_thread_t * w, unsigned cpu_id)
 {
   const char *sys_cpu_path = "/sys/devices/system/cpu/cpu";
+  const char *sys_node_path = "/sys/devices/system/node/node";
+  clib_bitmap_t *nbmp = 0, *cbmp = 0;
+  u32 node;
   u8 *p = 0;
   int core_id = -1, numa_id = -1;
 
   p = format (p, "%s%u/topology/core_id%c", sys_cpu_path, cpu_id, 0);
   clib_sysfs_read ((char *) p, "%d", &core_id);
   vec_reset_length (p);
-  p = format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path,
-             cpu_id, 0);
-  clib_sysfs_read ((char *) p, "%d", &numa_id);
+
+  /* *INDENT-OFF* */
+  clib_sysfs_read ("/sys/devices/system/node/online", "%U",
+        unformat_bitmap_list, &nbmp);
+  clib_bitmap_foreach (node, nbmp, ({
+    p = format (p, "%s%u/cpulist%c", sys_node_path, node, 0);
+    clib_sysfs_read ((char *) p, "%U", unformat_bitmap_list, &cbmp);
+    if (clib_bitmap_get (cbmp, cpu_id))
+      numa_id = node;
+    vec_reset_length (cbmp);
+    vec_reset_length (p);
+  }));
+  /* *INDENT-ON* */
+  vec_free (nbmp);
+  vec_free (cbmp);
   vec_free (p);
 
   w->core_id = core_id;