From mboxrd@z Thu Jan 1 00:00:00 1970 From: NISHIGUCHI Naoki Subject: [RFC][PATCH 1/4] sched: more accurate credit scheduling Date: Thu, 18 Dec 2008 12:00:54 +0900 Message-ID: <4949BCE6.3010803@jp.fujitsu.com> References: <4949BC2C.4060302@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060507000805050002000606" Return-path: In-Reply-To: <4949BC2C.4060302@jp.fujitsu.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: George Dunlap , xen-devel@lists.xensource.com Cc: Ian.Pratt@eu.citrix.com, disheng.su@intel.com, aviv@neocleus.com, keir.fraser@eu.citrix.com, sakaia@jp.fujitsu.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------060507000805050002000606 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------060507000805050002000606 Content-Type: text/x-patch; name="credit_rev2_1_accurate.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="credit_rev2_1_accurate.patch" 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; --------------060507000805050002000606 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------060507000805050002000606--