[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen, credit2: Avoid extra c2t calcuation in csched_runtime
# HG changeset patch # User George Dunlap <george.dunlap@xxxxxxxxxxxxx> # Date 1359040980 0 # Node ID e9222438074a73cb3c93cf21d53a6d9224a48e4c # Parent 14b0f2e95cb21a94fa154bec56e7925c01e81b56 xen,credit2: Avoid extra c2t calcuation in csched_runtime csched_runtime() needs to call the ct2() function to change credits into time. The c2t() function, however, is expensive, as it requires an integer division. c2t() was being called twice, once for the main vcpu's credit and once for the difference between its credit and the next in the queue. But this is unnecessary; by calculating in "credit" first, we can make it so that we just do one conversion later in the algorithm. This also adds more documentation describing the intended algorithm. The effect of the new code should be the same as the old code. Spotted-by: Jan Beulich <JBeulich@xxxxxxxx> Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c --- a/xen/common/sched_credit2.c +++ b/xen/common/sched_credit2.c @@ -1505,31 +1505,42 @@ csched_dom_destroy(const struct schedule static s_time_t csched_runtime(const struct scheduler *ops, int cpu, struct csched_vcpu *snext) { - s_time_t time = CSCHED_MAX_TIMER; + s_time_t rt_credit, time; /* Proposed runtime measured in credits */ struct csched_runqueue_data *rqd = RQD(ops, cpu); struct list_head *runq = &rqd->runq; if ( is_idle_vcpu(snext->vcpu) ) return CSCHED_MAX_TIMER; - /* Basic time */ - time = c2t(rqd, snext->credit, snext); + /* General algorithm: + * 1) Run until snext's credit will be 0 + * 2) But if someone is waiting, run until snext's credit is equal + * to his + * 3) But never run longer than MAX_TIMER or shorter than MIN_TIMER. + */ - /* Next guy on runqueue */ + /* 1) Basic time: Run until credit is 0. */ + rt_credit = snext->credit; + + /* 2) If there's someone waiting whose credit is positive, + * run until your credit ~= his */ if ( ! list_empty(runq) ) { - struct csched_vcpu *svc = __runq_elem(runq->next); - s_time_t ntime; + struct csched_vcpu *swait = __runq_elem(runq->next); - if ( ! is_idle_vcpu(svc->vcpu) ) + if ( ! is_idle_vcpu(swait->vcpu) + && swait->credit > 0 ) { - ntime = c2t(rqd, snext->credit - svc->credit, snext); - - if ( time > ntime ) - time = ntime; + rt_credit = snext->credit - swait->credit; } } + /* FIXME: See if we can eliminate this conversion if we know time + * will be outside (MIN,MAX). Probably requires pre-calculating + * credit values of MIN,MAX per vcpu, since each vcpu burns credit + * at a different rate. */ + time = c2t(rqd, rt_credit, snext); + /* Check limits */ if ( time < CSCHED_MIN_TIMER ) time = CSCHED_MIN_TIMER; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |