George Dunlap
2012-Mar-02 10:51 UTC
[PATCH 0 of 2] [refresh] Implement xl interface for setting credit 1 scheduler parameters
This is a refresh of the last two patches of my previous series, all the rest of which have been applied. There was some discussion of changing the interface to be several commands, but there wasn''t enough interest to motivate me to do the work.
George Dunlap
2012-Mar-02 10:51 UTC
[PATCH 1 of 2] xl: Refactor sched_domain_output to have a callback for pool information
Allow a scheduler to provide a callback to display pool-wide information, providing a default. This is in preparation for displaying pool-wide scheduler parameters on this line. Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> diff -r 5e38c834f795 -r 70b0b974a29b tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Mar 01 19:00:09 2012 +0000 +++ b/tools/libxl/xl_cmdimpl.c Fri Mar 02 10:45:06 2012 +0000 @@ -4055,13 +4055,23 @@ static int sched_sedf_domain_output( return 0; } -static int sched_domain_output( - libxl_scheduler sched, int (*output)(int), const char *cpupool) +static int sched_default_pool_output(uint32_t poolid) +{ + char *poolname; + + poolname = libxl_cpupoolid_to_name(ctx, poolid); + printf("Cpupool %s:\n", + poolname); + free(poolname); + return 0; +} + +static int sched_domain_output(libxl_scheduler sched, int (*output)(int), + int (*pooloutput)(uint32_t), const char *cpupool) { libxl_dominfo *info; libxl_cpupoolinfo *poolinfo = NULL; uint32_t poolid; - char *poolname; int nb_domain, n_pools = 0, i, p; int rc = 0; @@ -4089,9 +4099,7 @@ static int sched_domain_output( (cpupool && (poolid != poolinfo[p].poolid))) continue; - poolname = libxl_cpupoolid_to_name(ctx, poolinfo[p].poolid); - printf("Cpupool %s:\n", poolname); - free(poolname); + pooloutput(poolinfo[p].poolid); output(-1); for (i = 0; i < nb_domain; i++) { @@ -4167,7 +4175,9 @@ int main_sched_credit(int argc, char **a if (!dom) { /* list all domain''s credit scheduler info */ return -sched_domain_output(LIBXL_SCHEDULER_CREDIT, - sched_credit_domain_output, cpupool); + sched_credit_domain_output, + sched_default_pool_output, + cpupool); } else { find_domain(dom); @@ -4244,7 +4254,9 @@ int main_sched_credit2(int argc, char ** if (!dom) { /* list all domain''s credit scheduler info */ return -sched_domain_output(LIBXL_SCHEDULER_CREDIT2, - sched_credit2_domain_output, cpupool); + sched_credit2_domain_output, + sched_default_pool_output, + cpupool); } else { find_domain(dom); @@ -4347,7 +4359,9 @@ int main_sched_sedf(int argc, char **arg if (!dom) { /* list all domain''s credit scheduler info */ return -sched_domain_output(LIBXL_SCHEDULER_SEDF, - sched_sedf_domain_output, cpupool); + sched_sedf_domain_output, + sched_default_pool_output, + cpupool); } else { find_domain(dom);
George Dunlap
2012-Mar-02 10:51 UTC
[PATCH 2 of 2] xl: Implement sched-credit schedule parameter command-line interface
Add features to the sched-credit interface to allow querying and displaying scheduler parameters. v2: - Change function line breaks - Pool output deals gracefully with other schedulers - Add new parameters, as well as a description of how they interact, to the xl man page Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com> diff -r 70b0b974a29b -r 3fd100808072 docs/man/xl.pod.1 --- a/docs/man/xl.pod.1 Fri Mar 02 10:45:06 2012 +0000 +++ b/docs/man/xl.pod.1 Fri Mar 02 10:45:37 2012 +0000 @@ -714,6 +714,53 @@ no upper cap. Restrict output to domains in the specified cpupool. +=item B<-s>, B<--schedparam> + +Specify to list or set pool-wide scheduler parameters. + +=item B<-t TSLICE>, B<--tslice_ms=TSLICE> + +Timeslice tells the scheduler how long to allow VMs to run before +pre-empting. The default is 30ms. Valid ranges are 1ms to 1000ms. +The length of the timeslice (in ms) must be higher than the length of +the ratelimit (see below). + +=item B<-r RLIMIT>, B<--ratelimit_us=RLIMIT> + +Ratelimit attempts to limit the number of schedules per second. It +sets a minimum amount of time (in microseconds) a VM must run before +we will allow a higher-prioirty 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. + +=back + +B<COMBINATION> + +The following is the effect of combining the above options: + +=over 4 + +=item B<E<lt>nothingE<gt>> : List all domain params and sched params from all pools + +=item B<-d [domid]> : List domain params for domain [domid] + +=item B<-d [domid] [params]> : Set domain params for domain [domid] + +=item B<-p [pool]> : list all domains and sched params for [pool] + +=item B<-s> : List sched params for poolid 0 + +=item B<-s [params]> : Set sched params for poolid 0 + +=item B<-p [pool] -s> : List sched params for [pool] + +=item B<-p [pool] -s [params]> : Set sched params for [pool] + +=item B<-p [pool] -d>... : Illegal + +=item + =back =item B<sched-credit2> [I<OPTIONS>] diff -r 70b0b974a29b -r 3fd100808072 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri Mar 02 10:45:06 2012 +0000 +++ b/tools/libxl/xl_cmdimpl.c Fri Mar 02 10:45:37 2012 +0000 @@ -3905,8 +3905,7 @@ int main_sharing(int argc, char **argv) return 0; } -static int sched_credit_domain_get( - int domid, libxl_sched_credit_domain *scinfo) +static int sched_credit_domain_get(int domid, libxl_sched_credit_domain *scinfo) { int rc; @@ -3917,8 +3916,7 @@ static int sched_credit_domain_get( return rc; } -static int sched_credit_domain_set( - int domid, libxl_sched_credit_domain *scinfo) +static int sched_credit_domain_set(int domid, libxl_sched_credit_domain *scinfo) { int rc; @@ -3930,8 +3928,29 @@ static int sched_credit_domain_set( return rc; } -static int sched_credit_domain_output( - int domid) +static int sched_credit_params_set(int poolid, libxl_sched_credit_params *scinfo) +{ + int rc; + + rc = libxl_sched_credit_params_set(ctx, poolid, scinfo); + if (rc) + fprintf(stderr, "libxl_sched_credit_params_set failed.\n"); + + return rc; +} + +static int sched_credit_params_get(int poolid, libxl_sched_credit_params *scinfo) +{ + int rc; + + rc = libxl_sched_credit_params_get(ctx, poolid, scinfo); + if (rc) + fprintf(stderr, "libxl_sched_credit_params_get failed.\n"); + + return rc; +} + +static int sched_credit_domain_output(int domid) { char *domname; libxl_sched_credit_domain scinfo; @@ -3955,6 +3974,27 @@ static int sched_credit_domain_output( return 0; } +static int sched_credit_pool_output(uint32_t poolid) +{ + libxl_sched_credit_params scparam; + char *poolname; + int rc; + + poolname = libxl_cpupoolid_to_name(ctx, poolid); + rc = sched_credit_params_get(poolid, &scparam); + if (rc) { + printf("Cpupool %s: [sched params unavailable]\n", + poolname); + } else { + printf("Cpupool %s: tslice=%dms ratelimit=%dus\n", + poolname, + scparam.tslice_ms, + scparam.ratelimit_us); + } + free(poolname); + return 0; +} + static int sched_credit2_domain_get( int domid, libxl_sched_credit2_domain *scinfo) { @@ -4118,25 +4158,41 @@ static int sched_domain_output(libxl_sch return 0; } +/* + * <nothing> : List all domain params and sched params from all pools + * -d [domid] : List domain params for domain + * -d [domid] [params] : Set domain params for domain + * -p [pool] : list all domains and sched params for pool + * -s : List sched params for poolid 0 + * -s [params] : Set sched params for poolid 0 + * -p [pool] -s : List sched params for pool + * -p [pool] -s [params] : Set sched params for pool + * -p [pool] -d... : Illegal + */ int main_sched_credit(int argc, char **argv) { libxl_sched_credit_domain scinfo; const char *dom = NULL; const char *cpupool = NULL; int weight = 256, cap = 0, opt_w = 0, opt_c = 0; + int opt_s = 0; + int tslice = 0, opt_t = 0, ratelimit = 0, opt_r = 0; int opt, rc; int option_index = 0; static struct option long_options[] = { {"domain", 1, 0, ''d''}, {"weight", 1, 0, ''w''}, {"cap", 1, 0, ''c''}, + {"schedparam", 0, 0, ''s''}, + {"tslice_ms", 1, 0, ''t''}, + {"ratelimit_us", 1, 0, ''r''}, {"cpupool", 1, 0, ''p''}, {"help", 0, 0, ''h''}, {0, 0, 0, 0} }; while (1) { - opt = getopt_long(argc, argv, "d:w:c:p:h", long_options, + opt = getopt_long(argc, argv, "d:w:c:p:t:r:hs", long_options, &option_index); if (opt == -1) break; @@ -4154,6 +4210,17 @@ int main_sched_credit(int argc, char **a cap = strtol(optarg, NULL, 10); opt_c = 1; break; + case ''t'': + tslice = strtol(optarg, NULL, 10); + opt_t = 1; + break; + case ''r'': + ratelimit = strtol(optarg, NULL, 10); + opt_r = 1; + break; + case ''s'': + opt_s = 1; + break; case ''p'': cpupool = optarg; break; @@ -4163,20 +4230,54 @@ int main_sched_credit(int argc, char **a } } - if (cpupool && (dom || opt_w || opt_c)) { - fprintf(stderr, "Specifying a cpupool is not allowed with other " - "options.\n"); + if ((cpupool || opt_s) && (dom || opt_w || opt_c)) { + fprintf(stderr, "Specifying a cpupool or schedparam is not " + "allowed with domain options.\n"); return 1; } if (!dom && (opt_w || opt_c)) { fprintf(stderr, "Must specify a domain.\n"); return 1; } - - if (!dom) { /* list all domain''s credit scheduler info */ + if (!opt_s && (opt_t || opt_r)) { + fprintf(stderr, "Must specify schedparam to set schedule " + "parameter values.\n"); + return 1; + } + + if (opt_s) { + libxl_sched_credit_params scparam; + uint32_t poolid = 0; + + if (cpupool) { + if (cpupool_qualifier_to_cpupoolid(cpupool, &poolid, NULL) || + !libxl_cpupoolid_to_name(ctx, poolid)) { + fprintf(stderr, "unknown cpupool \''%s\''\n", cpupool); + return -ERROR_FAIL; + } + } + + if (!opt_t && !opt_r) { /* Output scheduling parameters */ + return -sched_credit_pool_output(poolid); + } else { /* Set scheduling parameters*/ + rc = sched_credit_params_get(poolid, &scparam); + if (rc) + return -rc; + + if (opt_t) + scparam.tslice_ms = tslice; + + if (opt_r) + scparam.ratelimit_us = ratelimit; + + rc = sched_credit_params_set(poolid, &scparam); + if (rc) + return -rc; + } + } else if (!dom) { /* list all domain''s credit scheduler info */ return -sched_domain_output(LIBXL_SCHEDULER_CREDIT, sched_credit_domain_output, - sched_default_pool_output, + sched_credit_pool_output, cpupool); } else { find_domain(dom); diff -r 70b0b974a29b -r 3fd100808072 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Fri Mar 02 10:45:06 2012 +0000 +++ b/tools/libxl/xl_cmdtable.c Fri Mar 02 10:45:37 2012 +0000 @@ -204,11 +204,14 @@ struct cmd_spec cmd_table[] = { { "sched-credit", &main_sched_credit, 0, "Get/set credit scheduler parameters", - "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]] [-p CPUPOOL]", - "-d DOMAIN, --domain=DOMAIN Domain to modify\n" - "-w WEIGHT, --weight=WEIGHT Weight (int)\n" - "-c CAP, --cap=CAP Cap (int)\n" - "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL" + "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]] [-s [-t TSLICE] [-r RATELIMIT]] [-p CPUPOOL]", + "-d DOMAIN, --domain=DOMAIN Domain to modify\n" + "-w WEIGHT, --weight=WEIGHT Weight (int)\n" + "-c CAP, --cap=CAP Cap (int)\n" + "-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" + "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL" }, { "sched-credit2", &main_sched_credit2, 0,
Ian Jackson
2012-Mar-14 14:06 UTC
Re: [PATCH 2 of 2] xl: Implement sched-credit schedule parameter command-line interface
George Dunlap writes ("[Xen-devel] [PATCH 2 of 2] xl: Implement sched-credit schedule parameter command-line interface"):> Add features to the sched-credit interface to allow querying and > displaying scheduler parameters.Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com> (applied both) Thanks, Ian.