[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC][PATCH 1/4] sched: more accurate credit scheduling
By applying this patch, the credit scheduler subtracts accurately credit consumed and sets correctly priority. CSCHED_CREDITS_PER_TICK is changed from 100 to 10000, because vcpu's credit is subtracted in csched_schedule(). The difference between this patch and last patch is that start_time variable was moved from csched_vcpu structure to csched_pcpu structure. Best regards, Naoki Nishiguchi diff -r 6595393a3d28 xen/common/sched_credit.c --- a/xen/common/sched_credit.c Tue Dec 09 16:28:02 2008 +0000 +++ b/xen/common/sched_credit.c Tue Dec 16 19:15:18 2008 +0900 @@ -42,7 +42,7 @@ #define CSCHED_MSECS_PER_TICK 10 #define CSCHED_MSECS_PER_TSLICE \ (CSCHED_MSECS_PER_TICK * CSCHED_TICKS_PER_TSLICE) -#define CSCHED_CREDITS_PER_TICK 100 +#define CSCHED_CREDITS_PER_TICK 10000 #define CSCHED_CREDITS_PER_TSLICE \ (CSCHED_CREDITS_PER_TICK * CSCHED_TICKS_PER_TSLICE) #define CSCHED_CREDITS_PER_ACCT \ @@ -188,6 +188,7 @@ struct csched_pcpu { uint32_t runq_sort_last; struct timer ticker; unsigned int tick; + s_time_t start_time; }; /* @@ -545,11 +546,6 @@ csched_vcpu_acct(unsigned int cpu) svc->pri = CSCHED_PRI_TS_UNDER; /* - * Update credits - */ - atomic_sub(CSCHED_CREDITS_PER_TICK, &svc->credit); - - /* * Put this VCPU and domain back on the active list if it was * idling. * @@ -1168,12 +1164,27 @@ csched_schedule(s_time_t now) { const int cpu = smp_processor_id(); struct list_head * const runq = RUNQ(cpu); + struct csched_pcpu * const spc = CSCHED_PCPU(cpu); struct csched_vcpu * const scurr = CSCHED_VCPU(current); struct csched_vcpu *snext; struct task_slice ret; + s_time_t passed = now - spc->start_time; + int consumed; CSCHED_STAT_CRANK(schedule); CSCHED_VCPU_CHECK(current); + + /* + * Update credit + */ + consumed = ( passed + + (MILLISECS(CSCHED_MSECS_PER_TSLICE) / + CSCHED_CREDITS_PER_TSLICE - 1) + ) / + ( MILLISECS(CSCHED_MSECS_PER_TSLICE) / + CSCHED_CREDITS_PER_TSLICE ); + if ( consumed > 0 && !is_idle_vcpu(current) ) + atomic_sub(consumed, &scurr->credit); /* * Select next runnable local VCPU (ie top of local runq) @@ -1217,6 +1228,8 @@ csched_schedule(s_time_t now) */ ret.time = MILLISECS(CSCHED_MSECS_PER_TSLICE); ret.task = snext->vcpu; + + spc->start_time = now; CSCHED_VCPU_CHECK(ret.task); return ret; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |