[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().

Best regards,
Naoki Nishiguchi
diff -r a00eb6595d3c xen/common/sched_credit.c
--- a/xen/common/sched_credit.c Sat Nov 29 09:07:52 2008 +0000
+++ b/xen/common/sched_credit.c Fri Dec 05 17:57:07 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     \
@@ -201,6 +201,7 @@ struct csched_vcpu {
     atomic_t credit;
     uint16_t flags;
     int16_t pri;
+    s_time_t start_time;
 #ifdef CSCHED_STATS
     struct {
         int credit_last;
@@ -543,11 +544,6 @@ csched_vcpu_acct(unsigned int cpu)
      */
     if ( svc->pri == CSCHED_PRI_TS_BOOST )
         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
@@ -1171,9 +1167,23 @@ csched_schedule(s_time_t now)
     struct csched_vcpu * const scurr = CSCHED_VCPU(current);
     struct csched_vcpu *snext;
     struct task_slice ret;
+    s_time_t passed = now - scurr->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 +1227,8 @@ csched_schedule(s_time_t now)
      */
     ret.time = MILLISECS(CSCHED_MSECS_PER_TSLICE);
     ret.task = snext->vcpu;
+
+    snext->start_time = now;
 
     CSCHED_VCPU_CHECK(ret.task);
     return ret;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.