return ERROR_FAIL;
}
+ ret = xc_cpupool_movedomain(ctx->xch, info->poolid, *domid);
+ if (ret < 0) {
+ XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "domain move fail");
+ return ERROR_FAIL;
+ }
+
dom_path = libxl_xs_get_dompath(ctx, *domid);
if (!dom_path)
return ERROR_FAIL;
xs_write(ctx->xsh, t, libxl_sprintf(ctx, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
xs_write(ctx->xsh, t, libxl_sprintf(ctx, "%s/name", vm_path), info->name, strlen(info->name));
+ xs_write(ctx->xsh, t, libxl_sprintf(ctx, "%s/pool_name", vm_path), info->poolname, strlen(info->poolname));
libxl_xs_writev(ctx, t, dom_path, info->xsdata);
libxl_xs_writev(ctx, t, libxl_sprintf(ctx, "%s/platform", dom_path), info->platformdata);
return 0;
}
+struct libxl_poolinfo * libxl_list_pool(struct libxl_ctx *ctx, int *nb_pool)
+{
+ struct libxl_poolinfo *ptr;
+ int i, ret;
+ xc_cpupoolinfo_t info[256];
+ int size = 256;
+
+ ptr = calloc(size, sizeof(struct libxl_poolinfo));
+ if (!ptr) return NULL;
+
+ ret = xc_cpupool_getinfo(ctx->xch, 0, 256, info);
+ if (ret<0) return NULL;
+
+ for (i = 0; i < ret; i++) {
+ ptr[i].poolid = info[i].cpupool_id;
+ }
+ *nb_pool = ret;
+ return ptr;
+}
+
/* this API call only list VM running on this host. a VM can be an aggregate of multiple domains. */
struct libxl_vminfo * libxl_list_vm(struct libxl_ctx *ctx, int *nb_vm)
{
uint32_t vcpu_online;
};
+struct libxl_poolinfo {
+ uint32_t poolid;
+};
+
struct libxl_vminfo {
uint8_t uuid[16];
uint32_t domid;
uint8_t uuid[16];
char **xsdata;
char **platformdata;
+ uint32_t poolid;
+ char *poolname;
} libxl_domain_create_info;
typedef struct {
int libxl_domain_info(struct libxl_ctx*, struct libxl_dominfo *info_r,
uint32_t domid);
struct libxl_dominfo * libxl_list_domain(struct libxl_ctx*, int *nb_domain);
+struct libxl_poolinfo * libxl_list_pool(struct libxl_ctx*, int *nb_pool);
struct libxl_vminfo * libxl_list_vm(struct libxl_ctx *ctx, int *nb_vm);
typedef struct libxl_device_model_starting libxl_device_model_starting;
return -1;
}
+char *libxl_poolid_to_name(struct libxl_ctx *ctx, uint32_t poolid)
+{
+ unsigned int len;
+ char path[strlen("/local/pool") + 12];
+ char *s;
+
+ snprintf(path, sizeof(path), "/local/pool/%d/name", poolid);
+ s = xs_read(ctx->xsh, XBT_NULL, path, &len);
+ libxl_ptr_add(ctx, s);
+ return s;
+}
+
+int libxl_name_to_poolid(struct libxl_ctx *ctx, const char *name,
+ uint32_t *poolid)
+{
+ int i, nb_pools;
+ char *poolname;
+ struct libxl_poolinfo *poolinfo;
+
+ poolinfo = libxl_list_pool(ctx, &nb_pools);
+ if (!poolinfo)
+ return ERROR_NOMEM;
+
+ for (i = 0; i < nb_pools; i++) {
+ poolname = libxl_poolid_to_name(ctx, poolinfo[i].poolid);
+ if (!poolname)
+ continue;
+ if (strcmp(poolname, name) == 0) {
+ *poolid = poolinfo[i].poolid;
+ return 0;
+ }
+ }
+ return -1;
+}
+
int libxl_get_stubdom_id(struct libxl_ctx *ctx, int guest_domid)
{
char * stubdom_id_s = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/image/device-model-domid", libxl_xs_get_dompath(ctx, guest_domid)));
unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus);
int libxl_name_to_domid(struct libxl_ctx *ctx, const char *name, uint32_t *domid);
char *libxl_domid_to_name(struct libxl_ctx *ctx, uint32_t domid);
+int libxl_name_to_poolid(struct libxl_ctx *ctx, const char *name, uint32_t *poolid);
+char *libxl_poolid_to_name(struct libxl_ctx *ctx, uint32_t poolid);
int libxl_get_stubdom_id(struct libxl_ctx *ctx, int guest_domid);
int libxl_is_stubdom(struct libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid);
int libxl_create_logfile(struct libxl_ctx *ctx, char *name, char **full_name);
#define SAVEFILE_BYTEORDER_VALUE ((uint32_t)0x01020304UL)
-static int domain_qualifier_to_domid(const char *p, uint32_t *domid_r,
- int *was_name_r)
+static int qualifier_to_id(const char *p, uint32_t *id_r)
{
int i, alldigit;
}
if (i > 0 && alldigit) {
- *domid_r = strtoul(p, NULL, 10);
- if (was_name_r) *was_name_r = 0;
+ *id_r = strtoul(p, NULL, 10);
return 0;
} else {
/* check here if it's a uuid and do proper conversion */
}
- if (was_name_r) *was_name_r = 1;
- return libxl_name_to_domid(&ctx, p, domid_r);
+ return 1;
+}
+
+static int domain_qualifier_to_domid(const char *p, uint32_t *domid_r,
+ int *was_name_r)
+{
+ int was_name;
+
+ was_name = qualifier_to_id(p, domid_r);
+ if (was_name_r) *was_name_r = was_name;
+ return was_name ? libxl_name_to_domid(&ctx, p, domid_r) : 0;
+}
+
+static int pool_qualifier_to_poolid(const char *p, uint32_t *poolid_r,
+ int *was_name_r)
+{
+ int was_name;
+
+ was_name = qualifier_to_id(p, poolid_r);
+ if (was_name_r) *was_name_r = was_name;
+ return was_name ? libxl_name_to_poolid(&ctx, p, poolid_r) : 0;
}
static void find_domain(const char *p)
c_info->hvm = 1;
c_info->oos = 1;
c_info->ssidref = 0;
+ c_info->poolid = 0;
}
static void init_build_info(libxl_domain_build_info *b_info, libxl_domain_create_info *c_info)
(c_info->uuid)[4], (c_info->uuid)[5], (c_info->uuid)[6], (c_info->uuid)[7],
(c_info->uuid)[8], (c_info->uuid)[9], (c_info->uuid)[10], (c_info->uuid)[11],
(c_info->uuid)[12], (c_info->uuid)[13], (c_info->uuid)[14], (c_info->uuid)[15]);
+ printf("cpupool: %s (%d)\n", c_info->poolname, c_info->poolid);
if (c_info->xsdata)
printf("xsdata: contains data\n");
else
if (!xlu_cfg_get_long(config, "oos", &l))
c_info->oos = l;
+ if (!xlu_cfg_get_string (config, "pool", &buf))
+ pool_qualifier_to_poolid(buf, &c_info->poolid, NULL);
+ c_info->poolname = libxl_poolid_to_name(&ctx, c_info->poolid);
+
init_build_info(b_info, c_info);
/* the following is the actual config parsing with overriding values in the structures */