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

Re: [Xen-devel] [PATCH for Xen 4.5 v3 2/2] xen: serialize vcpu data in sched_rt.c



On Mon, Nov 10, 2014 at 9:11 PM, Meng Xu <mengxu@xxxxxxxxxxxxx> wrote:
> 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().
>
> Signed-off-by: Meng Xu <mengxu@xxxxxxxxxxxxx>
> Reviewed-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>

Great, thanks Meng!

Reviewed-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>



> ---
>  xen/common/sched_rt.c |   12 +++++++-----
>  1 file 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);
> --
> 1.7.9.5
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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