Set main thread affinity before main heap is allocated 36/13336/3
authorDamjan Marion <damarion@cisco.com>
Tue, 3 Jul 2018 15:24:45 +0000 (17:24 +0200)
committerDave Barach <openvpp@barachs.net>
Tue, 3 Jul 2018 18:41:57 +0000 (18:41 +0000)
Change-Id: I524909570fc1736f51fd437d6d30566c461139bd
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/vlib/threads.c
src/vpp/vnet/main.c

index 487c501..4e4f13e 100644 (file)
@@ -337,6 +337,12 @@ vlib_thread_init (vlib_main_t * vm)
 
   avail_cpu = clib_bitmap_dup (tm->cpu_core_bitmap);
 
+  /* by default we skip core 0, unless it is the only one available */
+  if (tm->skip_cores == ~0 && clib_bitmap_count_set_bits (avail_cpu) == 1)
+    tm->skip_cores = 0;
+  else
+    tm->skip_cores = 1;
+
   /* skip cores */
   for (i = 0; i < tm->skip_cores; i++)
     {
@@ -372,13 +378,6 @@ vlib_thread_init (vlib_main_t * vm)
     {
       tm->cb.vlib_thread_set_lcore_cb (0, tm->main_lcore);
     }
-  else
-    {
-      cpu_set_t cpuset;
-      CPU_ZERO (&cpuset);
-      CPU_SET (tm->main_lcore, &cpuset);
-      pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
-    }
 
   /* as many threads as stacks... */
   vec_validate_aligned (vlib_worker_threads, vec_len (vlib_thread_stacks) - 1,
@@ -1262,6 +1261,7 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
   tm->n_thread_stacks = 1;     /* account for main thread */
   tm->sched_policy = ~0;
   tm->sched_priority = ~0;
+  tm->skip_cores = ~0;
 
   tr = tm->next;
 
index 6e136e1..9a804eb 100644 (file)
  * limitations under the License.
  */
 
+#define _GNU_SOURCE
+#include <pthread.h>
+#include <sched.h>
+
 #include <vppinfra/cpu.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
@@ -103,6 +107,8 @@ main (int argc, char *argv[])
   uword main_heap_size = (1ULL << 30);
   u8 *sizep;
   u32 size;
+  int main_core = 1;
+  cpu_set_t cpuset;
 
 #if __x86_64__
   CLIB_UNUSED (const char *msg)
@@ -234,10 +240,25 @@ main (int argc, char *argv[])
          else if (*sizep == 'm' || *sizep == 'M')
            main_heap_size <<= 20;
        }
+      else if (!strncmp (argv[i], "main-core", 9))
+       {
+         if (i < (argc - 1))
+           {
+             errno = 0;
+             unsigned long x = strtol (argv[++i], 0, 0);
+             if (errno == 0)
+               main_core = x;
+           }
+       }
     }
 
 defaulted:
 
+  /* set process affinity for main thread */
+  CPU_ZERO (&cpuset);
+  CPU_SET (main_core, &cpuset);
+  pthread_setaffinity_np (pthread_self (), sizeof (cpu_set_t), &cpuset);
+
   /* Set up the plugin message ID allocator right now... */
   vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);