aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl
diff options
context:
space:
mode:
authorYang Zhang <yang.z.zhang@Intel.com>2012-06-28 17:51:56 +0100
committerYang Zhang <yang.z.zhang@Intel.com>2012-06-28 17:51:56 +0100
commite1e1e98cacd82fa054ac3c6b381d9833236110e0 (patch)
tree77708e08b3f5c559b3c74d0323d7d33155e00aaa /tools/libxl
parent928c75ce59fc11c707b8bfd0b99ce0c07ab89926 (diff)
downloadxen-e1e1e98cacd82fa054ac3c6b381d9833236110e0.tar.gz
xen-e1e1e98cacd82fa054ac3c6b381d9833236110e0.tar.bz2
xen-e1e1e98cacd82fa054ac3c6b381d9833236110e0.zip
libxl: allow setting more than 31 vcpus
In current implementation, it uses integer to record current avail cpus and this only allows user to specify 31 vcpus. In following patch, it uses cpumap instead integer which make more sense than before. Also there is no limit to the max vcpus. Signed-off-by: Yang Zhang <yang.z.zhang@Intel.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl')
-rw-r--r--tools/libxl/libxl_create.c9
-rw-r--r--tools/libxl/libxl_dm.c23
-rw-r--r--tools/libxl/libxl_dom.c6
-rw-r--r--tools/libxl/libxl_types.idl2
-rw-r--r--tools/libxl/libxl_utils.c27
-rw-r--r--tools/libxl/libxl_utils.h4
-rw-r--r--tools/libxl/xl_cmdimpl.c9
7 files changed, 63 insertions, 17 deletions
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 08e5536c0c..4599e733b1 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -22,6 +22,7 @@
#include <xc_dom.h>
#include <xenguest.h>
+#include <xen/hvm/hvm_info_table.h>
void libxl_domain_config_init(libxl_domain_config *d_config)
{
@@ -201,8 +202,12 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
if (!b_info->max_vcpus)
b_info->max_vcpus = 1;
- if (!b_info->cur_vcpus)
- b_info->cur_vcpus = 1;
+ if (!b_info->avail_vcpus.size) {
+ if (libxl_cpumap_alloc(CTX, &b_info->avail_vcpus, 1))
+ return ERROR_FAIL;
+ libxl_cpumap_set(&b_info->avail_vcpus, 0);
+ } else if (b_info->avail_vcpus.size > HVM_MAX_VCPUS)
+ return ERROR_FAIL;
if (!b_info->cpumap.size) {
if (libxl_cpumap_alloc(CTX, &b_info->cpumap, 0))
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 340fcfa846..2edc734cff 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -160,6 +160,8 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
}
if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
int ioemu_vifs = 0;
+ int nr_set_cpus = 0;
+ char *s;
if (b_info->u.hvm.serial) {
flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL);
@@ -200,11 +202,13 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc,
libxl__sprintf(gc, "%d", b_info->max_vcpus),
NULL);
}
- if (b_info->cur_vcpus) {
- flexarray_vappend(dm_args, "-vcpu_avail",
- libxl__sprintf(gc, "0x%x", b_info->cur_vcpus),
- NULL);
- }
+
+ nr_set_cpus = libxl_cpumap_count_set(&b_info->avail_vcpus);
+ s = libxl_cpumap_to_hex_string(&b_info->avail_vcpus);
+ flexarray_vappend(dm_args, "-vcpu_avail",
+ libxl__sprintf(gc, "%s", s), NULL);
+ free(s);
+
for (i = 0; i < num_vifs; i++) {
if (vifs[i].nictype == LIBXL_NIC_TYPE_IOEMU) {
char *smac = libxl__sprintf(gc,
@@ -443,11 +447,14 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
}
if (b_info->max_vcpus > 1) {
flexarray_append(dm_args, "-smp");
- if (b_info->cur_vcpus)
+ if (b_info->avail_vcpus.size) {
+ int nr_set_cpus = 0;
+ nr_set_cpus = libxl_cpumap_count_set(&b_info->avail_vcpus);
+
flexarray_append(dm_args, libxl__sprintf(gc, "%d,maxcpus=%d",
b_info->max_vcpus,
- b_info->cur_vcpus));
- else
+ nr_set_cpus));
+ } else
flexarray_append(dm_args, libxl__sprintf(gc, "%d",
b_info->max_vcpus));
}
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index a2e66558d3..d88629fc18 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -199,8 +199,8 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid,
ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn);
for (i = 0; i < info->max_vcpus; i++) {
ents[12+(i*2)] = libxl__sprintf(gc, "cpu/%d/availability", i);
- ents[12+(i*2)+1] = (i && info->cur_vcpus && !(info->cur_vcpus & (1 << i)))
- ? "offline" : "online";
+ ents[12+(i*2)+1] = libxl_cpumap_test(&info->avail_vcpus, i)
+ ? "online" : "offline";
}
hvm_ents = NULL;
@@ -354,7 +354,7 @@ static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET);
va_hvm->apic_mode = libxl_defbool_val(info->u.hvm.apic);
va_hvm->nr_vcpus = info->max_vcpus;
- memcpy(va_hvm->vcpu_online, &info->cur_vcpus, sizeof(info->cur_vcpus));
+ memcpy(va_hvm->vcpu_online, info->avail_vcpus.map, info->avail_vcpus.size);
for (i = 0, sum = 0; i < va_hvm->length; i++)
sum += ((uint8_t *) va_hvm)[i];
va_hvm->checksum -= sum;
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index b727abbe5d..a4a8e258f4 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -237,7 +237,7 @@ libxl_domain_sched_params = Struct("domain_sched_params",[
libxl_domain_build_info = Struct("domain_build_info",[
("max_vcpus", integer),
- ("cur_vcpus", integer),
+ ("avail_vcpus", libxl_cpumap),
("cpumap", libxl_cpumap),
("tsc_mode", libxl_tsc_mode),
("max_memkb", MemKB),
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 2acf7d4a43..d07a5a7a58 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -511,7 +511,7 @@ void libxl_cpumap_dispose(libxl_cpumap *map)
free(map->map);
}
-int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu)
+int libxl_cpumap_test(const libxl_cpumap *cpumap, int cpu)
{
if (cpu >= cpumap->size * 8)
return 0;
@@ -532,6 +532,31 @@ void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu)
cpumap->map[cpu / 8] &= ~(1 << (cpu & 7));
}
+int libxl_cpumap_count_set(const libxl_cpumap *cpumap)
+{
+ int i, nr_set_cpus = 0;
+ libxl_for_each_set_cpu(i, *cpumap)
+ nr_set_cpus++;
+
+ return nr_set_cpus;
+}
+
+/* NB. caller is responsible for freeing the memory */
+char *libxl_cpumap_to_hex_string(const libxl_cpumap *cpumap)
+{
+ int i = cpumap->size;
+ char *p = libxl__zalloc(NULL, cpumap->size * 2 + 3);
+ char *q = p;
+ strncpy(p, "0x", 2);
+ p += 2;
+ while(--i >= 0) {
+ sprintf(p, "%02x", cpumap->map[i]);
+ p += 2;
+ }
+ *p = '\0';
+ return q;
+}
+
int libxl_get_max_cpus(libxl_ctx *ctx)
{
return xc_get_max_cpus(ctx->xch);
diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
index 7ab0c0915c..a762734c3f 100644
--- a/tools/libxl/libxl_utils.h
+++ b/tools/libxl/libxl_utils.h
@@ -64,9 +64,11 @@ int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid, const char *vdev,
libxl_device_disk *disk);
int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap, int max_cpus);
-int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu);
+int libxl_cpumap_test(const libxl_cpumap *cpumap, int cpu);
void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu);
void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu);
+int libxl_cpumap_count_set(const libxl_cpumap *cpumap);
+char *libxl_cpumap_to_hex_string(const libxl_cpumap *cpumap);
static inline void libxl_cpumap_set_any(libxl_cpumap *cpumap)
{
memset(cpumap->map, -1, cpumap->size);
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 02b55f1305..4101669dc3 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -647,7 +647,14 @@ static void parse_config_data(const char *config_source,
if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) {
b_info->max_vcpus = l;
- b_info->cur_vcpus = (1 << l) - 1;
+
+ if (libxl_cpumap_alloc(ctx, &b_info->avail_vcpus, l)) {
+ fprintf(stderr, "Unable to allocate cpumap\n");
+ exit(1);
+ }
+ libxl_cpumap_set_none(&b_info->avail_vcpus);
+ while (l-- > 0)
+ libxl_cpumap_set((&b_info->avail_vcpus), l);
}
if (!xlu_cfg_get_long (config, "maxvcpus", &l, 0))