xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Tianyang Chen <tiche@seas.upenn.edu>
To: Meng Xu <xumengpanda@gmail.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	Dario Faggioli <dario.faggioli@citrix.com>,
	George Dunlap <george.dunlap@citrix.com>,
	Dagaen Golomb <dgolomb@seas.upenn.edu>,
	Meng Xu <mengxu@cis.upenn.edu>
Subject: Re: [PATCH v5][RFC]xen: sched: convert RTDS from time to event driven model
Date: Wed, 17 Feb 2016 20:55:34 -0500	[thread overview]
Message-ID: <56C52496.7020306@seas.upenn.edu> (raw)
In-Reply-To: <CAENZ-+kkgRz3WRycRL1BrX5iB1L2MT8W6Xd+Lj6qX9v+jxn7Ug@mail.gmail.com>



On 2/15/2016 10:55 PM, Meng Xu wrote:
> Hi Tianyang,
>
> Thanks for the patch! Great work and really quick action! :-)
> I will just comment on something I quickly find out and would look
> forwarding to Dario's comment.
>
> On Mon, Feb 8, 2016 at 11:33 PM, Tianyang Chen <tiche@seas.upenn.edu
> <mailto:tiche@seas.upenn.edu>> wrote:
>  > Changes since v4:
>  >     removed unnecessary replenishment queue checks in vcpu_wake()
>  >     extended replq_remove() to all cases in vcpu_sleep()
>  >     used _deadline_queue_insert() helper function for both queues
>  >     _replq_insert() and _replq_remove() program timer internally
>  >
>  > Changes since v3:
>  >     removed running queue.
>  >     added repl queue to keep track of repl events.
>  >     timer is now per scheduler.
>  >     timer is init on a valid cpu in a cpupool.
>  >
>  > Signed-off-by: Tianyang Chen <tiche@seas.upenn.edu
> <mailto:tiche@seas.upenn.edu>>
>  > Signed-off-by: Meng Xu <mengxu@cis.upenn.edu
> <mailto:mengxu@cis.upenn.edu>>
>  > Signed-off-by: Dagaen Golomb <dgolomb@seas.upenn.edu
> <mailto:dgolomb@seas.upenn.edu>>
>  > ---
>  >  xen/common/sched_rt.c |  337
> ++++++++++++++++++++++++++++++++++++-------------
>  >  1 file changed, 251 insertions(+), 86 deletions(-)
>  >
>  > diff --git a/xen/common/sched_rt.c b/xen/common/sched_rt.c
>  > index 2e5430f..1f0bb7b 100644
>  > --- a/xen/common/sched_rt.c
>  > +++ b/xen/common/sched_rt.c
>  > @@ -16,6 +16,7 @@
>  >  #include <xen/delay.h>
>  >  #include <xen/event.h>
>  >  #include <xen/time.h>
>  > +#include <xen/timer.h>
>  >  #include <xen/perfc.h>
>  >  #include <xen/sched-if.h>
>  >  #include <xen/softirq.h>
>  > @@ -87,7 +88,7 @@
>  >  #define RTDS_DEFAULT_BUDGET     (MICROSECS(4000))
>  >
>  >  #define UPDATE_LIMIT_SHIFT      10
>  > -#define MAX_SCHEDULE            (MILLISECS(1))
>  > +
>  >  /*
>  >   * Flags
>  >   */
>  > @@ -142,6 +143,12 @@ static cpumask_var_t *_cpumask_scratch;
>  >   */
>  >  static unsigned int nr_rt_ops;
>  >
>  > +/* handler for the replenishment timer */
>  > +static void repl_handler(void *data);
>  > +
>  > +/* checks if a timer is active or not */
>  > +bool_t active_timer(struct timer* t);
>  > +
>  >  /*
>  >   * Systme-wide private data, include global RunQueue/DepletedQ
>  >   * Global lock is referenced by schedule_data.schedule_lock from all
>  > @@ -152,7 +159,9 @@ struct rt_private {
>  >      struct list_head sdom;      /* list of availalbe domains, used
> for dump */
>  >      struct list_head runq;      /* ordered list of runnable vcpus */
>  >      struct list_head depletedq; /* unordered list of depleted vcpus */
>  > +    struct list_head replq;     /* ordered list of vcpus that need
> replenishment */
>  >      cpumask_t tickled;          /* cpus been tickled */
>  > +    struct timer *repl_timer;   /* replenishment timer */
>  >  };
>  >
>  >  /*
>  > @@ -160,6 +169,7 @@ struct rt_private {
>  >   */
>  >  struct rt_vcpu {
>  >      struct list_head q_elem;    /* on the runq/depletedq list */
>  > +    struct list_head replq_elem;/* on the repl event list */
>  >
>  >      /* Up-pointers */
>  >      struct rt_dom *sdom;
>  > @@ -213,8 +223,14 @@ static inline struct list_head
> *rt_depletedq(const struct scheduler *ops)
>  >      return &rt_priv(ops)->depletedq;
>  >  }
>  >
>  > +static inline struct list_head *rt_replq(const struct scheduler *ops)
>  > +{
>  > +    return &rt_priv(ops)->replq;
>  > +}
>  > +
>  >  /*
>  > - * Queue helper functions for runq and depletedq
>  > + * Queue helper functions for runq, depletedq
>  > + * and replenishment event queue
>  >   */
>  >  static int
>  >  __vcpu_on_q(const struct rt_vcpu *svc)
>  > @@ -228,6 +244,18 @@ __q_elem(struct list_head *elem)
>  >      return list_entry(elem, struct rt_vcpu, q_elem);
>  >  }
>  >
>  > +static struct rt_vcpu *
>  > +__replq_elem(struct list_head *elem)
>  > +{
>  > +    return list_entry(elem, struct rt_vcpu, replq_elem);
>  > +}
>  > +
>  > +static int
>  > +__vcpu_on_replq(const struct rt_vcpu *svc)
>  > +{
>  > +   return !list_empty(&svc->replq_elem);
>  > +}
>  > +
>  >  /*
>  >   * Debug related code, dump vcpu/cpu information
>  >   */
>  > @@ -288,7 +316,7 @@ rt_dump_pcpu(const struct scheduler *ops, int cpu)
>  >  static void
>  >  rt_dump(const struct scheduler *ops)
>  >  {
>  > -    struct list_head *runq, *depletedq, *iter;
>  > +    struct list_head *runq, *depletedq, *replq, *iter;
>  >      struct rt_private *prv = rt_priv(ops);
>  >      struct rt_vcpu *svc;
>  >      struct rt_dom *sdom;
>  > @@ -301,6 +329,7 @@ rt_dump(const struct scheduler *ops)
>  >
>  >      runq = rt_runq(ops);
>  >      depletedq = rt_depletedq(ops);
>  > +    replq = rt_replq(ops);
>  >
>  >      printk("Global RunQueue info:\n");
>  >      list_for_each( iter, runq )
>  > @@ -316,6 +345,13 @@ rt_dump(const struct scheduler *ops)
>  >          rt_dump_vcpu(ops, svc);
>  >      }
>  >
>  > +    printk("Global Replenishment Event info:\n");
>  > +    list_for_each( iter, replq )
>  > +    {
>  > +        svc = __replq_elem(iter);
>  > +        rt_dump_vcpu(ops, svc);
>  > +    }
>  > +
>  >      printk("Domain info:\n");
>  >      list_for_each( iter, &prv->sdom )
>  >      {
>  > @@ -388,6 +424,66 @@ __q_remove(struct rt_vcpu *svc)
>  >  }
>  >
>  >  /*
>  > + * Removing a vcpu from the replenishment queue could
>  > + * re-program the timer for the next replenishment event
>  > + * if the timer is currently active
>  > + */
>  > +static inline void
>  > +__replq_remove(const struct scheduler *ops, struct rt_vcpu *svc)
>  > +{
>  > +    struct rt_private *prv = rt_priv(ops);
>  > +    struct list_head *replq = rt_replq(ops);
>  > +    struct timer* repl_timer = prv->repl_timer;
>  > +
>  > +    if ( __vcpu_on_replq(svc) )
>  > +    {
>  > +        /*
>  > +         * disarm the timer if removing the first replenishment event
>  > +         * which is going to happen next
>  > +         */
>  > +        if( active_timer(repl_timer) )
>  > +        {
>  > +            struct rt_vcpu *next_repl = __replq_elem(replq->next);
>  > +
>  > +            if( next_repl->cur_deadline == svc->cur_deadline )
>  > +                repl_timer->expires = 0;
>  > +
>  > +            list_del_init(&svc->replq_elem);
>  > +
>  > +            /* re-arm the timer for the next replenishment event */
>  > +            if( !list_empty(replq) )
>  > +            {
>  > +                struct rt_vcpu *svc_next = __replq_elem(replq->next);
>  > +                set_timer(repl_timer, svc_next->cur_deadline);
>  > +            }
>  > +        }
>  > +
>
> This blank line should go away.. It is quite misleading. At very first
> glance, I thought it is the else for if ( __vcpu_on_replq(svc) );
> But after second read, I found it is actually for the if(
> a
ctive_timer(repl_timer) )
>

Sure

>  > @@ -880,9 +981,11 @@ rt_schedule(const struct scheduler *ops,
> s_time_t now, bool_t tasklet_work_sched
>  >              snext->vcpu->processor = cpu;
>  >              ret.migrated = 1;
>  >          }
>  > +
>  > +        ret.time = snext->budget; /* invoke the scheduler next time */
>  > +
>  >      }
>  >
>  > -    ret.time = MIN(snext->budget, MAX_SCHEDULE); /* sched quantum */
>  >      ret.task = snext->vcpu;
>  >
>  >      /* TRACE */
>  > @@ -914,7 +1017,7 @@ static void
>  >  rt_vcpu_sleep(const struct scheduler *ops, struct vcpu *vc)
>  >  {
>  >      struct rt_vcpu * const svc = rt_vcpu(vc);
>  > -
>  > +
>
> Next patch should avoid this. You may have some trailing space in the line.
> git has some command to mark the trailing whitespace.
> You can have a look at this post:
> http://stackoverflow.com/questions/5257553/coloring-white-space-in-git-diffs-output
>

ok I will check that out.

Dario: Is there anything else we need to pick up in this patch?

Thanks,
Tianyang

  reply	other threads:[~2016-02-18  1:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-09  4:33 [PATCH v5][RFC]xen: sched: convert RTDS from time to event driven model Tianyang Chen
2016-02-16  3:55 ` Meng Xu
2016-02-18  1:55   ` Tianyang Chen [this message]
2016-02-24 15:23 ` Tianyang Chen
2016-02-25  2:02 ` Dario Faggioli
2016-02-25  6:15   ` Tianyang Chen
2016-02-25 10:34     ` Dario Faggioli
2016-02-25 17:29       ` Tianyang Chen
2016-02-25 17:51         ` Dario Faggioli

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=56C52496.7020306@seas.upenn.edu \
    --to=tiche@seas.upenn.edu \
    --cc=dario.faggioli@citrix.com \
    --cc=dgolomb@seas.upenn.edu \
    --cc=george.dunlap@citrix.com \
    --cc=mengxu@cis.upenn.edu \
    --cc=xen-devel@lists.xenproject.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).