All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Meng Xu <mengxu@cis.upenn.edu>, xen-devel@lists.xen.org
Cc: ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com,
	george.dunlap@eu.citrix.com, dario.faggioli@citrix.com,
	ian.jackson@eu.citrix.com, xumengpanda@gmail.com,
	JBeulich@suse.com
Subject: Re: [PATCH] xen: sanity check input and serialize vcpu data in sched_rt.c
Date: Fri, 26 Sep 2014 19:49:03 +0100	[thread overview]
Message-ID: <5425B51F.6010706@citrix.com> (raw)
In-Reply-To: <1411756183-2255-1-git-send-email-mengxu@cis.upenn.edu>

On 26/09/14 19:29, Meng Xu wrote:
> Sanity check input params in rt_dom_cntl();
> Serialize rt_dom_cntl() against the global lock;
> Move the call to rt_update_deadline() from _alloc to _insert.
>
> Signed-off-by: Meng Xu <mengxu@cis.upenn.edu>
> ---
>  xen/common/sched_rt.c |   27 ++++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c
> index 6c8faeb..6cd2648 100644
> --- a/xen/common/sched_rt.c
> +++ b/xen/common/sched_rt.c
> @@ -369,11 +369,15 @@ __runq_insert(const struct scheduler *ops, struct rt_vcpu *svc)
>      struct rt_private *prv = rt_priv(ops);
>      struct list_head *runq = rt_runq(ops);
>      struct list_head *iter;
> +    s_time_t now = NOW();
>  
>      ASSERT( spin_is_locked(&prv->lock) );
>  
>      ASSERT( !__vcpu_on_q(svc) );
>  
> +    if ( now >= svc->cur_deadline )
> +        rt_update_deadline(now, svc);
> +
>      /* add svc to runq if svc still has budget */
>      if ( svc->cur_budget > 0 )
>      {
> @@ -528,8 +532,6 @@ rt_alloc_vdata(const struct scheduler *ops, struct vcpu *vc, void *dd)
>  
>      ASSERT( now >= svc->cur_deadline );
>  
> -    rt_update_deadline(now, svc);
> -
>      return svc;
>  }
>  
> @@ -577,7 +579,12 @@ rt_vcpu_remove(const struct scheduler *ops, struct vcpu *vc)
>      BUG_ON( sdom == NULL );
>  
>      if ( __vcpu_on_q(svc) )
> +    {
> +        spinlock_t *lock;
> +        lock = vcpu_schedule_lock_irq(vc);
>          __q_remove(svc);
> +        vcpu_schedule_unlock_irq(lock, vc);
> +    }

This is still racy.  You need to include __vcpu_on_q() in the locked
region or you can get linked list corruption from concurrent attempts to
remove the same svc.

lock = vcpu_schedule_lock_irq(vc);
if  ( __vcpu_on_q(svc) )
    __q_remove(svc);
vcpu_schedule_unlock_irq(lock, vc);

~Andrew

>  
>      if ( !is_idle_vcpu(vc) )
>          list_del_init(&svc->sdom_elem);
> @@ -733,7 +740,6 @@ __repl_update(const struct scheduler *ops, s_time_t now)
>          if ( now < svc->cur_deadline )
>              break;
>  
> -        rt_update_deadline(now, svc);
>          /* reinsert the vcpu if its deadline is updated */
>          __q_remove(svc);
>          __runq_insert(ops, svc);
> @@ -744,7 +750,6 @@ __repl_update(const struct scheduler *ops, s_time_t now)
>          svc = __q_elem(iter);
>          if ( now >= svc->cur_deadline )
>          {
> -            rt_update_deadline(now, svc);
>              __q_remove(svc); /* remove from depleted queue */
>              __runq_insert(ops, svc); /* add to runq */
>          }
> @@ -979,9 +984,6 @@ rt_vcpu_wake(const struct scheduler *ops, struct vcpu *vc)
>          return;
>      }
>  
> -    if ( now >= svc->cur_deadline)
> -        rt_update_deadline(now, svc);
> -
>      /* insert svc to runq/depletedq because svc is not in queue now */
>      __runq_insert(ops, svc);
>  
> @@ -1042,11 +1044,14 @@ rt_dom_cntl(
>      struct domain *d,
>      struct xen_domctl_scheduler_op *op)
>  {
> +    struct rt_private *prv = rt_priv(ops);
>      struct rt_dom * const sdom = rt_dom(d);
>      struct rt_vcpu *svc;
>      struct list_head *iter;
> +    unsigned long flags;
>      int rc = 0;
>  
> +    spin_lock_irqsave(&prv->lock, flags);
>      switch ( op->cmd )
>      {
>      case XEN_DOMCTL_SCHEDOP_getinfo:
> @@ -1055,6 +1060,12 @@ rt_dom_cntl(
>          op->u.rtds.budget = svc->budget / MICROSECS(1);
>          break;
>      case XEN_DOMCTL_SCHEDOP_putinfo:
> +        if ( op->u.rtds.period == 0 || op->u.rtds.budget == 0 )
> +        {
> +            rc = -EINVAL;
> +            break;
> +        }
> +
>          list_for_each( iter, &sdom->vcpu )
>          {
>              struct rt_vcpu * svc = list_entry(iter, struct rt_vcpu, sdom_elem);
> @@ -1064,6 +1075,8 @@ rt_dom_cntl(
>          break;
>      }
>  
> +    spin_unlock_irqrestore(&prv->lock, flags);
> +
>      return rc;
>  }
>  

  reply	other threads:[~2014-09-26 18:49 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-20 22:13 [PATCH for 4.5 v4 1/4] xen: add real time scheduler rtds Meng Xu
2014-09-22 17:13 ` Dario Faggioli
2014-09-23 11:47 ` George Dunlap
2014-09-24 12:09 ` Jan Beulich
2014-09-24 13:14   ` Dario Faggioli
2014-09-24 13:25     ` Meng Xu
2014-09-24 13:33       ` George Dunlap
2014-09-24 13:32     ` Jan Beulich
2014-09-24 13:35       ` George Dunlap
2014-09-24 13:41         ` Dario Faggioli
2014-09-24 13:45           ` George Dunlap
2014-09-26 18:29         ` [PATCH] xen: sanity check input and serialize vcpu data in sched_rt.c Meng Xu
2014-09-26 18:49           ` Andrew Cooper [this message]
2014-09-29  8:09           ` Jan Beulich
2014-09-29 13:26             ` Dario Faggioli
2014-09-30 21:21             ` Meng Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5425B51F.6010706@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=dario.faggioli@citrix.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=mengxu@cis.upenn.edu \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=xumengpanda@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.