64 lines
2.5 KiB
Diff
64 lines
2.5 KiB
Diff
|
# Commit 1320b8100c2ed390fc640557a050f5c700d8338d
|
||
|
# Date 2013-11-15 17:38:10 +0100
|
||
|
# Author Nate Studer <nate.studer@dornerworks.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
credit: Update other parameters when setting tslice_ms
|
||
|
|
||
|
Add a utility function to update the rest of the timeslice
|
||
|
accounting fields when updating the timeslice of the
|
||
|
credit scheduler, so that capped CPUs behave correctly.
|
||
|
|
||
|
Before this patch changing the timeslice to a value higher
|
||
|
than the default would result in a domain not utilizing
|
||
|
its full capacity and changing the timeslice to a value
|
||
|
lower than the default would result in a domain exceeding
|
||
|
its capacity.
|
||
|
|
||
|
Signed-off-by: Nate Studer <nate.studer@dornerworks.com>
|
||
|
Reviewed-by: Dario Faggioli <dario.faggioli@citrix.com>
|
||
|
Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com>
|
||
|
|
||
|
--- a/xen/common/sched_credit.c
|
||
|
+++ b/xen/common/sched_credit.c
|
||
|
@@ -1073,6 +1073,17 @@ csched_dom_cntl(
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static inline void
|
||
|
+__csched_set_tslice(struct csched_private *prv, unsigned timeslice)
|
||
|
+{
|
||
|
+ prv->tslice_ms = timeslice;
|
||
|
+ prv->ticks_per_tslice = CSCHED_TICKS_PER_TSLICE;
|
||
|
+ if ( prv->tslice_ms < prv->ticks_per_tslice )
|
||
|
+ prv->ticks_per_tslice = 1;
|
||
|
+ prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
|
||
|
+ prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
|
||
|
+}
|
||
|
+
|
||
|
static int
|
||
|
csched_sys_cntl(const struct scheduler *ops,
|
||
|
struct xen_sysctl_scheduler_op *sc)
|
||
|
@@ -1091,7 +1102,7 @@ csched_sys_cntl(const struct scheduler *
|
||
|
|| params->ratelimit_us < XEN_SYSCTL_SCHED_RATELIMIT_MIN))
|
||
|
|| MICROSECS(params->ratelimit_us) > MILLISECS(params->tslice_ms) )
|
||
|
goto out;
|
||
|
- prv->tslice_ms = params->tslice_ms;
|
||
|
+ __csched_set_tslice(prv, params->tslice_ms);
|
||
|
prv->ratelimit_us = params->ratelimit_us;
|
||
|
/* FALLTHRU */
|
||
|
case XEN_SYSCTL_SCHEDOP_getinfo:
|
||
|
@@ -1903,12 +1914,7 @@ csched_init(struct scheduler *ops)
|
||
|
sched_credit_tslice_ms = CSCHED_DEFAULT_TSLICE_MS;
|
||
|
}
|
||
|
|
||
|
- prv->tslice_ms = sched_credit_tslice_ms;
|
||
|
- prv->ticks_per_tslice = CSCHED_TICKS_PER_TSLICE;
|
||
|
- if ( prv->tslice_ms < prv->ticks_per_tslice )
|
||
|
- prv->ticks_per_tslice = 1;
|
||
|
- prv->tick_period_us = prv->tslice_ms * 1000 / prv->ticks_per_tslice;
|
||
|
- prv->credits_per_tslice = CSCHED_CREDITS_PER_MSEC * prv->tslice_ms;
|
||
|
+ __csched_set_tslice(prv, sched_credit_tslice_ms);
|
||
|
|
||
|
if ( MICROSECS(sched_ratelimit_us) > MILLISECS(sched_credit_tslice_ms) )
|
||
|
{
|