Scheduler policy & priority config, few minor fixes (VPP-425) 63/3163/3
authorPavel Kotucek <pkotucek@cisco.com>
Fri, 23 Sep 2016 06:54:14 +0000 (08:54 +0200)
committerDamjan Marion <dmarion.lists@gmail.com>
Tue, 27 Sep 2016 19:35:24 +0000 (19:35 +0000)
- scheduler-prio -> scheduler-priority
- improve formatting of "show threads" output
- add description to "startup.conf"
- bail out of priority is set without rr or fifo policy

Change-Id: Idf897f7603d989d6c2d0093eea89c5d1653eaa8c
Signed-off-by: Pavel Kotucek <pkotucek@cisco.com>
vlib/vlib/threads.c
vlib/vlib/threads_cli.c
vpp/conf/startup.conf

index 67c57a6..e371699 100644 (file)
@@ -1093,7 +1093,7 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
            (input, "scheduler-policy %U", unformat_sched_policy,
             &tm->sched_policy))
        ;
-      else if (unformat (input, "scheduler-prio %u", &tm->sched_priority))
+      else if (unformat (input, "scheduler-priority %u", &tm->sched_priority))
        ;
       else if (unformat (input, "%s %u", &name, &count))
        {
@@ -1111,10 +1111,9 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
        break;
     }
 
-  if (tm->sched_policy != ~0)
+  if (tm->sched_priority != ~0)
     {
-      if (tm->sched_priority != ~0
-         && (tm->sched_policy == SCHED_FIFO || tm->sched_policy == SCHED_RR))
+      if (tm->sched_policy == SCHED_FIFO || tm->sched_policy == SCHED_RR)
        {
          u32 prio_max = sched_get_priority_max (tm->sched_policy);
          u32 prio_min = sched_get_priority_min (tm->sched_policy);
@@ -1124,7 +1123,12 @@ cpu_config (vlib_main_t * vm, unformat_input_t * input)
            tm->sched_priority = prio_min;
        }
       else
-       tm->sched_priority = 0;
+       {
+         return clib_error_return
+           (0,
+            "scheduling priority (%d) is not allowed for `normal` scheduling policy",
+            tm->sched_priority);
+       }
     }
   tr = tm->next;
 
index 179906b..e788b04 100644 (file)
 #include <vlib/threads.h>
 #include <linux/sched.h>
 
-u8 *
-format_sched_policy (u8 * s, va_list * args)
+static u8 *
+format_sched_policy_and_priority (u8 * s, va_list * args)
 {
-  u32 i = va_arg (*args, u32);
+  long i = va_arg (*args, long);
+  struct sched_param sched_param;
   u8 *t = 0;
 
-  switch (i)
+  switch (sched_getscheduler (i))
     {
 #define _(v,f,str) case SCHED_POLICY_##f: t = (u8 *) str; break;
       foreach_sched_policy
 #undef _
     }
-  s = format (s, "%-6s ", t);
-  return s;
+  if (sched_getparam (i, &sched_param) == 0)
+    return format (s, "%s (%d)", t, sched_param.sched_priority);
+  else
+    return format (s, "%s (n/a)", t);
 }
 
 static clib_error_t *
@@ -42,8 +45,8 @@ show_threads_fn (vlib_main_t * vm,
   vlib_worker_thread_t *w;
   int i;
 
-  vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-7s%-9s%-7s%-7s%-7s%-10s",
-                  "ID", "Name", "Type", "LWP", "Policy", "Priority",
+  vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-25s%-7s%-7s%-7s%-10s",
+                  "ID", "Name", "Type", "LWP", "Sched Policy (Priority)",
                   "lcore", "Core", "Socket", "State");
 
 #if !defined(__powerpc64__)
@@ -57,13 +60,7 @@ show_threads_fn (vlib_main_t * vm,
                     w->name ? w->name : (u8 *) "",
                     w->registration ? w->registration->name : "", w->lwp);
 
-      line =
-       format (line, "%U", format_sched_policy, sched_getscheduler (w->lwp));
-
-      struct sched_param sched_param;
-      line = format (line, "%8d ",
-                    (!sched_getparam (w->lwp, &sched_param)) ?
-                    sched_param.sched_priority : -1);
+      line = format (line, "%-25U", format_sched_policy_and_priority, w->lwp);
 
 #if DPDK==1
       int lcore = w->dpdk_lcore_id;
index f9f4690..84a0264 100644 (file)
@@ -20,6 +20,16 @@ cpu {
        ## Set logical CPU core(s) where worker threads are running
        ## by default there is no worker threads started
        # corelist-workers 2-3,18-19
+
+       ## Set scheduling policy and priority of main and worker threads
+
+       ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH)
+       ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR)
+       # scheduler-policy fifo
+
+       ## Scheduling priority is used only for "real-time policies (fifo and rr),
+       ## and has to be in the range of priorities supported for a particular policy
+       # scheduler-priority 50
 }
 
 dpdk {