[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 2/4] tools: libxl/xl: allow to get/set Credit1's vcpu_migration_delay
Make it possible to get and set a (Credit1) scheduler's vCPU migration delay via the SCHEDOP sysctl, from both libxl and xl (no change needed in libxc). Signed-off-by: Dario Faggioli <dfaggioli@xxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- Changes from v2: * drop a redundant scinfo->vcpu_migr_delay_us != 0 check Changes from v1: * add missing 'break', fix using wrong variable in xl_sched.c. --- docs/man/xl.pod.1.in | 11 +++++++++++ tools/libxl/libxl.h | 7 +++++++ tools/libxl/libxl_sched.c | 9 +++++++++ tools/libxl/libxl_types.idl | 1 + tools/xl/xl_cmdtable.c | 1 + tools/xl/xl_sched.c | 23 ++++++++++++++++------- 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in index 7fd35c9ae7..48da2052cc 100644 --- a/docs/man/xl.pod.1.in +++ b/docs/man/xl.pod.1.in @@ -1046,6 +1046,17 @@ we will allow a higher-priority VM to pre-empt it. The default value is 1000 microseconds (1ms). Valid range is 100 to 500000 (500ms). The ratelimit length must be lower than the timeslice length. +=item B<-m DELAY>, B<--migration_delay_us=DELAY> + +Migration delay specifies for how long a vCPU, after it stopped running should +be considered "cache-hot". Basically, if less than DELAY us passed since when +the vCPU was executing on a CPU, it is likely that most of the vCPU's working +set is still in the CPU's cache, and therefore the vCPU is not migrated. + +Default is 0. Maximum is 100 ms. This can be effective at preventing vCPUs +to bounce among CPUs too quickly, but, at the same time, the scheduler stops +being fully work-conserving. + =back B<COMBINATION> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index eca0ea2c50..edd244278a 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -299,6 +299,13 @@ */ #define LIBXL_HAVE_SCHED_CREDIT2_PARAMS 1 +/* + * LIBXL_HAVE_SCHED_CREDIT_MIGR_DELAY indicates that there is a field + * in libxl_sched_credit_params called vcpu_migr_delay_us which controls + * the resistance of the vCPUs of the cpupool to migrations among pCPUs. + */ +#define LIBXL_HAVE_SCHED_CREDIT_MIGR_DELAY + /* * LIBXL_HAVE_VIRIDIAN_CRASH_CTL indicates that the 'crash_ctl' value * is present in the viridian enlightenment enumeration. diff --git a/tools/libxl/libxl_sched.c b/tools/libxl/libxl_sched.c index 512788f736..7c53dc60e6 100644 --- a/tools/libxl/libxl_sched.c +++ b/tools/libxl/libxl_sched.c @@ -291,6 +291,7 @@ int libxl_sched_credit_params_get(libxl_ctx *ctx, uint32_t poolid, scinfo->tslice_ms = sparam.tslice_ms; scinfo->ratelimit_us = sparam.ratelimit_us; + scinfo->vcpu_migr_delay_us = sparam.vcpu_migr_delay_us; rc = 0; out: @@ -321,9 +322,16 @@ int libxl_sched_credit_params_set(libxl_ctx *ctx, uint32_t poolid, rc = ERROR_INVAL; goto out; } + if (scinfo->vcpu_migr_delay_us > XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US) { + LOG(ERROR, "vcpu migration delay should be >= 0 and <= %dus", + XEN_SYSCTL_CSCHED_MGR_DLY_MAX_US); + rc = ERROR_INVAL; + goto out; + } sparam.tslice_ms = scinfo->tslice_ms; sparam.ratelimit_us = scinfo->ratelimit_us; + sparam.vcpu_migr_delay_us = scinfo->vcpu_migr_delay_us; r = xc_sched_credit_params_set(ctx->xch, poolid, &sparam); if ( r < 0 ) { @@ -334,6 +342,7 @@ int libxl_sched_credit_params_set(libxl_ctx *ctx, uint32_t poolid, scinfo->tslice_ms = sparam.tslice_ms; scinfo->ratelimit_us = sparam.ratelimit_us; + scinfo->vcpu_migr_delay_us = sparam.vcpu_migr_delay_us; rc = 0; out: diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 35038120ca..dbb287d6fe 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -973,6 +973,7 @@ libxl_pcitopology = Struct("pcitopology", [ libxl_sched_credit_params = Struct("sched_credit_params", [ ("tslice_ms", integer), ("ratelimit_us", integer), + ("vcpu_migr_delay_us", integer), ], dispose_fn=None) libxl_sched_credit2_params = Struct("sched_credit2_params", [ diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c index 6d894394ca..bf2ced8140 100644 --- a/tools/xl/xl_cmdtable.c +++ b/tools/xl/xl_cmdtable.c @@ -257,6 +257,7 @@ struct cmd_spec cmd_table[] = { "-s --schedparam Query / modify scheduler parameters\n" "-t TSLICE, --tslice_ms=TSLICE Set the timeslice, in milliseconds\n" "-r RLIMIT, --ratelimit_us=RLIMIT Set the scheduling rate limit, in microseconds\n" + "-m DLY, --migration_delay_us=DLY Set the migration delay, in microseconds\n" "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL" }, { "sched-credit2", diff --git a/tools/xl/xl_sched.c b/tools/xl/xl_sched.c index 7965ccbca0..73cd7040cd 100644 --- a/tools/xl/xl_sched.c +++ b/tools/xl/xl_sched.c @@ -172,10 +172,11 @@ static int sched_credit_pool_output(uint32_t poolid) printf("Cpupool %s: [sched params unavailable]\n", poolname); } else { - printf("Cpupool %s: tslice=%dms ratelimit=%dus\n", + printf("Cpupool %s: tslice=%dms ratelimit=%dus migration-delay=%dus\n", poolname, scparam.tslice_ms, - scparam.ratelimit_us); + scparam.ratelimit_us, + scparam.vcpu_migr_delay_us); } free(poolname); return 0; @@ -469,10 +470,10 @@ int main_sched_credit(int argc, char **argv) const char *dom = NULL; const char *cpupool = NULL; int weight = 256, cap = 0; - int tslice = 0, ratelimit = 0; + int tslice = 0, ratelimit = 0, migrdelay = 0; bool opt_w = false, opt_c = false; bool opt_t = false, opt_r = false; - bool opt_s = false; + bool opt_s = false, opt_m = false; int opt, rc; static struct option opts[] = { {"domain", 1, 0, 'd'}, @@ -481,11 +482,12 @@ int main_sched_credit(int argc, char **argv) {"schedparam", 0, 0, 's'}, {"tslice_ms", 1, 0, 't'}, {"ratelimit_us", 1, 0, 'r'}, + {"migration_delay_us", 1, 0, 'm'}, {"cpupool", 1, 0, 'p'}, COMMON_LONG_OPTS }; - SWITCH_FOREACH_OPT(opt, "d:w:c:p:t:r:s", opts, "sched-credit", 0) { + SWITCH_FOREACH_OPT(opt, "d:w:c:p:t:r:m:s", opts, "sched-credit", 0) { case 'd': dom = optarg; break; @@ -505,6 +507,10 @@ int main_sched_credit(int argc, char **argv) ratelimit = strtol(optarg, NULL, 10); opt_r = true; break; + case 'm': + migrdelay = strtol(optarg, NULL, 10); + opt_m = true; + break; case 's': opt_s = true; break; @@ -522,7 +528,7 @@ int main_sched_credit(int argc, char **argv) fprintf(stderr, "Must specify a domain.\n"); return EXIT_FAILURE; } - if (!opt_s && (opt_t || opt_r)) { + if (!opt_s && (opt_t || opt_r || opt_m)) { fprintf(stderr, "Must specify schedparam to set schedule " "parameter values.\n"); return EXIT_FAILURE; @@ -541,7 +547,7 @@ int main_sched_credit(int argc, char **argv) } } - if (!opt_t && !opt_r) { /* Output scheduling parameters */ + if (!opt_t && !opt_r && !opt_m) { /* Output scheduling parameters */ if (sched_credit_pool_output(poolid)) return EXIT_FAILURE; } else { /* Set scheduling parameters*/ @@ -554,6 +560,9 @@ int main_sched_credit(int argc, char **argv) if (opt_r) scparam.ratelimit_us = ratelimit; + if (opt_m) + scparam.vcpu_migr_delay_us = migrdelay; + if (sched_credit_params_set(poolid, &scparam)) return EXIT_FAILURE; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |