Eric Chanudet
2010-Apr-01 16:27 UTC
[Xen-devel] [PATCH 0 of 4] xl: vcpu commands and tsc_mode parameter
This patch series provides the following vcpu control commands to xl: - vcpu-list: list the VCPUs for all/some domains. - vcpu-pin: Set which CPUs a VCPU can use. - vcpu-set: Set the number of active VCPUs allowed for the domain. Also provides tsc_mode parameter handling from guest configuration file. -- Eric Chanudet _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
This patch add vcpu-list command to xl.
Acked-by: Vincent Hanquez <vincent.hanquez@eu.citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2221,3 +2221,64 @@ int libxl_button_press(struct libxl_ctx
return rc;
}
+
+int libxl_get_physinfo(struct libxl_ctx *ctx, struct libxl_physinfo *physinfo)
+{
+ xc_physinfo_t xcphysinfo = { 0 };
+ int rc;
+
+ rc = xc_physinfo(ctx->xch, &xcphysinfo);
+ if (rc != 0) {
+ return rc;
+ }
+ physinfo->threads_per_core = xcphysinfo.threads_per_core;
+ physinfo->cores_per_socket = xcphysinfo.cores_per_socket;
+ physinfo->nr_cpus = xcphysinfo.nr_cpus;
+ physinfo->cpu_khz = xcphysinfo.cpu_khz;
+ physinfo->total_pages = xcphysinfo.total_pages;
+ physinfo->free_pages = xcphysinfo.free_pages;
+ physinfo->scrub_pages = xcphysinfo.scrub_pages;
+ return 0;
+}
+
+struct libxl_vcpuinfo *libxl_list_vcpu(struct libxl_ctx *ctx, uint32_t domid,
+ int *nb_vcpu, int *cpusize)
+{
+ struct libxl_vcpuinfo *ptr, *ret;
+ xc_domaininfo_t domaininfo;
+ xc_vcpuinfo_t vcpuinfo;
+ xc_physinfo_t physinfo = { 0 };
+
+ if (xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo) != 1) {
+ return NULL;
+ }
+ if (xc_physinfo(ctx->xch, &physinfo) == -1) {
+ return NULL;
+ }
+ *cpusize = physinfo.max_cpu_id + 1;
+ ptr = libxl_calloc(ctx, domaininfo.max_vcpu_id + 1, sizeof (struct
libxl_vcpuinfo));
+ if (!ptr) {
+ return NULL;
+ }
+
+ ret = ptr;
+ for (*nb_vcpu = 0; *nb_vcpu <= domaininfo.max_vcpu_id; ++*nb_vcpu,
++ptr) {
+ ptr->cpumap = libxl_calloc(ctx, (*cpusize + 63) / 64, sizeof
(uint64_t));
+ if (!ptr->cpumap) {
+ return NULL;
+ }
+ if (xc_vcpu_getinfo(ctx->xch, domid, *nb_vcpu, &vcpuinfo) == -1)
{
+ return NULL;
+ }
+ if (xc_vcpu_getaffinity(ctx->xch, domid, *nb_vcpu, ptr->cpumap,
*cpusize) == -1) {
+ return NULL;
+ }
+ ptr->vcpuid = *nb_vcpu;
+ ptr->cpu = vcpuinfo.cpu;
+ ptr->online = !!vcpuinfo.online;
+ ptr->blocked = !!vcpuinfo.blocked;
+ ptr->running = !!vcpuinfo.running;
+ ptr->vcpu_time = vcpuinfo.cpu_time;
+ }
+ return ret;
+}
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -360,5 +360,31 @@ typedef enum {
int libxl_button_press(struct libxl_ctx *ctx, uint32_t domid, libxl_button
button);
+struct libxl_vcpuinfo {
+ uint32_t vcpuid; /* vcpu''s id */
+ uint32_t cpu; /* current mapping */
+ uint8_t online:1; /* currently online (not hotplugged)? */
+ uint8_t blocked:1; /* blocked waiting for an event? */
+ uint8_t running:1; /* currently scheduled on its CPU? */
+ uint64_t vcpu_time; /* total vcpu time ran (ns) */
+ uint64_t *cpumap; /* current cpu''s affinities */
+};
+
+struct libxl_physinfo {
+ uint32_t threads_per_core;
+ uint32_t cores_per_socket;
+
+ uint32_t nr_cpus;
+ uint32_t cpu_khz;
+
+ uint64_t total_pages;
+ uint64_t free_pages;
+ uint64_t scrub_pages;
+};
+
+int libxl_get_physinfo(struct libxl_ctx *ctx, struct libxl_physinfo *physinfo);
+struct libxl_vcpuinfo *libxl_list_vcpu(struct libxl_ctx *ctx, uint32_t domid,
+ int *nb_vcpu, int *cpusize);
+
#endif /* LIBXL_H */
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -876,6 +876,7 @@ static void help(char *command)
printf(" cd-eject eject a cdrom from a
guest''s cd drive\n\n");
printf(" mem-set set the current memory
usage for a domain\n\n");
printf(" button-press indicate an ACPI button
press to the domain\n\n");
+ printf(" vcpu-list list the VCPUs for all/some
domains.\n\n");
} else if(!strcmp(command, "create")) {
printf("Usage: xl create <ConfigFile> [options]
[vars]\n\n");
printf("Create a domain based on <ConfigFile>.\n\n");
@@ -933,6 +934,9 @@ static void help(char *command)
printf("Usage: xl button-press <Domain>
<Button>\n\n");
printf("Indicate <Button> press to a domain.\n");
printf("<Button> may be ''power'' or
''sleep''.\n\n");
+ } else if (!strcmp(command, "vcpu-list")) {
+ printf("Usage: xl vcpu-list [Domain, ...]\n\n");
+ printf("List the VCPUs for all/some domains.\n\n");
}
}
@@ -1721,6 +1725,144 @@ int main_button_press(int argc, char **a
exit(0);
}
+static void print_vcpuinfo(struct libxl_ctx *ctx, uint32_t domid,
+ const struct libxl_vcpuinfo *vcpuinfo,
+ uint32_t nr_cpus)
+{
+ int i, l;
+ uint64_t *cpumap;
+ uint64_t pcpumap;
+
+ /* NAME ID VCPU */
+ printf("%-32s %5u %5u",
+ libxl_domid_to_name(ctx, domid), domid, vcpuinfo->vcpuid);
+ if (!vcpuinfo->online) {
+ /* CPU STA */
+ printf("%5c %3c%cp ", ''-'',
''-'', ''-'');
+ } else {
+ /* CPU STA */
+ printf("%5u %3c%c- ", vcpuinfo->cpu,
+ vcpuinfo->running ? ''r'' :
''-'',
+ vcpuinfo->blocked ? ''b'' :
''-'');
+ }
+ /* TIM */
+ printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9));
+ /* CPU AFFINITY */
+ pcpumap = nr_cpus > 64 ? -1 : ((1 << nr_cpus) - 1);
+ for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) {
+ if (*cpumap < pcpumap) {
+ break;
+ }
+ if (nr_cpus > 64) {
+ pcpumap = -1;
+ nr_cpus -= 64;
+ } else {
+ pcpumap = ((1 << nr_cpus) - 1);
+ nr_cpus = 0;
+ }
+ }
+ if (!nr_cpus) {
+ printf("any cpu\n");
+ } else {
+ for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) {
+ pcpumap = *cpumap;
+ for (i = 0; !(pcpumap & 1); ++i, pcpumap >>= 1)
+ ;
+ printf("%u", i);
+ for (l = i, pcpumap = (pcpumap >> 1); (pcpumap & 1); ++i,
pcpumap >>= 1)
+ ;
+ if (l < i) {
+ printf("-%u", i);
+ }
+ for (++i; pcpumap; ++i, pcpumap >>= 1) {
+ if (pcpumap & 1) {
+ printf(",%u", i);
+ for (l = i, pcpumap = (pcpumap >> 1); (pcpumap &
1); ++i, pcpumap >>= 1)
+ ;
+ if (l < i) {
+ printf("-%u", i);
+ }
+ ++i;
+ }
+ }
+ printf("\n");
+ nr_cpus = nr_cpus > 64 ? nr_cpus - 64 : 0;
+ }
+ }
+}
+
+void vcpulist(int argc, char **argv)
+{
+ struct libxl_ctx ctx;
+ struct libxl_dominfo *dominfo;
+ uint32_t domid;
+ struct libxl_vcpuinfo *vcpuinfo;
+ struct libxl_physinfo physinfo;
+ int nb_vcpu, nb_domain, cpusize;
+
+ if (libxl_ctx_init(&ctx, LIBXL_VERSION)) {
+ fprintf(stderr, "cannot init xl context\n");
+ return;
+ }
+ libxl_ctx_set_log(&ctx, log_callback, NULL);
+
+ if (libxl_get_physinfo(&ctx, &physinfo) != 0) {
+ fprintf(stderr, "libxl_physinfo failed.\n");
+ goto vcpulist_out;
+ }
+ printf("%-32s %5s %5s %5s %5s %9s %s\n",
+ "Name", "ID", "VCPU", "CPU",
"State", "Time(s)", "CPU Affinity");
+ if (!argc) {
+ if (!(dominfo = libxl_list_domain(&ctx, &nb_domain))) {
+ fprintf(stderr, "libxl_list_domain failed.\n");
+ goto vcpulist_out;
+ }
+ for (; nb_domain > 0; --nb_domain, ++dominfo) {
+ if (!(vcpuinfo = libxl_list_vcpu(&ctx, dominfo->domid,
&nb_vcpu, &cpusize))) {
+ fprintf(stderr, "libxl_list_vcpu failed.\n");
+ goto vcpulist_out;
+ }
+ for (; nb_vcpu > 0; --nb_vcpu, ++vcpuinfo) {
+ print_vcpuinfo(&ctx, dominfo->domid, vcpuinfo,
physinfo.nr_cpus);
+ }
+ }
+ } else {
+ for (; argc > 0; ++argv, --argc) {
+ if (domain_qualifier_to_domid(&ctx, *argv, &domid) < 0)
{
+ fprintf(stderr, "%s is an invalid domain
identifier\n", *argv);
+ }
+ if (!(vcpuinfo = libxl_list_vcpu(&ctx, domid, &nb_vcpu,
&cpusize))) {
+ fprintf(stderr, "libxl_list_vcpu failed.\n");
+ goto vcpulist_out;
+ }
+ for (; nb_vcpu > 0; --nb_vcpu, ++vcpuinfo) {
+ print_vcpuinfo(&ctx, domid, vcpuinfo, physinfo.nr_cpus);
+ }
+ }
+ }
+ vcpulist_out:
+ libxl_ctx_free(&ctx);
+}
+
+void main_vcpulist(int argc, char **argv)
+{
+ int opt;
+
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("vcpu-list");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ vcpulist(argc - 1, argv + 1);
+ exit(0);
+}
+
int main(int argc, char **argv)
{
if (argc < 2) {
@@ -1762,6 +1904,8 @@ int main(int argc, char **argv)
main_memset(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "button-press")) {
main_button_press(argc - 1, argv + 1);
+ } else if (!strcmp(argv[1], "vcpu-list")) {
+ main_vcpulist(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "help")) {
if (argc > 2)
help(argv[2]);
@@ -1773,4 +1917,3 @@ int main(int argc, char **argv)
exit(1);
}
}
-
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
This patch add vcpu-pin command to xl.
Acked-by: Vincent Hanquez <vincent.hanquez@eu.citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2233,6 +2233,7 @@ int libxl_get_physinfo(struct libxl_ctx
}
physinfo->threads_per_core = xcphysinfo.threads_per_core;
physinfo->cores_per_socket = xcphysinfo.cores_per_socket;
+ physinfo->max_cpu_id = xcphysinfo.max_cpu_id;
physinfo->nr_cpus = xcphysinfo.nr_cpus;
physinfo->cpu_khz = xcphysinfo.cpu_khz;
physinfo->total_pages = xcphysinfo.total_pages;
@@ -2282,3 +2283,9 @@ struct libxl_vcpuinfo *libxl_list_vcpu(s
}
return ret;
}
+
+int libxl_set_vcpuaffinity(struct libxl_ctx *ctx, uint32_t domid, uint32_t
vcpuid,
+ uint64_t *cpumap, int cpusize)
+{
+ return (xc_vcpu_setaffinity(ctx->xch, domid, vcpuid, cpumap, cpusize));
+}
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -374,6 +374,7 @@ struct libxl_physinfo {
uint32_t threads_per_core;
uint32_t cores_per_socket;
+ uint32_t max_cpu_id;
uint32_t nr_cpus;
uint32_t cpu_khz;
@@ -385,6 +386,7 @@ struct libxl_physinfo {
int libxl_get_physinfo(struct libxl_ctx *ctx, struct libxl_physinfo *physinfo);
struct libxl_vcpuinfo *libxl_list_vcpu(struct libxl_ctx *ctx, uint32_t domid,
int *nb_vcpu, int *cpusize);
-
+int libxl_set_vcpuaffinity(struct libxl_ctx *ctx, uint32_t domid, uint32_t
vcpuid,
+ uint64_t *cpumap, int cpusize);
#endif /* LIBXL_H */
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -877,6 +877,7 @@ static void help(char *command)
printf(" mem-set set the current memory
usage for a domain\n\n");
printf(" button-press indicate an ACPI button
press to the domain\n\n");
printf(" vcpu-list list the VCPUs for all/some
domains.\n\n");
+ printf(" vcpu-pin Set which CPUs a VCPU can
use.\n\n");
} else if(!strcmp(command, "create")) {
printf("Usage: xl create <ConfigFile> [options]
[vars]\n\n");
printf("Create a domain based on <ConfigFile>.\n\n");
@@ -937,6 +938,9 @@ static void help(char *command)
} else if (!strcmp(command, "vcpu-list")) {
printf("Usage: xl vcpu-list [Domain, ...]\n\n");
printf("List the VCPUs for all/some domains.\n\n");
+ } else if (!strcmp(command, "vcpu-pin")) {
+ printf("Usage: xl vcpu-pin <Domain> <VCPU|all>
<CPUs|all>\n\n");
+ printf("Set which CPUs a VCPU can use.\n\n");
}
}
@@ -1863,6 +1867,119 @@ void main_vcpulist(int argc, char **argv
exit(0);
}
+void vcpupin(char *d, const char *vcpu, char *cpu)
+{
+ struct libxl_ctx ctx;
+ struct libxl_vcpuinfo *vcpuinfo;
+ struct libxl_physinfo physinfo;
+ uint64_t *cpumap = NULL;
+
+ uint32_t domid, vcpuid, cpuida, cpuidb;
+ char *endptr, *toka, *tokb;
+ int i, nb_vcpu, cpusize;
+
+ vcpuid = strtoul(vcpu, &endptr, 10);
+ if (vcpu == endptr) {
+ if (strcmp(vcpu, "all")) {
+ fprintf(stderr, "Error: Invalid argument.\n");
+ return;
+ }
+ vcpuid = -1;
+ }
+
+ if (libxl_ctx_init(&ctx, LIBXL_VERSION)) {
+ fprintf(stderr, "cannot init xl context\n");
+ return;
+ }
+ libxl_ctx_set_log(&ctx, log_callback, NULL);
+
+ if (domain_qualifier_to_domid(&ctx, d, &domid) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n", d);
+ goto vcpupin_out1;
+ }
+ if (libxl_get_physinfo(&ctx, &physinfo) != 0) {
+ fprintf(stderr, "libxl_get_physinfo failed.\n");
+ goto vcpupin_out1;
+ }
+
+ cpumap = calloc(physinfo.max_cpu_id + 1, sizeof (uint64_t));
+ if (!cpumap) {
+ goto vcpupin_out1;
+ }
+ if (strcmp(cpu, "all")) {
+ for (toka = strtok(cpu, ","), i = 0; toka; toka =
strtok(NULL, ","), ++i) {
+ cpuida = strtoul(toka, &endptr, 10);
+ if (toka == endptr) {
+ fprintf(stderr, "Error: Invalid argument.\n");
+ goto vcpupin_out;
+ }
+ if (*endptr == ''-'') {
+ tokb = endptr + 1;
+ cpuidb = strtoul(tokb, &endptr, 10);
+ if ((tokb == endptr) || (cpuida > cpuidb)) {
+ fprintf(stderr, "Error: Invalid argument.\n");
+ goto vcpupin_out;
+ }
+ while (cpuida <= cpuidb) {
+ cpumap[cpuida / 64] |= (1 << (cpuida % 64));
+ ++cpuida;
+ }
+ } else {
+ cpumap[cpuida / 64] |= (1 << (cpuida % 64));
+ }
+ }
+ }
+ else {
+ memset(cpumap, -1, sizeof (uint64_t) * (physinfo.max_cpu_id + 1));
+ }
+
+ if (vcpuid != -1) {
+ if (libxl_set_vcpuaffinity(&ctx, domid, vcpuid,
+ cpumap, physinfo.max_cpu_id + 1) == -1) {
+ fprintf(stderr, "Could not set affinity for vcpu
`%u''.\n", vcpuid);
+ }
+ }
+ else {
+ if (!(vcpuinfo = libxl_list_vcpu(&ctx, domid, &nb_vcpu,
&cpusize))) {
+ fprintf(stderr, "libxl_list_vcpu failed.\n");
+ goto vcpupin_out;
+ }
+ for (; nb_vcpu > 0; --nb_vcpu, ++vcpuinfo) {
+ if (libxl_set_vcpuaffinity(&ctx, domid, vcpuinfo->vcpuid,
+ cpumap, physinfo.max_cpu_id + 1) == -1)
{
+ fprintf(stderr, "libxl_list_vcpu failed on vcpu
`%u''.\n", vcpuinfo->vcpuid);
+ }
+ }
+ }
+ vcpupin_out1:
+ free(cpumap);
+ vcpupin_out:
+ libxl_ctx_free(&ctx);
+}
+
+int main_vcpupin(int argc, char **argv)
+{
+ int opt;
+
+ if (argc != 4) {
+ help("vcpu-pin");
+ exit(0);
+ }
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("vcpu-pin");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ vcpupin(argv[1], argv[2] , argv[3]);
+ exit(0);
+}
+
int main(int argc, char **argv)
{
if (argc < 2) {
@@ -1906,6 +2023,8 @@ int main(int argc, char **argv)
main_button_press(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "vcpu-list")) {
main_vcpulist(argc - 1, argv + 1);
+ } else if (!strcmp(argv[1], "vcpu-pin")) {
+ main_vcpupin(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "help")) {
if (argc > 2)
help(argv[2]);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
This patch add vcpu-set command to xl.
Acked-by: Vincent Hanquez <vincent.hanquez@eu.citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2289,3 +2289,26 @@ int libxl_set_vcpuaffinity(struct libxl_
{
return (xc_vcpu_setaffinity(ctx->xch, domid, vcpuid, cpumap, cpusize));
}
+
+int libxl_set_vcpucount(struct libxl_ctx *ctx, uint32_t domid, uint32_t count)
+{
+ xc_domaininfo_t domaininfo;
+ char *dompath;
+ int i;
+
+ if (xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo) != 1) {
+ return ERROR_FAIL;
+ }
+ if (!count || ((domaininfo.max_vcpu_id + 1) < count)) {
+ return ERROR_INVAL;
+ }
+ if (!(dompath = libxl_xs_get_dompath(ctx, domid)))
+ return ERROR_FAIL;
+
+ for (i = 0; i <= domaininfo.max_vcpu_id; ++i) {
+ libxl_xs_write(ctx, XBT_NULL,
+ libxl_sprintf(ctx, "%s/cpu/%u/availability",
dompath, i),
+ "%s", ((1 << i) & ((1 <<
count) - 1)) ? "online" : "offline");
+ }
+ return 0;
+}
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -388,5 +388,6 @@ struct libxl_vcpuinfo *libxl_list_vcpu(s
int *nb_vcpu, int *cpusize);
int libxl_set_vcpuaffinity(struct libxl_ctx *ctx, uint32_t domid, uint32_t
vcpuid,
uint64_t *cpumap, int cpusize);
+int libxl_set_vcpucount(struct libxl_ctx *ctx, uint32_t domid, uint32_t count);
#endif /* LIBXL_H */
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -878,6 +878,7 @@ static void help(char *command)
printf(" button-press indicate an ACPI button
press to the domain\n\n");
printf(" vcpu-list list the VCPUs for all/some
domains.\n\n");
printf(" vcpu-pin Set which CPUs a VCPU can
use.\n\n");
+ printf(" vcpu-set Set the number of active
VCPUs allowed for the domain.\n\n");
} else if(!strcmp(command, "create")) {
printf("Usage: xl create <ConfigFile> [options]
[vars]\n\n");
printf("Create a domain based on <ConfigFile>.\n\n");
@@ -941,6 +942,9 @@ static void help(char *command)
} else if (!strcmp(command, "vcpu-pin")) {
printf("Usage: xl vcpu-pin <Domain> <VCPU|all>
<CPUs|all>\n\n");
printf("Set which CPUs a VCPU can use.\n\n");
+ } else if (!strcmp(command, "vcpu-set")) {
+ printf("Usage: xl vcpu-set <Domain>
<vCPUs>\n\n");
+ printf("Set the number of active VCPUs for allowed for the
domain.\n\n");
}
}
@@ -1980,6 +1984,60 @@ int main_vcpupin(int argc, char **argv)
exit(0);
}
+void vcpuset(char *d, char* nr_vcpus)
+{
+ struct libxl_ctx ctx;
+ char *endptr;
+ uint32_t domid;
+ unsigned int max_vcpus;
+
+ max_vcpus = strtoul(nr_vcpus, &endptr, 10);
+ if (nr_vcpus == endptr) {
+ fprintf(stderr, "Error: Invalid argument.\n");
+ return;
+ }
+
+ if (libxl_ctx_init(&ctx, LIBXL_VERSION)) {
+ fprintf(stderr, "cannot init xl context\n");
+ return;
+ }
+ libxl_ctx_set_log(&ctx, log_callback, NULL);
+
+ if (domain_qualifier_to_domid(&ctx, d, &domid) < 0) {
+ fprintf(stderr, "%s is an invalid domain identifier\n", d);
+ goto vcpuset_out;
+ }
+ if (libxl_set_vcpucount(&ctx, domid, max_vcpus) == ERROR_INVAL) {
+ fprintf(stderr, "Error: Cannot set vcpus greater than max vcpus on
running domain or lesser than 1.\n");
+ }
+
+ vcpuset_out:
+ libxl_ctx_free(&ctx);
+}
+
+int main_vcpuset(int argc, char **argv)
+{
+ int opt;
+
+ if (argc != 3) {
+ help("vcpu-set");
+ exit(0);
+ }
+ while ((opt = getopt(argc, argv, "h")) != -1) {
+ switch (opt) {
+ case ''h'':
+ help("vcpu-set");
+ exit(0);
+ default:
+ fprintf(stderr, "option `%c'' not supported.\n",
opt);
+ break;
+ }
+ }
+
+ vcpuset(argv[1], argv[2]);
+ exit(0);
+}
+
int main(int argc, char **argv)
{
if (argc < 2) {
@@ -2025,6 +2083,8 @@ int main(int argc, char **argv)
main_vcpulist(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "vcpu-pin")) {
main_vcpupin(argc - 1, argv + 1);
+ } else if (!strcmp(argv[1], "vcpu-set")) {
+ main_vcpuset(argc - 1, argv + 1);
} else if (!strcmp(argv[1], "help")) {
if (argc > 2)
help(argv[2]);
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Eric Chanudet
2010-Apr-01 16:27 UTC
[Xen-devel] [PATCH 4 of 4] xl: tsc_mode parameter in guest configuration file
This patch handle tsc_mode argument in guest configuration file.
Acked-by: Vincent Hanquez <vincent.hanquez@eu.citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -74,6 +74,7 @@ typedef struct {
int vpt_align;
int max_vcpus;
int cur_vcpus;
+ int tsc_mode;
uint32_t max_memkb;
uint32_t target_memkb;
uint32_t video_memkb;
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -72,6 +72,7 @@ int build_pre(struct libxl_ctx *ctx, uin
xc_domain_set_memmap_limit(ctx->xch, domid,
(info->hvm) ? info->max_memkb :
(info->max_memkb + info->u.pv.slack_memkb));
+ xc_domain_set_tsc_info(ctx->xch, domid, info->tsc_mode, 0, 0, 0);
if (info->hvm) {
unsigned long shadow;
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -235,6 +235,7 @@ static void printf_info(libxl_domain_cre
printf("hpet: %d\n", b_info->hpet);
printf("vpt_align: %d\n", b_info->vpt_align);
printf("max_vcpus: %d\n", b_info->max_vcpus);
+ printf("tsc_mode: %d\n", b_info->tsc_mode);
printf("max_memkb: %d\n", b_info->max_memkb);
printf("target_memkb: %d\n", b_info->target_memkb);
printf("kernel: %s\n", b_info->kernel);
@@ -382,6 +383,9 @@ static void parse_config_file(const char
b_info->target_memkb = b_info->max_memkb;
}
+ if (!xlu_cfg_get_long(config, "tsc_mode", &l))
+ b_info->tsc_mode = l;
+
if (!xlu_cfg_get_long (config, "shadow_memory", &l))
b_info->shadow_memkb = l * 1024;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel