aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2011-11-28 13:27:15 +0100
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2011-11-28 13:27:15 +0100
commit31c2ace79d3181edcbaa4f4fe52e9f248969e0f4 (patch)
treef83aae7c477a2ec65ca0cce776612de1588fc446
parent25097df0171e7c4312e5c3233ef66bec4677b7f0 (diff)
downloadxen-31c2ace79d3181edcbaa4f4fe52e9f248969e0f4.tar.gz
xen-31c2ace79d3181edcbaa4f4fe52e9f248969e0f4.tar.bz2
xen-31c2ace79d3181edcbaa4f4fe52e9f248969e0f4.zip
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@ts.fujitsu.com Acked-by: Ian Jackson <ian.jackson.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
-rw-r--r--docs/man/xl.pod.14
-rw-r--r--tools/libxl/libxl.c1
-rw-r--r--tools/libxl/libxl_types.idl1
-rw-r--r--tools/libxl/xl_cmdimpl.c108
-rw-r--r--tools/libxl/xl_cmdtable.c5
5 files changed, 95 insertions, 24 deletions
diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index ffcb72993a..0a6d49bbaf 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -670,6 +670,10 @@ is expressed in percentage of one physical CPU: 100 is 1 physical CPU,
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 --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index de35adf2d0..eb83f95b0a 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -361,6 +361,7 @@ static void xcinfo2xlinfo(const xc_domaininfo_t *xcinfo,
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 --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index d59d2cb86d..58bbc2a68d 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -116,6 +116,7 @@ SHUTDOWN_* constant."""),
("cpu_time", uint64),
("vcpu_max_id", uint32),
("vcpu_online", uint32),
+ ("cpupool", uint32),
], dispose_fn=None)
libxl_cpupoolinfo = Struct("cpupoolinfo", [
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 40c669aa09..f8fd7bd1e4 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -3783,25 +3783,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;
}
-int main_sched_credit(int argc, char **argv)
+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_sched_credit scinfo;
- int nb_domain, i;
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;
@@ -3809,12 +3874,14 @@ int main_sched_credit(int argc, char **argv)
{"domain", 1, 0, 'd'},
{"weight", 1, 0, 'w'},
{"cap", 1, 0, 'c'},
+ {"cpupool", 1, 0, 'p'},
{"help", 0, 0, 'h'},
{0, 0, 0, 0}
};
while (1) {
- opt = getopt_long(argc, argv, "d:w:c:h", long_options, &option_index);
+ opt = getopt_long(argc, argv, "d:w:c:p:h", long_options,
+ &option_index);
if (opt == -1)
break;
switch (opt) {
@@ -3831,31 +3898,28 @@ int main_sched_credit(int argc, char **argv)
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);
@@ -3864,8 +3928,8 @@ int main_sched_credit(int argc, char **argv)
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 --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index 5690d710c1..1cceb300fe 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -192,10 +192,11 @@ struct cmd_spec cmd_table[] = {
{ "sched-credit",
&main_sched_credit, 0,
"Get/set credit scheduler parameters",
- "[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]]",
+ "[-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)"
+ "-c CAP, --cap=CAP Cap (int)\n"
+ "-p CPUPOOL, --cpupool=CPUPOOL Restrict output to CPUPOOL"
},
{ "domid",
&main_domid, 0,