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

[Xen-changelog] [xen master] sched_rt: serialize vcpu data access



commit 802b778e9aad55ebc202f581046ad978b8620c2e
Author:     Meng Xu <mengxu@xxxxxxxxxxxxx>
AuthorDate: Wed Nov 12 12:36:04 2014 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Nov 12 12:36:04 2014 +0100

    sched_rt: serialize vcpu data access
    
    Fix the following two issues in rtds scheduler:
    1) The runq queue lock is not grabbed when rt_update_deadline is
    called in rt_alloc_vdata function, which may cause race condition;
    Solution: Move call to rt_update_deadline from _alloc to _insert;
    Note: rt_alloc_vdata does not need grab the runq lock, because only one
    cpu will allocate the rt_vcpu; before the rt_vcpu is inserted into the
    runq, no more than one cpu operates on the rt_vcpu.
    
    2) rt_vcpu_remove should grab the runq lock before remove the vcpu
    from runq; otherwise, race condition may happen.
    Solution: Add lock in rt_vcpu_remove().
    
    Reported-by: Jan Beulich <jbeulich@xxxxxxxx>
    Signed-off-by: Meng Xu <mengxu@xxxxxxxxxxxxx>
    Reviewed-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
    Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
    Release-Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 xen/common/sched_rt.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c
index 8251e41..e70d6c7 100644
--- a/xen/common/sched_rt.c
+++ b/xen/common/sched_rt.c
@@ -508,7 +508,6 @@ static void *
 rt_alloc_vdata(const struct scheduler *ops, struct vcpu *vc, void *dd)
 {
     struct rt_vcpu *svc;
-    s_time_t now = NOW();
 
     /* Allocate per-VCPU info */
     svc = xzalloc(struct rt_vcpu);
@@ -526,10 +525,6 @@ rt_alloc_vdata(const struct scheduler *ops, struct vcpu 
*vc, void *dd)
     if ( !is_idle_vcpu(vc) )
         svc->budget = RTDS_DEFAULT_BUDGET;
 
-    ASSERT( now >= svc->cur_deadline );
-
-    rt_update_deadline(now, svc);
-
     return svc;
 }
 
@@ -552,11 +547,15 @@ static void
 rt_vcpu_insert(const struct scheduler *ops, struct vcpu *vc)
 {
     struct rt_vcpu *svc = rt_vcpu(vc);
+    s_time_t now = NOW();
 
     /* not addlocate idle vcpu to dom vcpu list */
     if ( is_idle_vcpu(vc) )
         return;
 
+    if ( now >= svc->cur_deadline )
+        rt_update_deadline(now, svc);
+
     if ( !__vcpu_on_q(svc) && vcpu_runnable(vc) && !vc->is_running )
         __runq_insert(ops, svc);
 
@@ -573,11 +572,14 @@ rt_vcpu_remove(const struct scheduler *ops, struct vcpu 
*vc)
 {
     struct rt_vcpu * const svc = rt_vcpu(vc);
     struct rt_dom * const sdom = svc->sdom;
+    spinlock_t *lock;
 
     BUG_ON( sdom == NULL );
 
+    lock = vcpu_schedule_lock_irq(vc);
     if ( __vcpu_on_q(svc) )
         __q_remove(svc);
+    vcpu_schedule_unlock_irq(lock, vc);
 
     if ( !is_idle_vcpu(vc) )
         list_del_init(&svc->sdom_elem);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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