From: Keir Fraser Date: Fri, 7 May 2010 08:36:58 +0000 (+0100) Subject: libxl: Support cpupools X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12220 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c4826676c4550e36296f34dc48228cf91af5a86d;p=xen.git libxl: Support cpupools Signed-off-by: Juergen Gross --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 6d9f011b88..02097d8004 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -111,6 +111,12 @@ int libxl_domain_make(struct libxl_ctx *ctx, libxl_domain_create_info *info, 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; @@ -163,6 +169,7 @@ retry_transaction: 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); @@ -426,6 +433,26 @@ int libxl_domain_info(struct libxl_ctx *ctx, struct libxl_dominfo *info_r, 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) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 4f5c493f07..c5186369ae 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -36,6 +36,10 @@ struct libxl_dominfo { uint32_t vcpu_online; }; +struct libxl_poolinfo { + uint32_t poolid; +}; + struct libxl_vminfo { uint8_t uuid[16]; uint32_t domid; @@ -85,6 +89,8 @@ typedef struct { uint8_t uuid[16]; char **xsdata; char **platformdata; + uint32_t poolid; + char *poolname; } libxl_domain_create_info; typedef struct { @@ -340,6 +346,7 @@ int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num); 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; diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 8fc7d0d89c..08fa2ca909 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -78,6 +78,41 @@ int libxl_name_to_domid(struct libxl_ctx *ctx, const char *name, 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))); diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 5d8018109a..ddb1b4115a 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -21,6 +21,8 @@ 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); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index d3a86a1d9a..30d1e5e452 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -87,8 +87,7 @@ struct save_file_header { #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; @@ -101,14 +100,32 @@ static int domain_qualifier_to_domid(const char *p, uint32_t *domid_r, } 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) @@ -146,6 +163,7 @@ static void init_create_info(libxl_domain_create_info *c_info) 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) @@ -277,6 +295,7 @@ static void printf_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 @@ -434,6 +453,10 @@ static void parse_config_data(const char *configfile_filename_report, 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 */