Message ID | 147520406887.22544.17860143561838604699.stgit@Solace.fritz.box (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Dario Faggioli writes ("[PATCH v2 10/10] xl: allow to set the ratelimit value online for Credit2"): > Last part of the wiring necessary for allowing to > change the value of the ratelimit_us parameter online, > for Credit2 (like it is already for Credit1). > > Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com> > Reviewed-by: George Dunlap <george.dunlap@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Although I do have a comment: > +static int sched_credit2_params_set(int poolid, > + libxl_sched_credit2_params *scinfo) Each of this and the corresponding _get calls the corresponding libxl function, prints a message, and adjusts the return value. But: AFAICT each of these has only one call site; and each of the underlying libxl functions logs an error too; and each of the call sites prints a message too. So I question whether these functions are valuable. At this stage of the release cycle, and the maturity of this series, I guess you probably don't want to start messing with the error paths. The messages that will come out will be overly verbose rather than inadequate, so the code as it is fine if not as good as it could be. But it was a thing I noticed which I wanted to write down and/or have your opinion on. Thanks, Ian.
On Fri, 2016-09-30 at 11:34 +0100, Ian Jackson wrote: > Dario Faggioli writes ("[PATCH v2 10/10] xl: allow to set > theratelimit value online for Credit2"): > > > > +static int sched_credit2_params_set(int poolid, > > + libxl_sched_credit2_params > > *scinfo) > > Each of this and the corresponding _get calls the corresponding libxl > function, prints a message, and adjusts the return value. > > But: AFAICT each of these has only one call site; and each of the > underlying libxl functions logs an error too; and each of the call > sites prints a message too. > > So I question whether these functions are valuable. > So, about this last point (utility of sched_*_params_{get,set}() ), I totally agree. I think the reason why the functions exist is for the most part related to convenience and style. E.g., maybe indentation/nesting level was getting too deep within the various main_sched_*(). As said in another email, I don't especially like those functions, and I have the feeling they're a better way to write them, but I haven't really try. I'll put having a look at that in my todo list, but not at super high priority. :-P > At this stage of the release cycle, and the maturity of this series, > I > guess you probably don't want to start messing with the error paths. > Yeah, indeed, thanks for understanding! :-P Although... > The messages that will come out will be overly verbose rather than > inadequate, so the code as it is fine if not as good as it could be. > ...I'm not entirely sure I get what you're saying here. I mean, AFAICT, there's xl calling a libxl function and printing an error if it fails. The libxl function also logs an error --true-- but this seems rather common to me, and apart from that, it looks reasonable as well, isn't it so? Avoiding double/overly verbose logging from either within xl or within libxl is something I totally understand and agree. But when the 'border' is crossed, is it that terrible that both do log? After all, how can xl be sure that libxl will log something? And even if he could, I see the two as different kind and different level of logging. Or was it something else that you were referring to? > But it was a thing I noticed which I wanted to write down and/or have > your opinion on. > Sure! :-) Thanks and Regards, Dario
Dario Faggioli writes ("Re: [Xen-devel] [PATCH v2 10/10] xl: allow to set the ratelimit value online for Credit2"): > I mean, AFAICT, there's xl calling a libxl function and printing an > error if it fails. The libxl function also logs an error --true-- but > this seems rather common to me, and apart from that, it looks > reasonable as well, isn't it so? It seems to me that we should have a coherent strategy for which code is responsible for making what kind of log messages / error messages under what circumstances. One objective of this would be to try to arrange that when approximately one thing is wrong, the user gets one (accurate and informative) message about it, not half a dozen. But the more important objective would be to arrange that errors do not occur without _something_ providing an explanation. We are quite a way away from having such a coherent strategy in libxl. Ian.
On 09/29/2016 08:54 PM, Dario Faggioli wrote: > Last part of the wiring necessary for allowing to > change the value of the ratelimit_us parameter online, > for Credit2 (like it is already for Credit1). > > Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com> > Reviewed-by: George Dunlap <george.dunlap@citrix.com> Seeing this patch got me to thinking that it would be cool if libvirt supported Credit2 :-). Do you have any plans/time to do that? Regards, Jim
On 13/10/16 23:19, Jim Fehlig wrote: > On 09/29/2016 08:54 PM, Dario Faggioli wrote: >> Last part of the wiring necessary for allowing to >> change the value of the ratelimit_us parameter online, >> for Credit2 (like it is already for Credit1). >> >> Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com> >> Reviewed-by: George Dunlap <george.dunlap@citrix.com> > > Seeing this patch got me to thinking that it would be cool if libvirt > supported Credit2 :-). Do you have any plans/time to do that? Hmm, well, we can put it on our list of "things it would be good to do" -- not sure when it might actually manage to get attention unfortunately. :-/ -George
diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in index a2be541..803c67e 100644 --- a/docs/man/xl.pod.1.in +++ b/docs/man/xl.pod.1.in @@ -1089,6 +1089,15 @@ to 65535 and the default is 256. Restrict output to domains in the specified cpupool. +=item B<-s>, B<--schedparam> + +Specify to list or set pool-wide scheduler parameters. + +=item B<-r RLIMIT>, B<--ratelimit_us=RLIMIT> + +Attempts to limit the rate of context switching. It is basically the same +as B<--ratelimit_us> in B<sched-credit> + =back =item B<sched-rtds> [I<OPTIONS>] diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index cb43c00..b317dde 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -6457,8 +6457,29 @@ static int sched_credit_pool_output(uint32_t poolid) return 0; } -static int sched_credit2_domain_output( - int domid) +static int sched_credit2_params_set(int poolid, + libxl_sched_credit2_params *scinfo) +{ + if (libxl_sched_credit2_params_set(ctx, poolid, scinfo)) { + fprintf(stderr, "libxl_sched_credit2_params_set failed.\n"); + return 1; + } + + return 0; +} + +static int sched_credit2_params_get(int poolid, + libxl_sched_credit2_params *scinfo) +{ + if (libxl_sched_credit2_params_get(ctx, poolid, scinfo)) { + fprintf(stderr, "libxl_sched_credit2_params_get failed.\n"); + return 1; + } + + return 0; +} + +static int sched_credit2_domain_output(int domid) { char *domname; libxl_domain_sched_params scinfo; @@ -6483,6 +6504,22 @@ static int sched_credit2_domain_output( return 0; } +static int sched_credit2_pool_output(uint32_t poolid) +{ + libxl_sched_credit2_params scparam; + char *poolname = libxl_cpupoolid_to_name(ctx, poolid); + + if (sched_credit2_params_get(poolid, &scparam)) + printf("Cpupool %s: [sched params unavailable]\n", poolname); + else + printf("Cpupool %s: ratelimit=%dus\n", + poolname, scparam.ratelimit_us); + + free(poolname); + + return 0; +} + static int sched_rtds_domain_output( int domid) { @@ -6582,17 +6619,6 @@ static int sched_rtds_pool_output(uint32_t poolid) return 0; } -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) { @@ -6838,17 +6864,22 @@ int main_sched_credit2(int argc, char **argv) { const char *dom = NULL; const char *cpupool = NULL; + int ratelimit = 0; int weight = 256; + bool opt_s = false; + bool opt_r = false; bool opt_w = false; int opt, rc; static struct option opts[] = { {"domain", 1, 0, 'd'}, {"weight", 1, 0, 'w'}, + {"schedparam", 0, 0, 's'}, + {"ratelimit_us", 1, 0, 'r'}, {"cpupool", 1, 0, 'p'}, COMMON_LONG_OPTS }; - SWITCH_FOREACH_OPT(opt, "d:w:p:", opts, "sched-credit2", 0) { + SWITCH_FOREACH_OPT(opt, "d:w:p:r:s", opts, "sched-credit2", 0) { case 'd': dom = optarg; break; @@ -6856,6 +6887,13 @@ int main_sched_credit2(int argc, char **argv) weight = strtol(optarg, NULL, 10); opt_w = true; break; + case 's': + opt_s = true; + break; + case 'r': + ratelimit = strtol(optarg, NULL, 10); + opt_r = true; + break; case 'p': cpupool = optarg; break; @@ -6871,10 +6909,31 @@ int main_sched_credit2(int argc, char **argv) return EXIT_FAILURE; } - if (!dom) { /* list all domain's credit scheduler info */ + if (opt_s) { + libxl_sched_credit2_params scparam; + uint32_t poolid = 0; + + if (cpupool) { + if (libxl_cpupool_qualifier_to_cpupoolid(ctx, cpupool, + &poolid, NULL) || + !libxl_cpupoolid_is_valid(ctx, poolid)) { + fprintf(stderr, "unknown cpupool \'%s\'\n", cpupool); + return EXIT_FAILURE; + } + } + + if (!opt_r) { /* Output scheduling parameters */ + if (sched_credit2_pool_output(poolid)) + return EXIT_FAILURE; + } else { /* Set scheduling parameters (so far, just ratelimit) */ + scparam.ratelimit_us = ratelimit; + if (sched_credit2_params_set(poolid, &scparam)) + return EXIT_FAILURE; + } + } else if (!dom) { /* list all domain's credit scheduler info */ if (sched_domain_output(LIBXL_SCHEDULER_CREDIT2, sched_credit2_domain_output, - sched_default_pool_output, + sched_credit2_pool_output, cpupool)) return EXIT_FAILURE; } else { diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index 78786fe..5a57342 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -265,6 +265,8 @@ struct cmd_spec cmd_table[] = { "[-d <Domain> [-w[=WEIGHT]]] [-p CPUPOOL]", "-d DOMAIN, --domain=DOMAIN Domain to modify\n" "-w WEIGHT, --weight=WEIGHT Weight (int)\n" + "-s --schedparam Query / modify scheduler parameters\n" + "-r RLIMIT, --ratelimit_us=RLIMIT Set the scheduling rate limit, in microseconds\n" "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL" }, { "sched-rtds",