aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl/libxl_utils.c
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2010-10-21 18:36:22 +0100
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2010-10-21 18:36:22 +0100
commitf66601c5629d5bd82797827a8f89dbdbcf410771 (patch)
tree2843c418af03c3f9bafb1409bcf3a91319b274e7 /tools/libxl/libxl_utils.c
parent18dd3dbdf2721c656676a15dac91eefb7b46e3cd (diff)
downloadxen-f66601c5629d5bd82797827a8f89dbdbcf410771.tar.gz
xen-f66601c5629d5bd82797827a8f89dbdbcf410771.tar.bz2
xen-f66601c5629d5bd82797827a8f89dbdbcf410771.zip
tools: cpupools: xl: commands and library changes
Support of cpu pools in libxl and xl: library functions xl cpupool-create xl cpupool-list xl cpupool-destroy xl cpupool-cpu-add xl cpupool-cpu-remove xl cpupool-migrate Renamed all cpu pool related names to *cpupool* Signed-off-by: juergen.gross@ts.fujitsu.com Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl/libxl_utils.c')
-rw-r--r--tools/libxl/libxl_utils.c98
1 files changed, 84 insertions, 14 deletions
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 5792de8b9a..01477712cd 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -31,6 +31,17 @@
#include "libxl_utils.h"
#include "libxl_internal.h"
+struct schedid_name {
+ char *name;
+ int id;
+};
+
+static struct schedid_name schedid_name[] = {
+ { "credit", XEN_SCHEDULER_CREDIT },
+ { "sedf", XEN_SCHEDULER_SEDF },
+ { "credit2", XEN_SCHEDULER_CREDIT2 },
+ { NULL, -1 }
+};
unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus)
{
@@ -90,7 +101,7 @@ int libxl_name_to_domid(libxl_ctx *ctx, const char *name,
return ret;
}
-char *libxl_poolid_to_name(libxl_ctx *ctx, uint32_t poolid)
+char *libxl_cpupoolid_to_name(libxl_ctx *ctx, uint32_t poolid)
{
unsigned int len;
char path[strlen("/local/pool") + 12];
@@ -103,42 +114,63 @@ char *libxl_poolid_to_name(libxl_ctx *ctx, uint32_t poolid)
return s;
}
-char *libxl__poolid_to_name(libxl__gc *gc, uint32_t poolid)
+char *libxl__cpupoolid_to_name(libxl__gc *gc, uint32_t poolid)
{
- char *s = libxl_poolid_to_name(libxl__gc_owner(gc), poolid);
+ char *s = libxl_cpupoolid_to_name(libxl__gc_owner(gc), poolid);
if ( s )
libxl__ptr_add(gc, s);
return s;
}
-int libxl_name_to_poolid(libxl_ctx *ctx, const char *name,
+int libxl_name_to_cpupoolid(libxl_ctx *ctx, const char *name,
uint32_t *poolid)
{
int i, nb_pools;
char *poolname;
- libxl_poolinfo *poolinfo;
+ libxl_cpupoolinfo *poolinfo;
int ret = -1;
- poolinfo = libxl_list_pool(ctx, &nb_pools);
+ poolinfo = libxl_list_cpupool(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;
- ret = 0;
+ if (ret && ((poolname = libxl_cpupoolid_to_name(ctx,
+ poolinfo[i].poolid)) != NULL)) {
+ if (strcmp(poolname, name) == 0) {
+ *poolid = poolinfo[i].poolid;
+ ret = 0;
+ }
free(poolname);
- break;
}
- free(poolname);
+ libxl_cpupoolinfo_destroy(poolinfo + i);
}
free(poolinfo);
return ret;
}
+int libxl_name_to_schedid(libxl_ctx *ctx, const char *name)
+{
+ int i;
+
+ for (i = 0; schedid_name[i].name != NULL; i++)
+ if (strcmp(name, schedid_name[i].name) == 0)
+ return schedid_name[i].id;
+
+ return -1;
+}
+
+char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid)
+{
+ int i;
+
+ for (i = 0; schedid_name[i].name != NULL; i++)
+ if (schedid_name[i].id == schedid)
+ return schedid_name[i].name;
+
+ return "unknown";
+}
+
int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -676,6 +708,44 @@ out:
return rc;
}
+int libxl_cpumap_alloc(libxl_cpumap *cpumap, int max_cpus)
+{
+ int elems;
+
+ elems = (max_cpus + 63) / 64;
+ cpumap->map = calloc(elems, sizeof(*cpumap->map));
+ if (!cpumap->map)
+ return ERROR_NOMEM;
+ cpumap->size = elems * 8; /* size in bytes */
+ return 0;
+}
+
+void libxl_cpumap_destroy(libxl_cpumap *map)
+{
+ free(map->map);
+}
+
+int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu)
+{
+ if (cpu >= cpumap->size * 8)
+ return 0;
+ return (cpumap->map[cpu / 64] & (1L << (cpu & 63))) ? 1 : 0;
+}
+
+void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu)
+{
+ if (cpu >= cpumap->size * 8)
+ return;
+ cpumap->map[cpu / 64] |= 1L << (cpu & 63);
+}
+
+void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu)
+{
+ if (cpu >= cpumap->size * 8)
+ return;
+ cpumap->map[cpu / 64] &= ~(1L << (cpu & 63));
+}
+
int libxl_get_max_cpus(libxl_ctx *ctx)
{
return xc_get_max_cpus(ctx->xch);