# HG changeset patch # User Juergen Gross # Date 1321531168 -3600 # Node ID 0c42b3e133bfc246174444c5f485ea92ed19d727 # Parent 59c0e68a83cf1b007fb6ff1574cdedf2dd217a42 Support cpupools in xl sched-credit Adds cpupool awareness to output of xl sched-credit. Output can now be restricted to a specific cpupool. The domains are printed for each cpupool seperately. The loop over cpupools and domains is seperated from the main command implementation to be able to support other schedulers as well. Signed-off-by: juergen.gross@xxxxxxxxxxxxxx diff -r 59c0e68a83cf -r 0c42b3e133bf docs/man/xl.pod.1 --- a/docs/man/xl.pod.1 Thu Nov 17 12:00:55 2011 +0100 +++ b/docs/man/xl.pod.1 Thu Nov 17 12:59:28 2011 +0100 @@ -610,6 +610,10 @@ 50 is half a CPU, 400 is 4 CPUs, etc. Th 50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is no upper cap. +=item B<-p CPUPOOL>, B<--cpupool=CPUPOOL> + +Restrict output to domains in the specified cpupool. + =back =back diff -r 59c0e68a83cf -r 0c42b3e133bf tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu Nov 17 12:00:55 2011 +0100 +++ b/tools/libxl/libxl.c Thu Nov 17 12:59:28 2011 +0100 @@ -361,6 +361,7 @@ static void xcinfo2xlinfo(const xc_domai xlinfo->cpu_time = xcinfo->cpu_time; xlinfo->vcpu_max_id = xcinfo->max_vcpu_id; xlinfo->vcpu_online = xcinfo->nr_online_vcpus; + xlinfo->cpupool = xcinfo->cpupool; } libxl_dominfo * libxl_list_domain(libxl_ctx *ctx, int *nb_domain) diff -r 59c0e68a83cf -r 0c42b3e133bf tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Thu Nov 17 12:00:55 2011 +0100 +++ b/tools/libxl/libxl_types.idl Thu Nov 17 12:59:28 2011 +0100 @@ -109,6 +109,7 @@ SHUTDOWN_* constant."""), ("cpu_time", uint64), ("vcpu_max_id", uint32), ("vcpu_online", uint32), + ("cpupool", uint32), ], dispose_fn=None) libxl_cpupoolinfo = Struct("cpupoolinfo", [ diff -r 59c0e68a83cf -r 0c42b3e133bf tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Nov 17 12:00:55 2011 +0100 +++ b/tools/libxl/xl_cmdimpl.c Thu Nov 17 12:59:28 2011 +0100 @@ -3695,25 +3695,90 @@ static int sched_credit_domain_set( return rc; } -static void sched_credit_domain_output( - int domid, libxl_sched_credit *scinfo) +static int sched_credit_domain_output( + int domid) { char *domname; + libxl_sched_credit scinfo; + int rc; + + if (domid < 0) { + printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap"); + return 0; + } + rc = sched_credit_domain_get(domid, &scinfo); + if (rc) + return rc; domname = libxl_domid_to_name(ctx, domid); printf("%-33s %4d %6d %4d\n", domname, domid, - scinfo->weight, - scinfo->cap); + scinfo.weight, + scinfo.cap); free(domname); + return 0; +} + +static int sched_domain_output( + uint32_t sched, int (*output)(int), 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; + + 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; + } + } + + info = libxl_list_domain(ctx, &nb_domain); + if (!info) { + fprintf(stderr, "libxl_domain_infolist failed.\n"); + return 1; + } + poolinfo = libxl_list_cpupool(ctx, &n_pools); + if (!poolinfo) { + fprintf(stderr, "error getting cpupool info\n"); + return -ERROR_NOMEM; + } + + for (p = 0; !rc && (p < n_pools); p++) { + if ((poolinfo[p].sched_id != sched) || + (cpupool && (poolid != poolinfo[p].poolid))) + continue; + + poolname = libxl_cpupoolid_to_name(ctx, poolinfo[p].poolid); + printf("Cpupool %s:\n", poolname); + free(poolname); + + output(-1); + for (i = 0; i < nb_domain; i++) { + if (info[i].cpupool != poolinfo[p].poolid) + continue; + rc = output(info[i].domid); + if (rc) + break; + } + } + if (poolinfo) { + for (p = 0; p < n_pools; p++) { + libxl_cpupoolinfo_dispose(poolinfo + p); + } + } + return 0; } int main_sched_credit(int argc, char **argv) { - libxl_dominfo *info; libxl_sched_credit scinfo; - int nb_domain, i; - const char *dom = NULL; + const char *dom = NULL; + const char *cpupool = NULL; int weight = 256, cap = 0, opt_w = 0, opt_c = 0; int opt, rc; int option_index = 0; @@ -3721,12 +3786,13 @@ int main_sched_credit(int argc, char **a {"domain", 1, 0, 'd'}, {"weight", 1, 0, 'w'}, {"cap", 1, 0, 'c'}, - {"help", 0, 0, 'h'}, - {0, 0, 0, 0} - }; - - while (1) { - opt = getopt_long(argc, argv, "d:w:c:h", long_options, &option_index); + {"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, &option_index); if (opt == -1) break; switch (opt) { @@ -3743,31 +3809,26 @@ int main_sched_credit(int argc, char **a cap = strtol(optarg, NULL, 10); opt_c = 1; break; + case 'p': + cpupool = optarg; + break; case 'h': help("sched-credit"); return 0; } } + if (cpupool && (dom || opt_w || opt_c)) { + fprintf(stderr, "Specifying a cpupool is not allowed with other 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 */ - info = libxl_list_domain(ctx, &nb_domain); - if (!info) { - fprintf(stderr, "libxl_domain_infolist failed.\n"); - return 1; - } - - printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap"); - for (i = 0; i < nb_domain; i++) { - rc = sched_credit_domain_get(info[i].domid, &scinfo); - if (rc) - return -rc; - sched_credit_domain_output(info[i].domid, &scinfo); - } + return -sched_domain_output(XEN_SCHEDULER_CREDIT, sched_credit_domain_output, cpupool); } else { find_domain(dom); @@ -3776,8 +3837,8 @@ int main_sched_credit(int argc, char **a return -rc; if (!opt_w && !opt_c) { /* output credit scheduler info */ - printf("%-33s %4s %6s %4s\n", "Name", "ID", "Weight", "Cap"); - sched_credit_domain_output(domid, &scinfo); + sched_credit_domain_output(-1); + return -sched_credit_domain_output(domid); } else { /* set credit scheduler paramaters */ if (opt_w) scinfo.weight = weight; diff -r 59c0e68a83cf -r 0c42b3e133bf tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Thu Nov 17 12:00:55 2011 +0100 +++ b/tools/libxl/xl_cmdtable.c Thu Nov 17 12:59:28 2011 +0100 @@ -192,10 +192,11 @@ struct cmd_spec cmd_table[] = { { "sched-credit", &main_sched_credit, 0, "Get/set credit scheduler parameters", - "[-d [-w[=WEIGHT]|-c[=CAP]]]", + "[-d [-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)" + "-c CAP, --cap=CAP Cap (int)\n" + "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL" }, { "domid", &main_domid, 0,