[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging] xen/sched: fix race in RTDS scheduler



commit 73c62927f64ecb48f27d06176befdf76b879f340
Author:     Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Fri Oct 21 12:32:23 2022 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Fri Oct 21 12:32:23 2022 +0200

    xen/sched: fix race in RTDS scheduler
    
    When a domain gets paused the unit runnable state can change to "not
    runnable" without the scheduling lock being involved. This means that
    a specific scheduler isn't involved in this change of runnable state.
    
    In the RTDS scheduler this can result in an inconsistency in case a
    unit is losing its "runnable" capability while the RTDS scheduler's
    scheduling function is active. RTDS will remove the unit from the run
    queue, but doesn't do so for the replenish queue, leading to hitting
    an ASSERT() in replq_insert() later when the domain is unpaused again.
    
    Fix that by removing the unit from the replenish queue as well in this
    case.
    
    Fixes: 7c7b407e7772 ("xen/sched: introduce unit_runnable_state()")
    Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
    Acked-by: Dario Faggioli <dfaggioli@xxxxxxxx>
    Release-acked-by: Henry Wang <Henry.Wang@xxxxxxx>
---
 xen/common/sched/rt.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/xen/common/sched/rt.c b/xen/common/sched/rt.c
index d6de25531b..960a8033e2 100644
--- a/xen/common/sched/rt.c
+++ b/xen/common/sched/rt.c
@@ -1087,6 +1087,7 @@ rt_schedule(const struct scheduler *ops, struct 
sched_unit *currunit,
         else if ( !unit_runnable_state(snext->unit) )
         {
             q_remove(snext);
+            replq_remove(ops, snext);
             snext = rt_unit(sched_idle_unit(sched_cpu));
         }
 
--
generated by git-patchbot for /home/xen/git/xen.git#staging



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.