]> xenbits.xensource.com Git - people/dwmw2/xen.git/commitdiff
xen/sched: try harder to find a runnable unit in rt_schedule()
authorJuergen Gross <jgross@suse.com>
Fri, 2 Dec 2022 09:29:19 +0000 (10:29 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 2 Dec 2022 09:29:19 +0000 (10:29 +0100)
Instead of directly falling back to the idle unit in case the top
unit from the run queue happened to be not runnable, consult the run
queue again.

Suggested-by: Dario Faggioli <dfaggioli@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Dario Faggioli <dfaggioli@suse.com>
xen/common/sched/rt.c

index 05988cbd3de430313dbe04fc779acf7673de50d8..d443cd5831b94bfdd96d968fc6224df5d31bd45b 100644 (file)
@@ -1101,15 +1101,20 @@ rt_schedule(const struct scheduler *ops, struct sched_unit *currunit,
     }
     else
     {
-        snext = runq_pick(ops, cpumask_of(sched_cpu), cur_cpu);
-
-        if ( snext == NULL )
-            snext = rt_unit(sched_idle_unit(sched_cpu));
-        else if ( !unit_runnable_state(snext->unit) )
+        while ( true )
         {
+            snext = runq_pick(ops, cpumask_of(sched_cpu), cur_cpu);
+
+            if ( snext == NULL )
+            {
+                snext = rt_unit(sched_idle_unit(sched_cpu));
+                break;
+            }
+            if ( unit_runnable_state(snext->unit) )
+                break;
+
             q_remove(snext);
             replq_remove(ops, snext);
-            snext = rt_unit(sched_idle_unit(sched_cpu));
         }
 
         /* if scurr has higher priority and budget, still pick scurr */