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>
---
xen/common/sched/rt.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/xen/common/sched/rt.c b/xen/common/sched/rt.c
index 960a8033e2..1f8d074884 100644
--- a/xen/common/sched/rt.c
+++ b/xen/common/sched/rt.c
@@ -1080,15 +1080,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 */
--
2.35.3