vlib: improvement to automatic core pinning 19/40919/8
authorhsandid <halsandi@cisco.com>
Wed, 22 May 2024 13:30:24 +0000 (15:30 +0200)
committerDamjan Marion <dmarion@0xa5.net>
Fri, 24 May 2024 08:21:14 +0000 (08:21 +0000)
Type: feature

If 'main-core' is not specified, the main thread is pinned
by default to the cpu it is running on during initialization.
This change does not impact manual core-pinning, which
requires the 'main-core' argument
e.g. 'cpu {main-core x corelist-workers n}.

Change-Id: I874034591bf0acf4d71b231dfbbb0f6de8fe6060
Signed-off-by: hsandid <halsandi@cisco.com>
src/vlib/threads.c
src/vpp/vnet/main.c

index 854d694..ef2c561 100644 (file)
@@ -205,6 +205,10 @@ vlib_thread_init (vlib_main_t * vm)
       avail_cpu = clib_bitmap_set (avail_cpu, c, 0);
     }
 
+  /* if main thread affinity is unspecified, set to current running cpu */
+  if (tm->main_lcore == ~0)
+    tm->main_lcore = sched_getcpu ();
+
   /* grab cpu for main thread */
   if (tm->main_lcore != ~0)
     {
@@ -1134,6 +1138,7 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
   u8 *name;
   uword *bitmap;
   u32 count;
+  int use_corelist = 0;
 
   tm->thread_registrations_by_name = hash_create_string (0, sizeof (uword));
 
@@ -1185,6 +1190,7 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
 
          tr->coremask = bitmap;
          tr->count = clib_bitmap_count_set_bits (tr->coremask);
+         use_corelist = 1;
        }
       else
        if (unformat
@@ -1214,6 +1220,9 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
        break;
     }
 
+  if (use_corelist && tm->main_lcore == ~0)
+    return clib_error_return (0, "main-core must be specified when using "
+                                "corelist-* or coremask-* attribute");
   if (tm->sched_priority != ~0)
     {
       if (tm->sched_policy == SCHED_FIFO || tm->sched_policy == SCHED_RR)
index c57efd5..dd4f4cc 100644 (file)
@@ -329,6 +329,10 @@ defaulted:
 
   unformat_free (&input);
 
+  /* if main thread affinity is unspecified, set to current running cpu */
+  if (main_core == ~0)
+    main_core = sched_getcpu ();
+
   /* set process affinity for main thread */
   if (main_core != ~0)
     {