It is rather complicated to obtain the cpupool a domain lives in. Add an
option -d (or --domains) to list all domains running in a cpupool.
Signed-off-by: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>
---
docs/man/xl.pod.1 | 5 ++++-
tools/libxl/xl_cmdimpl.c | 47 ++++++++++++++++++++++++++++++++++++++-------
tools/libxl/xl_cmdtable.c | 5 +++--
3 files changed, 47 insertions(+), 10 deletions(-)
diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index e7b9de2..547af6d 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -1019,10 +1019,13 @@ Use the given configuration file.
=back
-=item B<cpupool-list> [I<-c|--cpus>] [I<cpu-pool>]
+=item B<cpupool-list> [I<-c|--cpus>] [I<-d|--domains>] [I<cpu-pool>]
List CPU pools on the host.
If I<-c> is specified, B<xl> prints a list of CPUs used by I<cpu-pool>.
+If I<-d> is specified, B<xl> prints a list of domains in I<cpu-pool> instead
+of the domain count.
+I<-c> and I<-d> are mutually exclusive.
=item B<cpupool-destroy> I<cpu-pool>
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index aff6f90..c7b9fce 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -6754,23 +6754,32 @@ int main_cpupoollist(int argc, char **argv)
int opt;
static struct option opts[] = {
{"cpus", 0, 0, 'c'},
+ {"domains", 0, 0, 'd'},
COMMON_LONG_OPTS,
{0, 0, 0, 0}
};
- int opt_cpus = 0;
+ int opt_cpus = 0, opt_domains = 0;
const char *pool = NULL;
libxl_cpupoolinfo *poolinfo;
- int n_pools, p, c, n;
+ libxl_dominfo *dominfo = NULL;
+ int n_pools, n_domains, p, c, n;
uint32_t poolid;
char *name;
int ret = 0;
- SWITCH_FOREACH_OPT(opt, "hc", opts, "cpupool-list", 0) {
+ SWITCH_FOREACH_OPT(opt, "hcd", opts, "cpupool-list", 0) {
case 'c':
opt_cpus = 1;
break;
+ case 'd':
+ opt_domains = 1;
+ break;
}
+ if (opt_cpus && opt_domains) {
+ fprintf(stderr, "specifying both cpu- and domain-list not allowed\n");
+ return -ERROR_FAIL;
+ }
if (optind < argc) {
pool = argv[optind];
if (libxl_name_to_cpupoolid(ctx, pool, &poolid)) {
@@ -6784,12 +6793,21 @@ int main_cpupoollist(int argc, char **argv)
fprintf(stderr, "error getting cpupool info\n");
return -ERROR_NOMEM;
}
+ if (opt_domains) {
+ dominfo = libxl_list_domain(ctx, &n_domains);
+ if (!dominfo) {
+ fprintf(stderr, "error getting domain info\n");
+ ret = -ERROR_NOMEM;
+ goto out;
+ }
+ }
printf("%-19s", "Name");
if (opt_cpus)
printf("CPU list\n");
else
- printf("CPUs Sched Active Domain count\n");
+ printf("CPUs Sched Active Domain %s\n",
+ opt_domains ? "list" : "count");
for (p = 0; p < n_pools; p++) {
if (!ret && (!pool || (poolinfo[p].poolid == poolid))) {
@@ -6808,15 +6826,30 @@ int main_cpupoollist(int argc, char **argv)
n++;
}
if (!opt_cpus) {
- printf("%3d %9s y %4d", n,
- libxl_scheduler_to_string(poolinfo[p].sched),
- poolinfo[p].n_dom);
+ printf("%3d %9s y ", n,
+ libxl_scheduler_to_string(poolinfo[p].sched));
+ if (opt_domains) {
+ c = 0;
+ for (n = 0; n < n_domains; n++) {
+ if (poolinfo[p].poolid == dominfo[n].cpupool) {
+ name = libxl_domid_to_name(ctx,
dominfo[n].domid);
+ printf("%s%s", c ? ", " : "", name);
+ free(name);
+ c++;
+ }
+ }
+ }
+ else
+ printf(" %4d", poolinfo[p].n_dom);
}
printf("\n");
}
}
}
+ if (dominfo)
+ libxl_dominfo_list_free(dominfo, n_domains);
+out:
libxl_cpupoolinfo_list_free(poolinfo, n_pools);
return ret;
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index ebe0220..8a52d26 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -426,8 +426,9 @@ struct cmd_spec cmd_table[] = {
{ "cpupool-list",
&main_cpupoollist, 0, 0,
"List CPU pools on host",
- "[-c|--cpus] [<CPU Pool>]",
- "-c, --cpus Output list of CPUs used by a pool"
+ "[-c|--cpus] [-d|--domains] [<CPU Pool>]",
+ "-c, --cpus Output list of CPUs used by a pool\n"
+ "-d, --domains Output list of domains running in a pool"
},
{ "cpupool-destroy",
&main_cpupooldestroy, 0, 1,