]> xenbits.xensource.com Git - xen.git/commitdiff
libxl: Support cpupools
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 7 May 2010 08:36:58 +0000 (09:36 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 7 May 2010 08:36:58 +0000 (09:36 +0100)
Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/libxl_utils.c
tools/libxl/libxl_utils.h
tools/libxl/xl_cmdimpl.c

index 6d9f011b885d6478cee62e56030a68588543a284..02097d800474cd6c2402a745b770fa784f217957 100644 (file)
@@ -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)
 {
index 4f5c493f0764e220e9fa1f9637620c783a67ca2a..c5186369aef93fae72a49266fedde4a4df2ab250 100644 (file)
@@ -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;
index 8fc7d0d89ce770fbf863d1b48fc80cfd440b7854..08fa2ca9094bb02dfe9d5301d966d551d6f1a384 100644 (file)
@@ -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)));
index 5d8018109ab69c14300fedd17ba3b27efdb709f3..ddb1b4115ad9578f32d840c95d0c2817b5c66a24 100644 (file)
@@ -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);
index d3a86a1d9ae776dbf65ba549027e22b94db8b5f7..30d1e5e452c04a2c41bb705c873b601d4f7419b4 100644 (file)
@@ -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 */