[XEN] Fix credit scheduler cap mechanism not to over park VCPUs
authorEmmanuel Ackaouy <ack@xensource.com>
Wed, 1 Nov 2006 19:44:34 +0000 (19:44 +0000)
committerEmmanuel Ackaouy <ack@xensource.com>
Wed, 1 Nov 2006 19:44:34 +0000 (19:44 +0000)
We used to park a capped VCPU when it had ran its fair share, even
if the fair share was below its cap. With this change, make sure
we only park once a VCPU has overrun its actual cap.
We could also try to make the capping mechanism more accurate by
parking and unparking at a finer granularity (currently done on
30ms boundaries) but that'll be for a different time.
Signed-off-by: Emmanuel Ackaouy <ack@xensource.com>
xen/common/sched_credit.c

index a813c03f20b477cffc315e29ee7af795a82efa5e..9dec930b80e2f7ace8b02de06d56d278c97bd2e7 100644 (file)
@@ -721,6 +721,7 @@ csched_acct(void)
     uint32_t weight_left;
     uint32_t credit_fair;
     uint32_t credit_peak;
+    uint32_t credit_cap;
     int credit_balance;
     int credit_xtra;
     int credit;
@@ -751,6 +752,7 @@ csched_acct(void)
     weight_left = weight_total;
     credit_balance = 0;
     credit_xtra = 0;
+    credit_cap = 0U;
 
     list_for_each_safe( iter_sdom, next_sdom, &csched_priv.active_sdom )
     {
@@ -778,13 +780,15 @@ csched_acct(void)
                              (weight_total - 1)
                            ) / weight_total;
         }
+
         if ( sdom->cap != 0U )
         {
-            uint32_t credit_cap;
-            
             credit_cap = ((sdom->cap * CSCHED_CREDITS_PER_ACCT) + 99) / 100;
             if ( credit_cap < credit_peak )
                 credit_peak = credit_cap;
+
+            credit_cap = ( credit_cap + ( sdom->active_vcpu_count - 1 )
+                         ) / sdom->active_vcpu_count;
         }
 
         credit_fair = ( ( credit_total * sdom->weight) + (weight_total - 1)
@@ -840,10 +844,10 @@ csched_acct(void)
              */
             if ( credit < 0 )
             {
-                if ( sdom->cap == 0U )
-                    svc->pri = CSCHED_PRI_TS_OVER;
-                else
+                if ( sdom->cap != 0U && credit < -credit_cap )
                     svc->pri = CSCHED_PRI_TS_PARKED;
+                else
+                    svc->pri = CSCHED_PRI_TS_OVER;
 
                 if ( credit < -CSCHED_CREDITS_PER_TSLICE )
                 {