[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 9 of 9] xl: Implement sched-credit schedule parameter command-line interface
On Wed, Feb 22, 2012 at 4:15 PM, George Dunlap <george.dunlap@xxxxxxxxxxxxx> wrote: > 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 BTW, there was a brief suggestion that rather than sharing the same command (which requires a big table to explain how the various options interact), we break out sched-credit into two, possibly three commands; one of which would read all scheduler information, the other two which would specifically get or set domain and scheduler-wide parameters. Any thoughts on this? -G > > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > > diff -r 5600db2bcd0e -r 0f91ce7b095a docs/man/xl.pod.1 > --- a/docs/man/xl.pod.1 Wed Feb 22 16:08:28 2012 +0000 > +++ b/docs/man/xl.pod.1 Wed Feb 22 16:08:28 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 5600db2bcd0e -r 0f91ce7b095a tools/libxl/xl_cmdimpl.c > --- a/tools/libxl/xl_cmdimpl.c Wed Feb 22 16:08:28 2012 +0000 > +++ b/tools/libxl/xl_cmdimpl.c Wed Feb 22 16:08:28 2012 +0000 > @@ -3912,8 +3912,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; > > @@ -3924,8 +3923,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; > > @@ -3936,8 +3934,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; > @@ -3960,6 +3979,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) > { > @@ -4122,25 +4162,41 @@ static int sched_domain_output(uint32_t > 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; > @@ -4158,6 +4214,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; > @@ -4167,20 +4234,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(XEN_SCHEDULER_CREDIT, > sched_credit_domain_output, > - sched_default_pool_output, > + sched_credit_pool_output, > cpupool); > } else { > find_domain(dom); > diff -r 5600db2bcd0e -r 0f91ce7b095a tools/libxl/xl_cmdtable.c > --- a/tools/libxl/xl_cmdtable.c Wed Feb 22 16:08:28 2012 +0000 > +++ b/tools/libxl/xl_cmdtable.c Wed Feb 22 16:08:28 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, > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |