From: Emmanuel Ackaouy Date: Wed, 1 Nov 2006 19:44:34 +0000 (+0000) Subject: [XEN] Fix credit scheduler cap mechanism not to over park VCPUs X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15567^2~144 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c62ecba43fd728522ef6670c82e746aa2253ecb2;p=xen.git [XEN] Fix credit scheduler cap mechanism not to over park VCPUs 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 --- diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c index a813c03f20..9dec930b80 100644 --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -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 ) {