aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vlib/main.h4
-rw-r--r--src/vlib/threads.c3
-rwxr-xr-xsrc/vlib/unix/main.c2
-rw-r--r--src/vppinfra/cpu.h17
4 files changed, 25 insertions, 1 deletions
diff --git a/src/vlib/main.h b/src/vlib/main.h
index 474756bebd6..8a25ce8b4cc 100644
--- a/src/vlib/main.h
+++ b/src/vlib/main.h
@@ -172,8 +172,10 @@ typedef struct vlib_main_t
/* Hash table to record which init functions have been called. */
uword *init_functions_called;
- /* to compare with node runtime */
+ /* thread, cpu and numa_node indices */
u32 thread_index;
+ u32 cpu_index;
+ u32 numa_node;
/* List of init functions to call, setup by constructors */
_vlib_init_function_list_elt_t *init_function_registrations;
diff --git a/src/vlib/threads.c b/src/vlib/threads.c
index 3e184e3e1cd..45e4d89b7ab 100644
--- a/src/vlib/threads.c
+++ b/src/vlib/threads.c
@@ -1681,6 +1681,9 @@ vlib_worker_thread_fn (void *arg)
ASSERT (vm->thread_index == vlib_get_thread_index ());
+ vm->cpu_index = clib_get_current_cpu_index ();
+ vm->numa_node = clib_get_current_numa_node ();
+
vlib_worker_thread_init (w);
clib_time_init (&vm->clib_time);
clib_mem_set_heap (w->thread_mheap);
diff --git a/src/vlib/unix/main.c b/src/vlib/unix/main.c
index 08f0506fbc2..4d6519ed857 100755
--- a/src/vlib/unix/main.c
+++ b/src/vlib/unix/main.c
@@ -671,6 +671,8 @@ vlib_unix_main (int argc, char *argv[])
__os_thread_index = 0;
vm->thread_index = 0;
+ vm->cpu_index = clib_get_current_cpu_index ();
+ vm->numa_node = clib_get_current_numa_node ();
i = clib_calljmp (thread0, (uword) vm,
(void *) (vlib_thread_stacks[0] +
diff --git a/src/vppinfra/cpu.h b/src/vppinfra/cpu.h
index 6dc0a23e467..8341eaf0e54 100644
--- a/src/vppinfra/cpu.h
+++ b/src/vppinfra/cpu.h
@@ -16,6 +16,7 @@
#ifndef included_clib_cpu_h
#define included_clib_cpu_h
+#include <sys/syscall.h>
#include <vppinfra/format.h>
/*
@@ -99,6 +100,22 @@ _ (asimddp, 20) \
_ (sha512, 21) \
_ (sve, 22)
+static inline u32
+clib_get_current_cpu_index ()
+{
+ unsigned cpu, node;
+ syscall (__NR_getcpu, &cpu, &node, 0);
+ return cpu;
+}
+
+static inline u32
+clib_get_current_numa_node ()
+{
+ unsigned cpu, node;
+ syscall (__NR_getcpu, &cpu, &node, 0);
+ return node;
+}
+
#if defined(__x86_64__)
#include "cpuid.h"