* [PATCH 0 of 3] support of cpupools in xl
@ 2010-10-08 11:23 Juergen Gross
2010-10-08 11:23 ` [PATCH 1 of 3] Support arbitrary numbers of physical cpus for cpupools in tools Juergen Gross
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Juergen Gross @ 2010-10-08 11:23 UTC (permalink / raw)
To: xen-devel
This is the next version of my patches to support cpupools in xl/libxl.
For full functionality it is necessary to change cpumask handling for cpupools
in libxc (patch 1). Patch 2 adds the full cpupool support in xl.
Patch 3 adds an example configuration file for xm/xl pool-create.
Changes since last version: requests of Ian Campbell, Gianni Tedesco, Stefano
Stabellini
18 files changed, 1018 insertions(+), 237 deletions(-)
tools/examples/README | 1
tools/examples/cpupool | 17 +
tools/libxc/xc_cpupool.c | 118 +++++---
tools/libxc/xc_misc.c | 14 +
tools/libxc/xenctrl.h | 26 -
tools/libxl/libxl.c | 252 ++++++++++++++++--
tools/libxl/libxl.h | 21 +
tools/libxl/libxl.idl | 12
tools/libxl/libxl_internal.h | 2
tools/libxl/libxl_utils.c | 98 ++++++-
tools/libxl/libxl_utils.h | 10
tools/libxl/libxltypes.py | 5
tools/libxl/libxlu_cfg_l.c | 30 --
tools/libxl/libxlu_cfg_l.h | 18 -
tools/libxl/xl.h | 6
tools/libxl/xl_cmdimpl.c | 494 +++++++++++++++++++++++++++++++++++--
tools/libxl/xl_cmdtable.c | 35 ++
tools/python/xen/lowlevel/xc/xc.c | 96 ++-----
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH 1 of 3] Support arbitrary numbers of physical cpus for cpupools in tools 2010-10-08 11:23 [PATCH 0 of 3] support of cpupools in xl Juergen Gross @ 2010-10-08 11:23 ` Juergen Gross 2010-10-08 11:23 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 2010-10-08 11:23 ` [PATCH 3 of 3] add example cpupool config file Juergen Gross 2 siblings, 0 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-08 11:23 UTC (permalink / raw) To: xen-devel [-- Attachment #1: Type: text/plain, Size: 876 bytes --] To be able to support arbitrary numbers of physical cpus it was necessary to include the size of cpumaps in the xc-interfaces for cpu pools. These were: definition of xc_cpupoolinfo_t xc_cpupool_getinfo() xc_cpupool_freeinfo() xc_cpupool_getinfo() and xc_cpupool_freeinfo() are changed to allocate the needed buffer and return it. Signed-off-by: juergen.gross@ts.fujitsu.com 8 files changed, 182 insertions(+), 151 deletions(-) tools/libxc/xc_cpupool.c | 118 ++++++++++++++++++++++--------------- tools/libxc/xc_misc.c | 14 ++++ tools/libxc/xenctrl.h | 26 ++++---- tools/libxl/libxl.c | 49 +++++++-------- tools/libxl/libxl.h | 3 tools/libxl/libxl_utils.c | 5 + tools/libxl/xl_cmdimpl.c | 22 +++--- tools/python/xen/lowlevel/xc/xc.c | 96 ++++++++++++------------------ [-- Attachment #2: xen-work-3.patch --] [-- Type: text/x-patch, Size: 20019 bytes --] # HG changeset patch # User Juergen Gross <juergen.gross@ts.fujitsu.com> # Date 1286536603 -7200 # Node ID fc17462ba612d67069c1110f8cca3b1adb8c233b # Parent a33886146b45da46a5161a7ebed4d2f607642aee Support arbitrary numbers of physical cpus for cpupools in tools To be able to support arbitrary numbers of physical cpus it was necessary to include the size of cpumaps in the xc-interfaces for cpu pools. These were: definition of xc_cpupoolinfo_t xc_cpupool_getinfo() xc_cpupool_freeinfo() xc_cpupool_getinfo() and xc_cpupool_freeinfo() are changed to allocate the needed buffer and return it. Signed-off-by: juergen.gross@ts.fujitsu.com diff -r a33886146b45 -r fc17462ba612 tools/libxc/xc_cpupool.c --- a/tools/libxc/xc_cpupool.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxc/xc_cpupool.c Fri Oct 08 13:16:43 2010 +0200 @@ -34,6 +34,11 @@ return ret; } +static int get_cpumap_size(xc_interface *xch) +{ + return (xc_get_max_cpus(xch) + 7) / 8; +} + int xc_cpupool_create(xc_interface *xch, uint32_t *ppoolid, uint32_t sched_id) @@ -64,50 +69,61 @@ return do_sysctl_save(xch, &sysctl); } -int xc_cpupool_getinfo(xc_interface *xch, - uint32_t first_poolid, - uint32_t n_max, - xc_cpupoolinfo_t *info) +xc_cpupoolinfo_t *xc_cpupool_getinfo(xc_interface *xch, + uint32_t poolid) { int err = 0; - int p; - uint32_t poolid = first_poolid; - uint8_t local[sizeof (info->cpumap)]; + xc_cpupoolinfo_t *info; + uint8_t *local; + int local_size; + int cpumap_size; + int size; DECLARE_SYSCTL; - memset(info, 0, n_max * sizeof(xc_cpupoolinfo_t)); + local_size = get_cpumap_size(xch); + if (!local_size) + { + PERROR("Could not get number of cpus"); + return NULL; + } + local = alloca(local_size); + cpumap_size = (local_size + sizeof(*info->cpumap) - 1) / sizeof(*info->cpumap); + size = sizeof(xc_cpupoolinfo_t) + cpumap_size * sizeof(*info->cpumap); + info = malloc(size); + if ( !info ) + return NULL; - for (p = 0; p < n_max; p++) + memset(info, 0, size); + info->cpumap_size = local_size * 8; + info->cpumap = (uint64_t *)(info + 1); + + sysctl.cmd = XEN_SYSCTL_cpupool_op; + sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_INFO; + sysctl.u.cpupool_op.cpupool_id = poolid; + set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local); + sysctl.u.cpupool_op.cpumap.nr_cpus = local_size * 8; + + if ( (err = lock_pages(local, local_size)) != 0 ) { - sysctl.cmd = XEN_SYSCTL_cpupool_op; - sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_INFO; - sysctl.u.cpupool_op.cpupool_id = poolid; - set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local); - sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(info->cpumap) * 8; + PERROR("Could not lock memory for Xen hypercall"); + free(info); + return NULL; + } + err = do_sysctl_save(xch, &sysctl); + unlock_pages(local, local_size); - if ( (err = lock_pages(local, sizeof(local))) != 0 ) - { - PERROR("Could not lock memory for Xen hypercall"); - break; - } - err = do_sysctl_save(xch, &sysctl); - unlock_pages(local, sizeof (local)); - - if ( err < 0 ) - break; - - info->cpupool_id = sysctl.u.cpupool_op.cpupool_id; - info->sched_id = sysctl.u.cpupool_op.sched_id; - info->n_dom = sysctl.u.cpupool_op.n_dom; - bitmap_byte_to_64(&(info->cpumap), local, sizeof(local) * 8); - poolid = sysctl.u.cpupool_op.cpupool_id + 1; - info++; + if ( err < 0 ) + { + free(info); + return NULL; } - if ( p == 0 ) - return err; + info->cpupool_id = sysctl.u.cpupool_op.cpupool_id; + info->sched_id = sysctl.u.cpupool_op.sched_id; + info->n_dom = sysctl.u.cpupool_op.n_dom; + bitmap_byte_to_64(info->cpumap, local, local_size * 8); - return p; + return info; } int xc_cpupool_addcpu(xc_interface *xch, @@ -149,31 +165,41 @@ return do_sysctl_save(xch, &sysctl); } -int xc_cpupool_freeinfo(xc_interface *xch, - uint64_t *cpumap) +uint64_t * xc_cpupool_freeinfo(xc_interface *xch, + int *cpusize) { int err; - uint8_t local[sizeof (*cpumap)]; + uint8_t *local; + uint64_t *cpumap; DECLARE_SYSCTL; + + *cpusize = get_cpumap_size(xch); + if (*cpusize == 0) + return NULL; + local = alloca(*cpusize); + cpumap = calloc((*cpusize + sizeof(*cpumap) - 1) / sizeof(*cpumap), sizeof(*cpumap)); + if (cpumap == NULL) + return NULL; sysctl.cmd = XEN_SYSCTL_cpupool_op; sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_FREEINFO; set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local); - sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(*cpumap) * 8; + sysctl.u.cpupool_op.cpumap.nr_cpus = *cpusize * 8; - if ( (err = lock_pages(local, sizeof(local))) != 0 ) + if ( (err = lock_pages(local, *cpusize)) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); - return err; + free(cpumap); + return NULL; } err = do_sysctl_save(xch, &sysctl); - unlock_pages(local, sizeof (local)); + unlock_pages(local, *cpusize); + bitmap_byte_to_64(cpumap, local, *cpusize * 8); - if (err < 0) - return err; + if (err >= 0) + return cpumap; - bitmap_byte_to_64(cpumap, local, sizeof(local) * 8); - - return 0; + free(cpumap); + return NULL; } diff -r a33886146b45 -r fc17462ba612 tools/libxc/xc_misc.c --- a/tools/libxc/xc_misc.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxc/xc_misc.c Fri Oct 08 13:16:43 2010 +0200 @@ -20,6 +20,20 @@ #include "xc_private.h" #include <xen/hvm/hvm_op.h> + +int xc_get_max_cpus(xc_interface *xch) +{ + static int max_cpus = 0; + xc_physinfo_t physinfo; + + if ( max_cpus ) + return max_cpus; + + if ( !xc_physinfo(xch, &physinfo) ) + max_cpus = physinfo.max_cpu_id + 1; + + return max_cpus; +} int xc_readconsolering(xc_interface *xch, char **pbuffer, diff -r a33886146b45 -r fc17462ba612 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxc/xenctrl.h Fri Oct 08 13:16:43 2010 +0200 @@ -215,6 +215,9 @@ start_info_t s; } start_info_any_t; + +/* return maximum number of cpus the hypervisor supports */ +int xc_get_max_cpus(xc_interface *xch); int xc_domain_create(xc_interface *xch, uint32_t ssidref, @@ -535,7 +538,8 @@ uint32_t cpupool_id; uint32_t sched_id; uint32_t n_dom; - uint64_t cpumap; + uint32_t cpumap_size; /* max number of cpus in map */ + uint64_t *cpumap; } xc_cpupoolinfo_t; /** @@ -564,15 +568,11 @@ * Get cpupool info. Returns info for up to the specified number of cpupools * starting at the given id. * @parm xc_handle a handle to an open hypervisor interface - * @parm first_poolid lowest id for which info is returned - * @parm n_max maximum number of cpupools to return info - * @parm info pointer to xc_cpupoolinfo_t array - * return number of cpupool infos + * @parm poolid lowest id for which info is returned + * return cpupool info ptr (obtained by malloc) */ -int xc_cpupool_getinfo(xc_interface *xch, - uint32_t first_poolid, - uint32_t n_max, - xc_cpupoolinfo_t *info); +xc_cpupoolinfo_t *xc_cpupool_getinfo(xc_interface *xch, + uint32_t poolid); /** * Add cpu to a cpupool. cpu may be -1 indicating the first unassigned. @@ -614,11 +614,11 @@ * Return map of cpus not in any cpupool. * * @parm xc_handle a handle to an open hypervisor interface - * @parm cpumap pointer where to store the cpumap - * return 0 on success, -1 on failure + * @parm cpusize where to store array size in bytes + * return cpumap array on success, NULL else */ -int xc_cpupool_freeinfo(xc_interface *xch, - uint64_t *cpumap); +uint64_t *xc_cpupool_freeinfo(xc_interface *xch, + int *cpusize); /* diff -r a33886146b45 -r fc17462ba612 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxl/libxl.c Fri Oct 08 13:16:43 2010 +0200 @@ -609,27 +609,31 @@ libxl_poolinfo * libxl_list_pool(libxl_ctx *ctx, int *nb_pool) { - libxl_poolinfo *ptr; - int i, ret; - xc_cpupoolinfo_t info[256]; - int size = 256; + libxl_poolinfo *ptr, *tmp; + int i; + xc_cpupoolinfo_t *info; + uint32_t poolid; - ptr = calloc(size, sizeof(libxl_poolinfo)); - if (!ptr) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); - return NULL; + ptr = NULL; + + poolid = 0; + for (i = 0;; i++) { + info = xc_cpupool_getinfo(ctx->xch, poolid); + if (info == NULL) + break; + tmp = realloc(ptr, (i + 1) * sizeof(libxl_poolinfo)); + if (!tmp) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); + free(ptr); + return NULL; + } + ptr = tmp; + ptr[i].poolid = info->cpupool_id; + poolid = info->cpupool_id + 1; + free(info); } - ret = xc_cpupool_getinfo(ctx->xch, 0, 256, info); - if (ret<0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting cpupool info"); - return NULL; - } - - for (i = 0; i < ret; i++) { - ptr[i].poolid = info[i].cpupool_id; - } - *nb_pool = ret; + *nb_pool = i; return ptr; } @@ -3203,24 +3207,19 @@ libxl_vcpuinfo *ptr, *ret; xc_domaininfo_t domaininfo; xc_vcpuinfo_t vcpuinfo; - xc_physinfo_t physinfo = { 0 }; unsigned num_cpuwords; if (xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo) != 1) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting infolist"); return NULL; } - if (xc_physinfo(ctx->xch, &physinfo) == -1) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting physinfo"); - return NULL; - } - *nrcpus = physinfo.max_cpu_id + 1; + *nrcpus = xc_get_max_cpus(ctx->xch); ret = ptr = calloc(domaininfo.max_vcpu_id + 1, sizeof (libxl_vcpuinfo)); if (!ptr) { return NULL; } - num_cpuwords = ((physinfo.max_cpu_id + 64) / 64); + num_cpuwords = ((*nrcpus + 63) / 64); for (*nb_vcpu = 0; *nb_vcpu <= domaininfo.max_vcpu_id; ++*nb_vcpu, ++ptr) { ptr->cpumap = malloc(num_cpuwords * sizeof(*ptr->cpumap)); if (!ptr->cpumap) { diff -r a33886146b45 -r fc17462ba612 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxl/libxl.h Fri Oct 08 13:16:43 2010 +0200 @@ -249,6 +249,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force); int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid, libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid); +/* get max. number of cpus supported by hypervisor */ +int libxl_get_max_cpus(libxl_ctx *ctx); + /* * Run the configured bootloader for a PV domain and update * info->kernel, info->u.pv.ramdisk and info->u.pv.cmdline as diff -r a33886146b45 -r fc17462ba612 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxl/libxl_utils.c Fri Oct 08 13:16:43 2010 +0200 @@ -675,3 +675,8 @@ libxl__free_all(&gc); return rc; } + +int libxl_get_max_cpus(libxl_ctx *ctx) +{ + return xc_get_max_cpus(ctx->xch); +} diff -r a33886146b45 -r fc17462ba612 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/libxl/xl_cmdimpl.c Fri Oct 08 13:16:43 2010 +0200 @@ -3620,12 +3620,11 @@ static void vcpupin(char *d, const char *vcpu, char *cpu) { libxl_vcpuinfo *vcpuinfo; - libxl_physinfo physinfo; uint64_t *cpumap = NULL; uint32_t vcpuid, cpuida, cpuidb; char *endptr, *toka, *tokb; - int i, nb_vcpu, cpusize; + int i, nb_vcpu, cpusize, cpumapsize; vcpuid = strtoul(vcpu, &endptr, 10); if (vcpu == endptr) { @@ -3638,12 +3637,13 @@ find_domain(d); - if (libxl_get_physinfo(&ctx, &physinfo) != 0) { - fprintf(stderr, "libxl_get_physinfo failed.\n"); + if ((cpusize = libxl_get_max_cpus(&ctx)) == 0) { + fprintf(stderr, "libxl_get_max_cpus failed.\n"); goto vcpupin_out1; } - - cpumap = calloc(physinfo.max_cpu_id + 1, sizeof (uint64_t)); + cpumapsize = (cpusize + sizeof (uint64_t) - 1) / sizeof (uint64_t); + + cpumap = calloc(cpumapsize, sizeof (uint64_t)); if (!cpumap) { goto vcpupin_out1; } @@ -3671,24 +3671,24 @@ } } else { - memset(cpumap, -1, sizeof (uint64_t) * (physinfo.max_cpu_id + 1)); + memset(cpumap, -1, sizeof (uint64_t) * cpumapsize); } if (vcpuid != -1) { if (libxl_set_vcpuaffinity(&ctx, domid, vcpuid, - cpumap, physinfo.max_cpu_id + 1) == -1) { + cpumap, cpusize) == -1) { fprintf(stderr, "Could not set affinity for vcpu `%u'.\n", vcpuid); } } else { - if (!(vcpuinfo = libxl_list_vcpu(&ctx, domid, &nb_vcpu, &cpusize))) { + if (!(vcpuinfo = libxl_list_vcpu(&ctx, domid, &nb_vcpu, &i))) { fprintf(stderr, "libxl_list_vcpu failed.\n"); goto vcpupin_out; } for (; nb_vcpu > 0; --nb_vcpu, ++vcpuinfo) { if (libxl_set_vcpuaffinity(&ctx, domid, vcpuinfo->vcpuid, - cpumap, physinfo.max_cpu_id + 1) == -1) { - fprintf(stderr, "libxl_list_vcpu failed on vcpu `%u'.\n", vcpuinfo->vcpuid); + cpumap, cpusize) == -1) { + fprintf(stderr, "libxl_set_vcpuaffinity failed on vcpu `%u'.\n", vcpuinfo->vcpuid); } } } diff -r a33886146b45 -r fc17462ba612 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Fri Oct 08 11:41:57 2010 +0100 +++ b/tools/python/xen/lowlevel/xc/xc.c Fri Oct 08 13:16:43 2010 +0200 @@ -229,7 +229,6 @@ uint64_t *cpumap; PyObject *cpulist = NULL; int nr_cpus, size; - xc_physinfo_t info = {0}; uint64_t cpumap_size = sizeof(*cpumap); static char *kwd_list[] = { "domid", "vcpu", "cpumap", NULL }; @@ -238,10 +237,9 @@ &dom, &vcpu, &cpulist) ) return NULL; - if ( xc_physinfo(self->xc_handle, &info) != 0 ) + nr_cpus = xc_get_max_cpus(self->xc_handle); + if ( nr_cpus == 0 ) return pyxc_error_to_exception(self->xc_handle); - - nr_cpus = info.nr_cpus; size = (nr_cpus + cpumap_size * 8 - 1)/ (cpumap_size * 8); cpumap = malloc(cpumap_size * size); @@ -389,7 +387,6 @@ int rc, i; uint64_t *cpumap; int nr_cpus, size; - xc_physinfo_t pinfo = { 0 }; uint64_t cpumap_size = sizeof(*cpumap); static char *kwd_list[] = { "domid", "vcpu", NULL }; @@ -398,9 +395,9 @@ &dom, &vcpu) ) return NULL; - if ( xc_physinfo(self->xc_handle, &pinfo) != 0 ) + nr_cpus = xc_get_max_cpus(self->xc_handle); + if ( nr_cpus == 0 ) return pyxc_error_to_exception(self->xc_handle); - nr_cpus = pinfo.nr_cpus; rc = xc_vcpu_getinfo(self->xc_handle, dom, vcpu, &info); if ( rc < 0 ) @@ -1906,22 +1903,23 @@ return zero; } -static PyObject *cpumap_to_cpulist(uint64_t cpumap) +static PyObject *cpumap_to_cpulist(uint64_t *cpumap, int cpusize) { PyObject *cpulist = NULL; - uint32_t i; + int i; cpulist = PyList_New(0); - for ( i = 0; cpumap != 0; i++ ) + for ( i = 0; i < cpusize; i++ ) { - if ( cpumap & 1 ) + if ( *cpumap & (1L << (i % 64)) ) { PyObject* pyint = PyInt_FromLong(i); PyList_Append(cpulist, pyint); Py_DECREF(pyint); } - cpumap >>= 1; + if ( (i % 64) == 63 ) + cpumap++; } return cpulist; } @@ -1959,54 +1957,38 @@ return zero; } -static PyObject *pyxc_cpupool_getinfo(XcObject *self, - PyObject *args, - PyObject *kwds) +static PyObject *pyxc_cpupool_getinfo(XcObject *self) { PyObject *list, *info_dict; - uint32_t first_pool = 0; - int max_pools = 1024, nr_pools, i; + uint32_t pool; xc_cpupoolinfo_t *info; - static char *kwd_list[] = { "first_pool", "max_pools", NULL }; - - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwd_list, - &first_pool, &max_pools) ) - return NULL; - - info = calloc(max_pools, sizeof(xc_cpupoolinfo_t)); - if (info == NULL) - return PyErr_NoMemory(); - - nr_pools = xc_cpupool_getinfo(self->xc_handle, first_pool, max_pools, info); - - if (nr_pools < 0) + list = PyList_New(0); + for (pool = 0;;) { - free(info); - return pyxc_error_to_exception(self->xc_handle); - } - - list = PyList_New(nr_pools); - for ( i = 0 ; i < nr_pools; i++ ) - { + info = xc_cpupool_getinfo(self->xc_handle, pool); + if (info == NULL) + break; info_dict = Py_BuildValue( "{s:i,s:i,s:i,s:N}", - "cpupool", (int)info[i].cpupool_id, - "sched", info[i].sched_id, - "n_dom", info[i].n_dom, - "cpulist", cpumap_to_cpulist(info[i].cpumap)); + "cpupool", (int)info->cpupool_id, + "sched", info->sched_id, + "n_dom", info->n_dom, + "cpulist", cpumap_to_cpulist(info->cpumap, + info->cpumap_size)); + pool = info->cpupool_id + 1; + free(info); + if ( info_dict == NULL ) { Py_DECREF(list); - if ( info_dict != NULL ) { Py_DECREF(info_dict); } - free(info); return NULL; } - PyList_SetItem(list, i, info_dict); + + PyList_Append(list, info_dict); + Py_DECREF(info_dict); } - - free(info); return list; } @@ -2072,12 +2054,19 @@ static PyObject *pyxc_cpupool_freeinfo(XcObject *self) { - uint64_t cpumap; + uint64_t *cpumap; + int mapsize; + PyObject *info = NULL; - if (xc_cpupool_freeinfo(self->xc_handle, &cpumap) != 0) + cpumap = xc_cpupool_freeinfo(self->xc_handle, &mapsize); + if (!cpumap) return pyxc_error_to_exception(self->xc_handle); - return cpumap_to_cpulist(cpumap); + info = cpumap_to_cpulist(cpumap, mapsize * 8); + + free(cpumap); + + return info; } static PyObject *pyflask_context_to_sid(PyObject *self, PyObject *args, @@ -2832,14 +2821,9 @@ { "cpupool_getinfo", (PyCFunction)pyxc_cpupool_getinfo, - METH_VARARGS | METH_KEYWORDS, "\n" + METH_NOARGS, "\n" "Get information regarding a set of cpupools, in increasing id order.\n" - " first_pool [int, 0]: First cpupool to retrieve info about.\n" - " max_pools [int, 1024]: Maximum number of cpupools to retrieve info" - " about.\n\n" - "Returns: [list of dicts] if list length is less than 'max_pools'\n" - " parameter then there was an error, or the end of the\n" - " cpupool-id space was reached.\n" + "Returns: [list of dicts]\n" " pool [int]: Identifier of cpupool to which this info pertains\n" " sched [int]: Scheduler used for this cpupool\n" " n_dom [int]: Number of Domains in this cpupool\n" [-- Attachment #3: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-08 11:23 [PATCH 0 of 3] support of cpupools in xl Juergen Gross 2010-10-08 11:23 ` [PATCH 1 of 3] Support arbitrary numbers of physical cpus for cpupools in tools Juergen Gross @ 2010-10-08 11:23 ` Juergen Gross 2010-10-12 9:51 ` Ian Jackson 2010-10-12 9:56 ` Ian Campbell 2010-10-08 11:23 ` [PATCH 3 of 3] add example cpupool config file Juergen Gross 2 siblings, 2 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-08 11:23 UTC (permalink / raw) To: xen-devel [-- Attachment #1: Type: text/plain, Size: 825 bytes --] Support of cpu pools in xl: library functions xl pool-create xl pool-list xl pool-destroy xl pool-cpu-add xl pool-cpu-remove xl pool-migrate Renamed all cpu pool related names to *cpupool* Signed-off-by: juergen.gross@ts.fujitsu.com 12 files changed, 818 insertions(+), 86 deletions(-) tools/libxl/libxl.c | 203 +++++++++++++++++- tools/libxl/libxl.h | 18 + tools/libxl/libxl.idl | 12 - tools/libxl/libxl_internal.h | 2 tools/libxl/libxl_utils.c | 93 +++++++- tools/libxl/libxl_utils.h | 10 tools/libxl/libxltypes.py | 5 tools/libxl/libxlu_cfg_l.c | 30 -- tools/libxl/libxlu_cfg_l.h | 18 - tools/libxl/xl.h | 6 tools/libxl/xl_cmdimpl.c | 472 ++++++++++++++++++++++++++++++++++++++++-- tools/libxl/xl_cmdtable.c | 35 +++ [-- Attachment #2: xen-work-3.patch --] [-- Type: text/x-patch, Size: 40181 bytes --] # HG changeset patch # User Juergen Gross <juergen.gross@ts.fujitsu.com> # Date 1286536912 -7200 # Node ID 91397dcffead192708972a2628b4b31a58fdbdfb # Parent fc17462ba612d67069c1110f8cca3b1adb8c233b support of cpupools in xl: commands and library changes Support of cpu pools in xl: library functions xl pool-create xl pool-list xl pool-destroy xl pool-cpu-add xl pool-cpu-remove xl pool-migrate Renamed all cpu pool related names to *cpupool* Signed-off-by: juergen.gross@ts.fujitsu.com diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl.c Fri Oct 08 13:21:52 2010 +0200 @@ -607,21 +607,26 @@ return 0; } -libxl_poolinfo * libxl_list_pool(libxl_ctx *ctx, int *nb_pool) -{ - libxl_poolinfo *ptr, *tmp; - int i; +libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx *ctx, int *nb_pool) +{ + libxl_cpupoolinfo *ptr, *tmp; + int i, m, ncpu; xc_cpupoolinfo_t *info; uint32_t poolid; ptr = NULL; + ncpu = xc_get_max_cpus(ctx->xch); + if (!ncpu) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting max cpu number"); + return NULL; + } poolid = 0; for (i = 0;; i++) { info = xc_cpupool_getinfo(ctx->xch, poolid); if (info == NULL) break; - tmp = realloc(ptr, (i + 1) * sizeof(libxl_poolinfo)); + tmp = realloc(ptr, (i + 1) * sizeof(libxl_cpupoolinfo)); if (!tmp) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); free(ptr); @@ -629,6 +634,13 @@ } ptr = tmp; ptr[i].poolid = info->cpupool_id; + ptr[i].sched_id = info->sched_id; + ptr[i].n_dom = info->n_dom; + if (libxl_cpumap_alloc(&ptr[i].cpumap, ncpu)) + break; + for (m = 0; m < ptr[i].cpumap.size / sizeof(*ptr[i].cpumap.map); m++) + ptr[i].cpumap.map[m] = (info->cpumap_size > (m * sizeof(*ptr[i].cpumap.map))) ? + info->cpumap[m] : 0; poolid = info->cpupool_id + 1; free(info); } @@ -3207,7 +3219,6 @@ libxl_vcpuinfo *ptr, *ret; xc_domaininfo_t domaininfo; xc_vcpuinfo_t vcpuinfo; - unsigned num_cpuwords; if (xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo) != 1) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting infolist"); @@ -3219,10 +3230,9 @@ return NULL; } - num_cpuwords = ((*nrcpus + 63) / 64); for (*nb_vcpu = 0; *nb_vcpu <= domaininfo.max_vcpu_id; ++*nb_vcpu, ++ptr) { - ptr->cpumap = malloc(num_cpuwords * sizeof(*ptr->cpumap)); - if (!ptr->cpumap) { + if (libxl_cpumap_alloc(&ptr->cpumap, *nrcpus)) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpumap"); return NULL; } if (xc_vcpu_getinfo(ctx->xch, domid, *nb_vcpu, &vcpuinfo) == -1) { @@ -3230,7 +3240,7 @@ return NULL; } if (xc_vcpu_getaffinity(ctx->xch, domid, *nb_vcpu, - ptr->cpumap, ((*nrcpus) + 7) / 8) == -1) { + ptr->cpumap.map, ((*nrcpus) + 7) / 8) == -1) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting vcpu affinity"); return NULL; } @@ -3913,3 +3923,176 @@ libxl__file_reference_unmap(f); free(f->path); } + +int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap) +{ + int ncpus; + + cpumap->map = xc_cpupool_freeinfo(ctx->xch, &ncpus); + if (cpumap->map == NULL) + return ERROR_FAIL; + + cpumap->size = (ncpus + 7) / 8; + + return 0; +} + +int libxl_create_cpupool(libxl_ctx *ctx, char *name, int schedid, + libxl_cpumap cpumap, libxl_uuid *uuid, + uint32_t *poolid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc; + int i; + xs_transaction_t t; + char *uuid_string; + + uuid_string = libxl__uuid2string(&gc, *uuid); + if (!uuid_string) + return ERROR_NOMEM; + + rc = xc_cpupool_create(ctx->xch, poolid, schedid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Could not create cpupool"); + return ERROR_FAIL; + } + + for (i = 0; i < cpumap.size * 8; i++) + if (cpumap.map[i / 64] & (1L << (i % 64))) { + rc = xc_cpupool_addcpu(ctx->xch, *poolid, i); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving cpu to cpupool"); + libxl_destroy_cpupool(ctx, *poolid); + return ERROR_FAIL; + } + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid)); + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid), + uuid_string); + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/local/pool/%d/name", *poolid), + name); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + return 0; + } +} + +int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc, i; + xc_cpupoolinfo_t *info; + xs_transaction_t t; + + info = xc_cpupool_getinfo(ctx->xch, poolid); + if (info == NULL) + return ERROR_NOMEM; + + rc = ERROR_INVAL; + if ((info->cpupool_id != poolid) || (info->n_dom)) + goto out; + + for (i = 0; i < info->cpumap_size; i++) + if (info->cpumap[i / 64] & (1L << (i % 64))) { + rc = xc_cpupool_removecpu(ctx->xch, poolid, i); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error removing cpu from cpupool"); + rc = ERROR_FAIL; + goto out; + } + } + + rc = xc_cpupool_destroy(ctx->xch, poolid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "Could not destroy cpupool"); + rc = ERROR_FAIL; + goto out; + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid)); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + break; + } + + rc = 0; + +out: + free(info); + + return rc; +} + +int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu) +{ + int rc; + + rc = xc_cpupool_addcpu(ctx->xch, poolid, cpu); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving cpu to cpupool"); + return ERROR_FAIL; + } + return 0; +} + +int libxl_cpupool_cpuremove(libxl_ctx *ctx, uint32_t poolid, int cpu) +{ + int rc; + + rc = xc_cpupool_removecpu(ctx->xch, poolid, cpu); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error removing cpu from cpupool"); + return ERROR_FAIL; + } + return 0; +} + +int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc; + char *dom_path; + char *vm_path; + char *poolname; + xs_transaction_t t; + + dom_path = libxl__xs_get_dompath(&gc, domid); + if (!dom_path) { + return ERROR_FAIL; + } + + rc = xc_cpupool_movedomain(ctx->xch, poolid, domid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving domain to cpupool"); + return ERROR_FAIL; + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + poolname = libxl__cpupoolid_to_name(&gc, poolid); + vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path)); + if (!vm_path) + break; + + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path), poolname); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + break; + } + + return 0; +} diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl.h --- a/tools/libxl/libxl.h Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl.h Fri Oct 08 13:21:52 2010 +0200 @@ -141,9 +141,12 @@ typedef char **libxl_key_value_list; void libxl_key_value_list_destroy(libxl_key_value_list *kvl); -typedef uint64_t *libxl_cpumap; +typedef uint32_t libxl_hwcap[8]; -typedef uint32_t libxl_hwcap[8]; +typedef struct { + uint32_t size; /* number of bytes in map */ + uint64_t *map; +} libxl_cpumap; typedef enum { XENFV = 1, @@ -361,7 +364,7 @@ int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r, uint32_t domid); libxl_dominfo * libxl_list_domain(libxl_ctx*, int *nb_domain); -libxl_poolinfo * libxl_list_pool(libxl_ctx*, int *nb_pool); +libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool); libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm); typedef struct libxl__device_model_starting libxl_device_model_starting; @@ -504,6 +507,15 @@ int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2, int wait); +int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap); +int libxl_create_cpupool(libxl_ctx *ctx, char *name, int schedid, + libxl_cpumap cpumap, libxl_uuid *uuid, + uint32_t *poolid); +int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid); +int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu); +int libxl_cpupool_cpuremove(libxl_ctx *ctx, uint32_t poolid, int cpu); +int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid); + /* common paths */ const char *libxl_sbindir_path(void); const char *libxl_bindir_path(void); diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl.idl --- a/tools/libxl/libxl.idl Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl.idl Fri Oct 08 13:21:52 2010 +0200 @@ -6,6 +6,7 @@ libxl_ctx = Builtin("ctx") libxl_uuid = Builtin("uuid") libxl_mac = Builtin("mac") +libxl_cpumap = Builtin("cpumap") libxl_qemu_machine_type = Number("qemu_machine_type", namespace="libxl_") libxl_console_consback = Number("console_consback", namespace="libxl_") libxl_console_constype = Number("console_constype", namespace="libxl_") @@ -16,8 +17,6 @@ libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE) libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE) libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE) - -libxl_cpumap = Builtin("cpumap", destructor_fn="free") libxl_hwcap = Builtin("hwcap") @@ -45,9 +44,12 @@ ("vcpu_online", uint32), ], destructor_fn=None) -libxl_poolinfo = Struct("poolinfo", [ - ("poolid", uint32) - ], destructor_fn=None) +libxl_cpupoolinfo = Struct("cpupoolinfo", [ + ("poolid", uint32), + ("sched_id", uint32), + ("n_dom", uint32), + ("cpumap", libxl_cpumap) + ], destructor_fn="libxl_cpupoolinfo_destroy") libxl_vminfo = Struct("vminfo", [ ("uuid", libxl_uuid), diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl_internal.h Fri Oct 08 13:21:52 2010 +0200 @@ -237,7 +237,7 @@ #define LIBXL__LOG_ERROR XTL_ERROR _hidden char *libxl__domid_to_name(libxl__gc *gc, uint32_t domid); -_hidden char *libxl__poolid_to_name(libxl__gc *gc, uint32_t poolid); +_hidden char *libxl__cpupoolid_to_name(libxl__gc *gc, uint32_t poolid); /* holds the CPUID response for a single CPUID leaf diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl_utils.c Fri Oct 08 13:21:52 2010 +0200 @@ -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 @@ 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,40 +114,61 @@ 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) @@ -676,6 +708,39 @@ 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; +} + +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); diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxl_utils.h --- a/tools/libxl/libxl_utils.h Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxl_utils.h Fri Oct 08 13:21:52 2010 +0200 @@ -21,8 +21,10 @@ unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus); int libxl_name_to_domid(libxl_ctx *ctx, const char *name, uint32_t *domid); char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid); -int libxl_name_to_poolid(libxl_ctx *ctx, const char *name, uint32_t *poolid); -char *libxl_poolid_to_name(libxl_ctx *ctx, uint32_t poolid); +int libxl_name_to_cpupoolid(libxl_ctx *ctx, const char *name, uint32_t *poolid); +char *libxl_cpupoolid_to_name(libxl_ctx *ctx, uint32_t poolid); +int libxl_name_to_schedid(libxl_ctx *ctx, const char *name); +char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid); int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid); int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid); int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name); @@ -74,5 +76,9 @@ * return -1 if there are an error */ int libxl_check_device_model_version(libxl_ctx *ctx, char *path); +int libxl_cpumap_alloc(libxl_cpumap *cpumap, int max_cpus); +int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); +void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); +void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); #endif diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxltypes.py --- a/tools/libxl/libxltypes.py Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxltypes.py Fri Oct 08 13:21:52 2010 +0200 @@ -131,7 +131,10 @@ kwargs.setdefault('passby', PASS_BY_VALUE) kwargs.setdefault('namespace', ty.namespace) - typename = ty.typename[len(kwargs['namespace']):] + + typename = ty.typename + if ty.namespace: + typename = typename[len(kwargs['namespace']):] Type.__init__(self, typename + " *", **kwargs) # diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxlu_cfg_l.c --- a/tools/libxl/libxlu_cfg_l.c Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxlu_cfg_l.c Fri Oct 08 13:21:52 2010 +0200 @@ -54,6 +54,7 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -83,8 +84,6 @@ #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif - -#endif /* ! C99 */ #endif /* ! FLEXINT_H */ @@ -159,15 +158,7 @@ /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -496,7 +487,7 @@ void xlu__cfg_yyset_column(int column_no, yyscan_t yyscanner); -#line 500 "libxlu_cfg_l.c" +#line 491 "libxlu_cfg_l.c" #define INITIAL 0 #define lexerr 1 @@ -632,12 +623,7 @@ /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -645,7 +631,7 @@ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -656,7 +642,7 @@ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - size_t n; \ + int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -744,7 +730,7 @@ #line 37 "libxlu_cfg_l.l" -#line 748 "libxlu_cfg_l.c" +#line 734 "libxlu_cfg_l.c" yylval = yylval_param; @@ -944,7 +930,7 @@ #line 82 "libxlu_cfg_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 948 "libxlu_cfg_l.c" +#line 934 "libxlu_cfg_l.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(lexerr): yyterminate(); @@ -1687,8 +1673,8 @@ /** Setup the input buffer state to scan the given bytes. The next call to xlu__cfg_yylex() will * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ diff -r fc17462ba612 -r 91397dcffead tools/libxl/libxlu_cfg_l.h --- a/tools/libxl/libxlu_cfg_l.h Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/libxlu_cfg_l.h Fri Oct 08 13:21:52 2010 +0200 @@ -58,6 +58,7 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -87,8 +88,6 @@ #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif - -#endif /* ! C99 */ #endif /* ! FLEXINT_H */ @@ -132,15 +131,7 @@ /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif #ifndef YY_TYPEDEF_YY_BUFFER_STATE @@ -310,12 +301,7 @@ /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Number of entries by which start-condition stack grows. */ @@ -352,6 +338,6 @@ #line 82 "libxlu_cfg_l.l" -#line 356 "libxlu_cfg_l.h" +#line 342 "libxlu_cfg_l.h" #undef xlu__cfg_yyIN_HEADER #endif /* xlu__cfg_yyHEADER_H */ diff -r fc17462ba612 -r 91397dcffead tools/libxl/xl.h --- a/tools/libxl/xl.h Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/xl.h Fri Oct 08 13:21:52 2010 +0200 @@ -79,6 +79,12 @@ int main_network2attach(int argc, char **argv); int main_network2list(int argc, char **argv); int main_network2detach(int argc, char **argv); +int main_poolcreate(int argc, char **argv); +int main_poollist(int argc, char **argv); +int main_pooldestroy(int argc, char **argv); +int main_poolcpuadd(int argc, char **argv); +int main_poolcpuremove(int argc, char **argv); +int main_poolmigrate(int argc, char **argv); void help(char *command); diff -r fc17462ba612 -r 91397dcffead tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/xl_cmdimpl.c Fri Oct 08 13:21:52 2010 +0200 @@ -213,14 +213,14 @@ 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, +static int cpupool_qualifier_to_cpupoolid(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; + return was_name ? libxl_name_to_cpupoolid(&ctx, p, poolid_r) : 0; } static void find_domain(const char *p) @@ -491,7 +491,7 @@ printf("\t(uuid <unknown>)\n"); } - printf("\t(cpupool %s (%d))\n", c_info->poolname, c_info->poolid); + printf("\t(cpupool %s)\n", c_info->poolname); if (c_info->xsdata) printf("\t(xsdata contains data)\n"); else @@ -694,9 +694,9 @@ if (!xlu_cfg_get_string (config, "pool", &buf)) { c_info->poolid = -1; - pool_qualifier_to_poolid(buf, &c_info->poolid, NULL); - } - c_info->poolname = libxl_poolid_to_name(&ctx, c_info->poolid); + cpupool_qualifier_to_cpupoolid(buf, &c_info->poolid, NULL); + } + c_info->poolname = libxl_cpupoolid_to_name(&ctx, c_info->poolid); if (!c_info->poolname) { fprintf(stderr, "Illegal pool specified\n"); exit(1); @@ -3498,7 +3498,7 @@ printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9)); /* CPU AFFINITY */ pcpumap = nr_cpus > 64 ? (uint64_t)-1 : ((1ULL << nr_cpus) - 1); - for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) { + for (cpumap = vcpuinfo->cpumap.map; nr_cpus; ++cpumap) { if (*cpumap < pcpumap) { break; } @@ -3513,7 +3513,7 @@ if (!nr_cpus) { printf("any cpu\n"); } else { - for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) { + for (cpumap = vcpuinfo->cpumap.map; nr_cpus; ++cpumap) { pcpumap = *cpumap; for (i = 0; !(pcpumap & 1); ++i, pcpumap >>= 1) ; @@ -3785,10 +3785,7 @@ printf("xen_minor : %d\n", info->xen_version_minor); printf("xen_extra : %s\n", info->xen_version_extra); printf("xen_caps : %s\n", info->capabilities); - printf("xen_scheduler : %s\n", - sched_id == XEN_SCHEDULER_SEDF ? "sedf" : - sched_id == XEN_SCHEDULER_CREDIT ? "credit" : - sched_id == XEN_SCHEDULER_CREDIT2 ? "credit2" : "unknown"); + printf("xen_scheduler : %s\n", libxl_schedid_to_name(&ctx, sched_id)); printf("xen_pagesize : %lu\n", info->pagesize); printf("platform_params : virt_start=0x%lx\n", info->virt_start); printf("xen_changeset : %s\n", info->changeset); @@ -3819,6 +3816,8 @@ libxl_physinfo info; const libxl_version_info *vinfo; unsigned int i; + libxl_cpumap cpumap; + int n = 0; if (libxl_get_physinfo(&ctx, &info) != 0) { fprintf(stderr, "libxl_physinfo failed.\n"); @@ -3845,6 +3844,13 @@ printf("total_memory : %"PRIu64"\n", info.total_pages / i); printf("free_memory : %"PRIu64"\n", info.free_pages / i); } + if (!libxl_get_freecpus(&ctx, &cpumap)) { + for (i = 0; i < cpumap.size * 8; i++) + if (libxl_cpumap_test(&cpumap, i)) + n++; + printf("free_cpus : %d\n", n); + free(cpumap.map); + } return; } @@ -5260,3 +5266,445 @@ printf("%d\n", mb); return 0; } + +int main_poolcreate(int argc, char **argv) +{ + char *filename = NULL; + char *p, extra_config[1024]; + int dryrun = 0; + int opt; + int option_index = 0; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"defconfig", 1, 0, 'f'}, + {"dryrun", 0, 0, 'n'}, + {0, 0, 0, 0} + }; + int ret; + void *config_data = 0; + int config_len = 0; + XLU_Config *config; + const char *buf; + char *name, *sched; + uint32_t poolid; + int schedid = -1; + XLU_ConfigList *cpus; + int n_cpus, i, n; + libxl_cpumap freemap; + libxl_cpumap cpumap; + libxl_uuid uuid; + + while (1) { + opt = getopt_long(argc, argv, "hnf:", long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 'f': + filename = optarg; + break; + case 'h': + help("pool-create"); + return 0; + case 'n': + dryrun = 1; + break; + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + memset(extra_config, 0, sizeof(extra_config)); + while (optind < argc) { + if ((p = strchr(argv[optind], '='))) { + if (strlen(extra_config) + 1 < sizeof(extra_config)) { + if (strlen(extra_config)) + strcat(extra_config, "\n"); + strcat(extra_config, argv[optind]); + } + } else if (!filename) { + filename = argv[optind]; + } else { + help("pool-create"); + return -ERROR_FAIL; + } + optind++; + } + + if (!filename) { + help("pool-create"); + return -ERROR_FAIL; + } + + if (libxl_read_file_contents(&ctx, filename, &config_data, &config_len)) { + fprintf(stderr, "Failed to read config file: %s: %s\n", + filename, strerror(errno)); + return -ERROR_FAIL; + } + if (strlen(extra_config)) { + if (config_len > INT_MAX - (strlen(extra_config) + 2)) { + fprintf(stderr, "Failed to attach extra configration\n"); + return -ERROR_FAIL; + } + config_data = xrealloc(config_data, + config_len + strlen(extra_config) + 2); + if (!config_data) { + fprintf(stderr, "Failed to realloc config_data\n"); + return -ERROR_FAIL; + } + strcat(config_data, "\n"); + strcat(config_data, extra_config); + strcat(config_data, "\n"); + config_len += (strlen(extra_config) + 2); + } + + config = xlu_cfg_init(stderr, filename); + if (!config) { + fprintf(stderr, "Failed to allocate for configuration\n"); + return -ERROR_FAIL; + } + + ret = xlu_cfg_readdata(config, config_data, config_len); + if (ret) { + fprintf(stderr, "Failed to parse config file: %s\n", strerror(ret)); + return -ERROR_FAIL; + } + + if (!xlu_cfg_get_string (config, "name", &buf)) + name = strdup(buf); + else + name = basename(filename); + if (!libxl_name_to_cpupoolid(&ctx, name, &poolid)) { + fprintf(stderr, "Pool name \"%s\" already exists\n", name); + return -ERROR_FAIL; + } + + if (!xlu_cfg_get_string (config, "sched", &buf)) { + if ((schedid = libxl_name_to_schedid(&ctx, buf)) < 0) { + fprintf(stderr, "Unknown scheduler\n"); + return -ERROR_FAIL; + } + } else { + if ((schedid = libxl_get_sched_id(&ctx)) < 0) { + fprintf(stderr, "get_sched_id sysctl failed.\n"); + return -ERROR_FAIL; + } + } + sched = libxl_schedid_to_name(&ctx, schedid); + + if (libxl_get_freecpus(&ctx, &freemap)) { + fprintf(stderr, "libxl_get_freecpus failed\n"); + return -ERROR_FAIL; + } + if (libxl_cpumap_alloc(&cpumap, freemap.size * 8)) { + fprintf(stderr, "Failed to allocate cpumap\n"); + return -ERROR_FAIL; + } + if (!xlu_cfg_get_list(config, "cpus", &cpus, 0, 0)) { + n_cpus = 0; + while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) { + i = atoi(buf); + if ((i < 0) || (i >= freemap.size * 8) || + !libxl_cpumap_test(&freemap, i)) { + fprintf(stderr, "cpu %d illegal or not free\n", i); + return -ERROR_FAIL; + } + libxl_cpumap_set(&cpumap, i); + n_cpus++; + } + } else { + n_cpus = 1; + n = 0; + for (i = 0; i < freemap.size; i++) + if (libxl_cpumap_test(&freemap, i)) { + n++; + libxl_cpumap_set(&cpumap, i); + break; + } + if (n != n_cpus) { + fprintf(stderr, "no free cpu found\n"); + return -ERROR_FAIL; + } + } + + libxl_uuid_generate(&uuid); + + printf("Using config file \"%s\"\n", filename); + printf("pool name: %s\n", name); + printf("scheduler: %s\n", sched); + printf("number of cpus: %d\n", n_cpus); + + if (dryrun) + return 0; + + poolid = 0; + if (libxl_create_cpupool(&ctx, name, schedid, cpumap, &uuid, &poolid)) { + fprintf(stderr, "error on creating cpupool\n"); + return -ERROR_FAIL; + } + + return 0; +} + +int main_poollist(int argc, char **argv) +{ + int opt; + int option_index = 0; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"long", 0, 0, 'l'}, + {"cpus", 0, 0, 'c'}, + {0, 0, 0, 0} + }; + int opt_long = 0; + int opt_cpus = 0; + char *pool = NULL; + libxl_cpupoolinfo *poolinfo; + int n_pools, p, c, n; + uint32_t poolid; + char *name; + int ret = 0; + + while (1) { + opt = getopt_long(argc, argv, "hlc", long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 'h': + help("pool-list"); + return 0; + case 'l': + opt_long = 1; + break; + case 'c': + opt_cpus = 1; + break; + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + if ((optind + 1) < argc) { + help("pool-list"); + return -ERROR_FAIL; + } + if (optind < argc) { + pool = argv[optind]; + if (libxl_name_to_cpupoolid(&ctx, pool, &poolid)) { + fprintf(stderr, "Pool \'%s\' does not exist\n", pool); + return -ERROR_FAIL; + } + } + + poolinfo = libxl_list_cpupool(&ctx, &n_pools); + if (!poolinfo) { + fprintf(stderr, "error getting cpupool info\n"); + return -ERROR_NOMEM; + } + + if (!opt_long) { + printf("%-19s", "Name"); + if (opt_cpus) + printf("CPU list\n"); + else + printf("CPUs Sched Active Domain count\n"); + } + + for (p = 0; p < n_pools; p++) { + if (!ret && (!pool || (poolinfo[p].poolid != poolid))) { + name = libxl_cpupoolid_to_name(&ctx, poolinfo[p].poolid); + if (!name) { + fprintf(stderr, "error getting cpupool info\n"); + ret = -ERROR_NOMEM; + } + else if (opt_long) { + ret = -ERROR_NI; + } else { + printf("%-19s", name); + free(name); + n = 0; + for (c = 0; c < poolinfo[p].cpumap.size * 8; c++) + if (poolinfo[p].cpumap.map[c / 64] & (1L << (c % 64))) { + if (n && opt_cpus) printf(","); + if (opt_cpus) printf("%d", c); + n++; + } + if (!opt_cpus) { + printf("%3d %9s y %4d", n, + libxl_schedid_to_name(&ctx, poolinfo[p].sched_id), + poolinfo[p].n_dom); + } + printf("\n"); + } + } + libxl_cpupoolinfo_destroy(poolinfo + p); + } + + return ret; +} + +int main_pooldestroy(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-destroy"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-destroy"); + return -ERROR_FAIL; + } + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_destroy_cpupool(&ctx, poolid); +} + +int main_poolcpuadd(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + int cpu; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-cpu-add"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-cpu-add"); + return -ERROR_FAIL; + } + + if (!argv[optind]) { + fprintf(stderr, "no cpu specified\n"); + help("pool-cpu-add"); + return -ERROR_FAIL; + } + cpu = atoi(argv[optind]); + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_cpuadd(&ctx, poolid, cpu); +} + +int main_poolcpuremove(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + int cpu; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-cpu-remove"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-cpu-remove"); + return -ERROR_FAIL; + } + + if (!argv[optind]) { + fprintf(stderr, "no cpu specified\n"); + help("pool-cpu-remove"); + return -ERROR_FAIL; + } + cpu = atoi(argv[optind]); + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_cpuremove(&ctx, poolid, cpu); +} + +int main_poolmigrate(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + char *dom; + uint32_t domid; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-migrate"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + dom = argv[optind++]; + if (!dom) { + fprintf(stderr, "no domain specified\n"); + help("pool-migrate"); + return -ERROR_FAIL; + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-migrate"); + return -ERROR_FAIL; + } + + if (domain_qualifier_to_domid(dom, &domid, NULL) || + !libxl_domid_to_name(&ctx, domid)) { + fprintf(stderr, "unknown domain \'%s\'\n", dom); + return -ERROR_FAIL; + } + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_movedomain(&ctx, poolid, domid); +} diff -r fc17462ba612 -r 91397dcffead tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Fri Oct 08 13:16:43 2010 +0200 +++ b/tools/libxl/xl_cmdtable.c Fri Oct 08 13:21:52 2010 +0200 @@ -338,6 +338,41 @@ "destroy a domain's version 2 virtual network device", "<Domain> <DevId>", }, + { "pool-create", + &main_poolcreate, + "Create a CPU pool based an ConfigFile", + "[options] <ConfigFile> [vars]", + "-h, --help Print this help.\n" + "-f=FILE, --defconfig=FILE Use the given configuration file.\n" + "-n, --dryrun Dry run - prints the resulting configuration." + }, + { "pool-list", + &main_poollist, + "List CPU pools on host", + "[-l|--long] [-c|--cpus] [<CPU Pool>]", + "-l, --long Output all CPU pool details.\n" + "-c, --cpus Output list of CPUs used by a pool" + }, + { "pool-destroy", + &main_pooldestroy, + "Deactivates a CPU pool", + "<CPU Pool>", + }, + { "pool-cpu-add", + &main_poolcpuadd, + "Adds a CPU to a CPU pool", + "<CPU Pool> <CPU nr>", + }, + { "pool-cpu-remove", + &main_poolcpuremove, + "Removes a CPU from a CPU pool", + "<CPU Pool> <CPU nr>", + }, + { "pool-migrate", + &main_poolmigrate, + "Moves a domain into a CPU pool", + "<Domain> <CPU Pool>", + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); [-- Attachment #3: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-08 11:23 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross @ 2010-10-12 9:51 ` Ian Jackson 2010-10-12 9:56 ` Juergen Gross 2010-10-12 9:59 ` Ian Campbell 2010-10-12 9:56 ` Ian Campbell 1 sibling, 2 replies; 15+ messages in thread From: Ian Jackson @ 2010-10-12 9:51 UTC (permalink / raw) To: Juergen Gross; +Cc: xen-devel Juergen Gross writes ("[Xen-devel] [PATCH 2 of 3] support of cpupools in xl: commands and library changes"): > tools/libxl/libxlu_cfg_l.c | 30 -- > tools/libxl/libxlu_cfg_l.h | 18 - I see you reran flex. That's not wrong, but we shouldn't change these files needlessly, and you didn't make any changes to the .l source file, so when we apply this patch we should drop the changes to *_l.[ch]. > Renamed all cpu pool related names to *cpupool* Is that really true in this patch ? The function names and subcommand names in xl are still all "pool-*" and "pool_*". Ian. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-12 9:51 ` Ian Jackson @ 2010-10-12 9:56 ` Juergen Gross 2010-10-12 9:59 ` Ian Campbell 1 sibling, 0 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-12 9:56 UTC (permalink / raw) To: Ian Jackson; +Cc: xen-devel On 10/12/10 11:51, Ian Jackson wrote: > Juergen Gross writes ("[Xen-devel] [PATCH 2 of 3] support of cpupools in xl: commands and library changes"): >> tools/libxl/libxlu_cfg_l.c | 30 -- >> tools/libxl/libxlu_cfg_l.h | 18 - > > I see you reran flex. That's not wrong, but we shouldn't change these > files needlessly, and you didn't make any changes to the .l source > file, so when we apply this patch we should drop the changes to > *_l.[ch]. I excluded these changes once before and was told they should be included... I didn't call flex manually, this was done by make. > >> Renamed all cpu pool related names to *cpupool* > > Is that really true in this patch ? The function names and subcommand > names in xl are still all "pool-*" and "pool_*". There was no response to the question whether to change the sub-command names or not. And I think the sub-command functions should reflect the names. Juergen -- Juergen Gross Principal Developer Operating Systems TSP ES&S SWE OS6 Telephone: +49 (0) 89 3222 2967 Fujitsu Technology Solutions e-mail: juergen.gross@ts.fujitsu.com Domagkstr. 28 Internet: ts.fujitsu.com D-80807 Muenchen Company details: ts.fujitsu.com/imprint.html ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-12 9:51 ` Ian Jackson 2010-10-12 9:56 ` Juergen Gross @ 2010-10-12 9:59 ` Ian Campbell 2010-10-12 10:43 ` Juergen Gross 1 sibling, 1 reply; 15+ messages in thread From: Ian Campbell @ 2010-10-12 9:59 UTC (permalink / raw) To: Ian Jackson; +Cc: Juergen Gross, xen-devel@lists.xensource.com On Tue, 2010-10-12 at 10:51 +0100, Ian Jackson wrote: > Juergen Gross writes ("[Xen-devel] [PATCH 2 of 3] support of cpupools in xl: commands and library changes"): > > tools/libxl/libxlu_cfg_l.c | 30 -- > > tools/libxl/libxlu_cfg_l.h | 18 - > > I see you reran flex. That's not wrong, but we shouldn't change these > files needlessly, and you didn't make any changes to the .l source > file, so when we apply this patch we should drop the changes to > *_l.[ch]. > > > Renamed all cpu pool related names to *cpupool* > > Is that really true in this patch ? The function names and subcommand > names in xl are still all "pool-*" and "pool_*". The subcommands names are the xm names, which I thought we needed to keep for compatibility. We could add both cpupool- and pool- variants and deprecate the later. Or perhaps these commands are not widely used (at least from scripts and whatnot) and we can just change the name. See <4CAB2CE5.1070208@ts.fujitsu.com> and <1286371053.23155.12762.camel@zakaz.uk.xensource.com> for some previous discussion. Ian. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-12 9:59 ` Ian Campbell @ 2010-10-12 10:43 ` Juergen Gross 0 siblings, 0 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-12 10:43 UTC (permalink / raw) To: Ian Campbell; +Cc: xen-devel@lists.xensource.com, Ian Jackson, Jan Beulich On 10/12/10 11:59, Ian Campbell wrote: > On Tue, 2010-10-12 at 10:51 +0100, Ian Jackson wrote: >> Juergen Gross writes ("[Xen-devel] [PATCH 2 of 3] support of cpupools in xl: commands and library changes"): >>> tools/libxl/libxlu_cfg_l.c | 30 -- >>> tools/libxl/libxlu_cfg_l.h | 18 - >> >> I see you reran flex. That's not wrong, but we shouldn't change these >> files needlessly, and you didn't make any changes to the .l source >> file, so when we apply this patch we should drop the changes to >> *_l.[ch]. >> >>> Renamed all cpu pool related names to *cpupool* >> >> Is that really true in this patch ? The function names and subcommand >> names in xl are still all "pool-*" and "pool_*". > > The subcommands names are the xm names, which I thought we needed to > keep for compatibility. > > We could add both cpupool- and pool- variants and deprecate the later. > Or perhaps these commands are not widely used (at least from scripts and > whatnot) and we can just change the name. I have no problems changing the names to cpupool-*. Do you think we should change the names for xm, too? This move should be ack'ed by Novell, as they have included the cpupool stuff in SLES11 SP1. I don't know if there are other users than Fujitsu (and we could change quite easily). An option would be to support both variants in xm and only cpupool-* in xl. CC-ing Jan. Juergen -- Juergen Gross Principal Developer Operating Systems TSP ES&S SWE OS6 Telephone: +49 (0) 89 3222 2967 Fujitsu Technology Solutions e-mail: juergen.gross@ts.fujitsu.com Domagkstr. 28 Internet: ts.fujitsu.com D-80807 Muenchen Company details: ts.fujitsu.com/imprint.html ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-08 11:23 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 2010-10-12 9:51 ` Ian Jackson @ 2010-10-12 9:56 ` Ian Campbell 1 sibling, 0 replies; 15+ messages in thread From: Ian Campbell @ 2010-10-12 9:56 UTC (permalink / raw) To: Juergen Gross; +Cc: xen-devel@lists.xensource.com On Fri, 2010-10-08 at 12:23 +0100, Juergen Gross wrote: You need a destructor for the libxl_cpumap type, else you will leak the ->map. Also you don't need to explicitly specific destructor_fn for libxl_cpupoolinfo. Something like the following. (hint: you can usually spot this stuff by taking a look at the diff of the generated code in tools/libxl/_libxl_types.[ch]). Ian. diff -r 11f243c2d8be tools/libxl/libxl.h --- a/tools/libxl/libxl.h Fri Oct 08 13:22:37 2010 +0200 +++ b/tools/libxl/libxl.h Tue Oct 12 10:55:13 2010 +0100 @@ -147,6 +147,7 @@ typedef struct { uint32_t size; /* number of bytes in map */ uint64_t *map; } libxl_cpumap; +void libxl_cpumap_destroy(libxl_cpumap *map); typedef enum { XENFV = 1, diff -r 11f243c2d8be tools/libxl/libxl.idl --- a/tools/libxl/libxl.idl Fri Oct 08 13:22:37 2010 +0200 +++ b/tools/libxl/libxl.idl Tue Oct 12 10:55:13 2010 +0100 @@ -6,7 +6,7 @@ libxl_ctx = Builtin("ctx") libxl_ctx = Builtin("ctx") libxl_uuid = Builtin("uuid") libxl_mac = Builtin("mac") -libxl_cpumap = Builtin("cpumap") +libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE) libxl_qemu_machine_type = Number("qemu_machine_type", namespace="libxl_") libxl_console_consback = Number("console_consback", namespace="libxl_") libxl_console_constype = Number("console_constype", namespace="libxl_") @@ -49,7 +49,7 @@ libxl_cpupoolinfo = Struct("cpupoolinfo" ("sched_id", uint32), ("n_dom", uint32), ("cpumap", libxl_cpumap) - ], destructor_fn="libxl_cpupoolinfo_destroy") + ]) libxl_vminfo = Struct("vminfo", [ ("uuid", libxl_uuid), diff -r 11f243c2d8be tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Fri Oct 08 13:22:37 2010 +0200 +++ b/tools/libxl/libxl_utils.c Tue Oct 12 10:55:13 2010 +0100 @@ -720,6 +720,11 @@ int libxl_cpumap_alloc(libxl_cpumap *cpu 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) ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3 of 3] add example cpupool config file 2010-10-08 11:23 [PATCH 0 of 3] support of cpupools in xl Juergen Gross 2010-10-08 11:23 ` [PATCH 1 of 3] Support arbitrary numbers of physical cpus for cpupools in tools Juergen Gross 2010-10-08 11:23 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross @ 2010-10-08 11:23 ` Juergen Gross 2 siblings, 0 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-08 11:23 UTC (permalink / raw) To: xen-devel [-- Attachment #1: Type: text/plain, Size: 220 bytes --] Adds an example configuration file for xm/xl pool-create Signed-off-by: juergen.gross@ts.fujitsu.com 2 files changed, 18 insertions(+) tools/examples/README | 1 + tools/examples/cpupool | 17 +++++++++++++++++ [-- Attachment #2: xen-work-3.patch --] [-- Type: text/x-patch, Size: 1822 bytes --] # HG changeset patch # User Juergen Gross <juergen.gross@ts.fujitsu.com> # Date 1286536957 -7200 # Node ID e7b68ed07b470225d52418f0dce6111cee8abbb0 # Parent 91397dcffead192708972a2628b4b31a58fdbdfb add example cpupool config file Adds an example configuration file for xm/xl pool-create Signed-off-by: juergen.gross@ts.fujitsu.com diff -r 91397dcffead -r e7b68ed07b47 tools/examples/README --- a/tools/examples/README Fri Oct 08 13:21:52 2010 +0200 +++ b/tools/examples/README Fri Oct 08 13:22:37 2010 +0200 @@ -13,6 +13,7 @@ block-common.sh - sourced by block, block-* block-enbd - binds/unbinds network block devices block-nbd - binds/unbinds network block devices +cpupool - example configuration script for 'xm pool-create' external-device-migrate - called by xend for migrating external devices locking.sh - locking functions to prevent concurrent access to critical sections inside script files diff -r 91397dcffead -r e7b68ed07b47 tools/examples/cpupool --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/examples/cpupool Fri Oct 08 13:22:37 2010 +0200 @@ -0,0 +1,17 @@ +#============================================================================ +# Configuration setup for 'xm pool-create' or 'xl pool-create'. +# This script sets the parameters used when a cpupool is created using +# 'xm pool-create' or 'xl pool-create'. +# You use a separate script for each cpupool you want to create, or +# you can set the parameters for the cpupool on the xm command line. +#============================================================================ + +# the name of the new cpupool +name = "Example-Cpupool" + +# the scheduler to use: valid are e.g. credit, sedf, credit2 +sched = "credit" + +# list of cpus to use +cpus = ["2", "3"] + [-- Attachment #3: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 0 of 3] support of cpupools in xl @ 2010-10-05 13:45 Juergen Gross 2010-10-05 13:45 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 0 siblings, 1 reply; 15+ messages in thread From: Juergen Gross @ 2010-10-05 13:45 UTC (permalink / raw) To: xen-devel this is the next version of my patches to support cpupools in xl/libxl. For full functionality it is necessary to change cpumask handling for cpupools in libxc (patch 1). Patch 2 adds the full cpupool support in xl. Patch 3 adds an example configuration file for xm/xl pool-create. Changes since last version: requests of Ian Campbell 19 files changed, 1020 insertions(+), 238 deletions(-) tools/examples/README | 1 tools/examples/cpupool | 18 + tools/libxc/xc_cpupool.c | 118 +++++--- tools/libxc/xc_misc.c | 14 + tools/libxc/xenctrl.h | 26 - tools/libxl/libxl.c | 252 ++++++++++++++++-- tools/libxl/libxl.h | 13 tools/libxl/libxl.idl | 16 - tools/libxl/libxl_internal.h | 3 tools/libxl/libxl_utils.c | 93 +++++- tools/libxl/libxl_utils.h | 10 tools/libxl/libxltypes.py | 5 tools/libxl/libxlu_cfg_l.c | 30 -- tools/libxl/libxlu_cfg_l.h | 18 - tools/libxl/xl.h | 6 tools/libxl/xl_cmdimpl.c | 494 +++++++++++++++++++++++++++++++++++-- tools/libxl/xl_cmdtable.c | 35 ++ tools/python/xen/lowlevel/xc/xc.c | 96 ++----- tools/python/xen/lowlevel/xl/xl.c | 10 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-05 13:45 [PATCH 0 of 3] support of cpupools in xl Juergen Gross @ 2010-10-05 13:45 ` Juergen Gross 2010-10-06 13:31 ` Ian Campbell 2010-10-06 13:47 ` Gianni Tedesco 0 siblings, 2 replies; 15+ messages in thread From: Juergen Gross @ 2010-10-05 13:45 UTC (permalink / raw) To: xen-devel [-- Attachment #1: Type: text/plain, Size: 917 bytes --] Support of cpu pools in xl: library functions xl pool-create xl pool-list xl pool-destroy xl pool-cpu-add xl pool-cpu-remove xl pool-migrate Renamed all cpu pool related names to *cpupool* Signed-off-by: juergen.gross@ts.fujitsu.com 13 files changed, 827 insertions(+), 86 deletions(-) tools/libxl/libxl.c | 203 +++++++++++++++ tools/libxl/libxl.h | 13 - tools/libxl/libxl.idl | 16 - tools/libxl/libxl_internal.h | 2 tools/libxl/libxl_utils.c | 93 ++++++- tools/libxl/libxl_utils.h | 10 tools/libxl/libxltypes.py | 5 tools/libxl/libxlu_cfg_l.c | 30 -- tools/libxl/libxlu_cfg_l.h | 18 - tools/libxl/xl.h | 6 tools/libxl/xl_cmdimpl.c | 472 ++++++++++++++++++++++++++++++++++++- tools/libxl/xl_cmdtable.c | 35 ++ tools/python/xen/lowlevel/xl/xl.c | 10 [-- Attachment #2: xen-work-3.patch --] [-- Type: text/x-patch, Size: 40434 bytes --] # HG changeset patch # User Juergen Gross <juergen.gross@ts.fujitsu.com> # Date 1286285184 -7200 # Node ID baee85a244118f3808082358da3ccc5191d7ffd6 # Parent cfce8e7555059a646c657cc678a966e41ad4e4f1 support of cpupools in xl: commands and library changes Support of cpu pools in xl: library functions xl pool-create xl pool-list xl pool-destroy xl pool-cpu-add xl pool-cpu-remove xl pool-migrate Renamed all cpu pool related names to *cpupool* Signed-off-by: juergen.gross@ts.fujitsu.com diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl.c Tue Oct 05 15:26:24 2010 +0200 @@ -607,21 +607,26 @@ return 0; } -libxl_poolinfo * libxl_list_pool(libxl_ctx *ctx, int *nb_pool) -{ - libxl_poolinfo *ptr, *tmp; - int i; +libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx *ctx, int *nb_pool) +{ + libxl_cpupoolinfo *ptr, *tmp; + int i, m, ncpu; xc_cpupoolinfo_t *info; uint32_t poolid; ptr = NULL; + ncpu = xc_get_max_cpus(ctx->xch); + if (!ncpu) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting max cpu number"); + return NULL; + } poolid = 0; for (i = 0;; i++) { info = xc_cpupool_getinfo(ctx->xch, poolid); if (info == NULL) break; - tmp = realloc(ptr, (i + 1) * sizeof(libxl_poolinfo)); + tmp = realloc(ptr, (i + 1) * sizeof(libxl_cpupoolinfo)); if (!tmp) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpupool info"); free(ptr); @@ -629,6 +634,13 @@ } ptr = tmp; ptr[i].poolid = info->cpupool_id; + ptr[i].sched_id = info->sched_id; + ptr[i].n_dom = info->n_dom; + if (libxl_cpumap_alloc(&ptr[i].cpumap, ncpu)) + break; + for (m = 0; m < ptr[i].cpumap.size / sizeof(*ptr[i].cpumap.map); m++) + ptr[i].cpumap.map[m] = (info->cpumap_size > (m * sizeof(*ptr[i].cpumap.map))) ? + info->cpumap[m] : 0; poolid = info->cpupool_id + 1; free(info); } @@ -3223,7 +3235,6 @@ libxl_vcpuinfo *ptr, *ret; xc_domaininfo_t domaininfo; xc_vcpuinfo_t vcpuinfo; - unsigned num_cpuwords; if (xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo) != 1) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting infolist"); @@ -3235,10 +3246,9 @@ return NULL; } - num_cpuwords = ((*nrcpus + 63) / 64); for (*nb_vcpu = 0; *nb_vcpu <= domaininfo.max_vcpu_id; ++*nb_vcpu, ++ptr) { - ptr->cpumap = malloc(num_cpuwords * sizeof(*ptr->cpumap)); - if (!ptr->cpumap) { + if (libxl_cpumap_alloc(&ptr->cpumap, *nrcpus)) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "allocating cpumap"); return NULL; } if (xc_vcpu_getinfo(ctx->xch, domid, *nb_vcpu, &vcpuinfo) == -1) { @@ -3246,7 +3256,7 @@ return NULL; } if (xc_vcpu_getaffinity(ctx->xch, domid, *nb_vcpu, - ptr->cpumap, ((*nrcpus) + 7) / 8) == -1) { + ptr->cpumap.map, ((*nrcpus) + 7) / 8) == -1) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting vcpu affinity"); return NULL; } @@ -3929,3 +3939,176 @@ libxl__file_reference_unmap(f); free(f->path); } + +int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap) +{ + int ncpus; + + cpumap->map = xc_cpupool_freeinfo(ctx->xch, &ncpus); + if (cpumap->map == NULL) + return ERROR_FAIL; + + cpumap->size = (ncpus + 7) / 8; + + return 0; +} + +int libxl_create_cpupool(libxl_ctx *ctx, char *name, int schedid, + libxl_cpumap cpumap, libxl_uuid *uuid, + uint32_t *poolid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc; + int i; + xs_transaction_t t; + char *uuid_string; + + uuid_string = libxl__uuid2string(&gc, *uuid); + if (!uuid_string) + return ERROR_NOMEM; + + rc = xc_cpupool_create(ctx->xch, poolid, schedid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Could not create cpupool"); + return ERROR_FAIL; + } + + for (i = 0; i < cpumap.size * 8; i++) + if (cpumap.map[i / 64] & (1L << (i % 64))) { + rc = xc_cpupool_addcpu(ctx->xch, *poolid, i); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving cpu to cpupool"); + libxl_destroy_cpupool(ctx, *poolid); + return ERROR_FAIL; + } + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid)); + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid), + uuid_string); + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/local/pool/%d/name", *poolid), + name); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + return 0; + } +} + +int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc, i; + xc_cpupoolinfo_t *info; + xs_transaction_t t; + + info = xc_cpupool_getinfo(ctx->xch, poolid); + if (info == NULL) + return ERROR_NOMEM; + + rc = ERROR_INVAL; + if ((info->cpupool_id != poolid) || (info->n_dom)) + goto out; + + for (i = 0; i < info->cpumap_size; i++) + if (info->cpumap[i / 64] & (1L << (i % 64))) { + rc = xc_cpupool_removecpu(ctx->xch, poolid, i); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error removing cpu from cpupool"); + rc = ERROR_FAIL; + goto out; + } + } + + rc = xc_cpupool_destroy(ctx->xch, poolid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "Could not destroy cpupool"); + rc = ERROR_FAIL; + goto out; + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid)); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + break; + } + + rc = 0; + +out: + free(info); + + return rc; +} + +int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu) +{ + int rc; + + rc = xc_cpupool_addcpu(ctx->xch, poolid, cpu); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving cpu to cpupool"); + return ERROR_FAIL; + } + return 0; +} + +int libxl_cpupool_cpuremove(libxl_ctx *ctx, uint32_t poolid, int cpu) +{ + int rc; + + rc = xc_cpupool_removecpu(ctx->xch, poolid, cpu); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error removing cpu from cpupool"); + return ERROR_FAIL; + } + return 0; +} + +int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid) +{ + libxl__gc gc = LIBXL_INIT_GC(ctx); + int rc; + char *dom_path; + char *vm_path; + char *poolname; + xs_transaction_t t; + + dom_path = libxl__xs_get_dompath(&gc, domid); + if (!dom_path) { + return ERROR_FAIL; + } + + rc = xc_cpupool_movedomain(ctx->xch, poolid, domid); + if (rc) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, + "Error moving domain to cpupool"); + return ERROR_FAIL; + } + + for (;;) { + t = xs_transaction_start(ctx->xsh); + + poolname = libxl__cpupoolid_to_name(&gc, poolid); + vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path)); + if (!vm_path) + break; + + libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path), poolname); + + if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) + break; + } + + return 0; +} diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl.h Tue Oct 05 15:26:24 2010 +0200 @@ -140,8 +140,6 @@ typedef char **libxl_key_value_list; void libxl_key_value_list_destroy(libxl_key_value_list *kvl); - -typedef uint64_t *libxl_cpumap; typedef uint32_t libxl_hwcap[8]; @@ -358,7 +356,7 @@ int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r, uint32_t domid); libxl_dominfo * libxl_list_domain(libxl_ctx*, int *nb_domain); -libxl_poolinfo * libxl_list_pool(libxl_ctx*, int *nb_pool); +libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool); libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm); typedef struct libxl__device_model_starting libxl_device_model_starting; @@ -501,6 +499,15 @@ int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2, int wait); +int libxl_get_freecpus(libxl_ctx *ctx, libxl_cpumap *cpumap); +int libxl_create_cpupool(libxl_ctx *ctx, char *name, int schedid, + libxl_cpumap cpumap, libxl_uuid *uuid, + uint32_t *poolid); +int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid); +int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu); +int libxl_cpupool_cpuremove(libxl_ctx *ctx, uint32_t poolid, int cpu); +int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid); + /* common paths */ const char *libxl_sbindir_path(void); const char *libxl_bindir_path(void); diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl.idl --- a/tools/libxl/libxl.idl Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl.idl Tue Oct 05 15:26:24 2010 +0200 @@ -16,8 +16,6 @@ libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE) libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE) libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE) - -libxl_cpumap = Builtin("cpumap", destructor_fn="free") libxl_hwcap = Builtin("hwcap") @@ -45,9 +43,17 @@ ("vcpu_online", uint32), ], destructor_fn=None) -libxl_poolinfo = Struct("poolinfo", [ - ("poolid", uint32) - ], destructor_fn=None) +libxl_cpumap = Struct("cpumap", [ + ("size", uint32, False, "number of bytes in map"), + ("map", Reference(uint64)), + ]) + +libxl_cpupoolinfo = Struct("cpupoolinfo", [ + ("poolid", uint32), + ("sched_id", uint32), + ("n_dom", uint32), + ("cpumap", libxl_cpumap) + ], destructor_fn="libxl_cpupoolinfo_destroy") libxl_vminfo = Struct("vminfo", [ ("uuid", libxl_uuid), diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl_internal.h Tue Oct 05 15:26:24 2010 +0200 @@ -237,7 +237,7 @@ #define LIBXL__LOG_ERROR XTL_ERROR _hidden char *libxl__domid_to_name(libxl__gc *gc, uint32_t domid); -_hidden char *libxl__poolid_to_name(libxl__gc *gc, uint32_t poolid); +_hidden char *libxl__cpupoolid_to_name(libxl__gc *gc, uint32_t poolid); /* holds the CPUID response for a single CPUID leaf * input contains the value of the EAX and ECX register, diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl_utils.c Tue Oct 05 15:26:24 2010 +0200 @@ -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 @@ 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,40 +114,61 @@ 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) @@ -675,3 +707,36 @@ libxl__free_all(&gc); 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; +} + +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)); +} diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxl_utils.h --- a/tools/libxl/libxl_utils.h Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxl_utils.h Tue Oct 05 15:26:24 2010 +0200 @@ -21,8 +21,10 @@ unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus); int libxl_name_to_domid(libxl_ctx *ctx, const char *name, uint32_t *domid); char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid); -int libxl_name_to_poolid(libxl_ctx *ctx, const char *name, uint32_t *poolid); -char *libxl_poolid_to_name(libxl_ctx *ctx, uint32_t poolid); +int libxl_name_to_cpupoolid(libxl_ctx *ctx, const char *name, uint32_t *poolid); +char *libxl_cpupoolid_to_name(libxl_ctx *ctx, uint32_t poolid); +int libxl_name_to_schedid(libxl_ctx *ctx, const char *name); +char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid); int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid); int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid); int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name); @@ -74,5 +76,9 @@ * return -1 if there are an error */ int libxl_check_device_model_version(libxl_ctx *ctx, char *path); +int libxl_cpumap_alloc(libxl_cpumap *cpumap, int max_cpus); +int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu); +void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); +void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); #endif diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxltypes.py --- a/tools/libxl/libxltypes.py Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxltypes.py Tue Oct 05 15:26:24 2010 +0200 @@ -131,7 +131,10 @@ kwargs.setdefault('passby', PASS_BY_VALUE) kwargs.setdefault('namespace', ty.namespace) - typename = ty.typename[len(kwargs['namespace']):] + + typename = ty.typename + if ty.namespace: + typename = typename[len(kwargs['namespace']):] Type.__init__(self, typename + " *", **kwargs) # diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxlu_cfg_l.c --- a/tools/libxl/libxlu_cfg_l.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxlu_cfg_l.c Tue Oct 05 15:26:24 2010 +0200 @@ -54,6 +54,7 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -83,8 +84,6 @@ #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif - -#endif /* ! C99 */ #endif /* ! FLEXINT_H */ @@ -159,15 +158,7 @@ /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -496,7 +487,7 @@ void xlu__cfg_yyset_column(int column_no, yyscan_t yyscanner); -#line 500 "libxlu_cfg_l.c" +#line 491 "libxlu_cfg_l.c" #define INITIAL 0 #define lexerr 1 @@ -632,12 +623,7 @@ /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -645,7 +631,7 @@ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#define ECHO fwrite( yytext, yyleng, 1, yyout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -656,7 +642,7 @@ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - size_t n; \ + int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -744,7 +730,7 @@ #line 37 "libxlu_cfg_l.l" -#line 748 "libxlu_cfg_l.c" +#line 734 "libxlu_cfg_l.c" yylval = yylval_param; @@ -944,7 +930,7 @@ #line 82 "libxlu_cfg_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 948 "libxlu_cfg_l.c" +#line 934 "libxlu_cfg_l.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(lexerr): yyterminate(); @@ -1687,8 +1673,8 @@ /** Setup the input buffer state to scan the given bytes. The next call to xlu__cfg_yylex() will * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ diff -r cfce8e755505 -r baee85a24411 tools/libxl/libxlu_cfg_l.h --- a/tools/libxl/libxlu_cfg_l.h Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/libxlu_cfg_l.h Tue Oct 05 15:26:24 2010 +0200 @@ -58,6 +58,7 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -87,8 +88,6 @@ #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif - -#endif /* ! C99 */ #endif /* ! FLEXINT_H */ @@ -132,15 +131,7 @@ /* Size of default input buffer. */ #ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else #define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ #endif #ifndef YY_TYPEDEF_YY_BUFFER_STATE @@ -310,12 +301,7 @@ /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else #define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ #endif /* Number of entries by which start-condition stack grows. */ @@ -352,6 +338,6 @@ #line 82 "libxlu_cfg_l.l" -#line 356 "libxlu_cfg_l.h" +#line 342 "libxlu_cfg_l.h" #undef xlu__cfg_yyIN_HEADER #endif /* xlu__cfg_yyHEADER_H */ diff -r cfce8e755505 -r baee85a24411 tools/libxl/xl.h --- a/tools/libxl/xl.h Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/xl.h Tue Oct 05 15:26:24 2010 +0200 @@ -79,6 +79,12 @@ int main_network2attach(int argc, char **argv); int main_network2list(int argc, char **argv); int main_network2detach(int argc, char **argv); +int main_poolcreate(int argc, char **argv); +int main_poollist(int argc, char **argv); +int main_pooldestroy(int argc, char **argv); +int main_poolcpuadd(int argc, char **argv); +int main_poolcpuremove(int argc, char **argv); +int main_poolmigrate(int argc, char **argv); void help(char *command); diff -r cfce8e755505 -r baee85a24411 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/xl_cmdimpl.c Tue Oct 05 15:26:24 2010 +0200 @@ -213,14 +213,14 @@ 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, +static int cpupool_qualifier_to_cpupoolid(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; + return was_name ? libxl_name_to_cpupoolid(&ctx, p, poolid_r) : 0; } static void find_domain(const char *p) @@ -491,7 +491,7 @@ printf("\t(uuid <unknown>)\n"); } - printf("\t(cpupool %s (%d))\n", c_info->poolname, c_info->poolid); + printf("\t(cpupool %s)\n", c_info->poolname); if (c_info->xsdata) printf("\t(xsdata contains data)\n"); else @@ -694,9 +694,9 @@ if (!xlu_cfg_get_string (config, "pool", &buf)) { c_info->poolid = -1; - pool_qualifier_to_poolid(buf, &c_info->poolid, NULL); - } - c_info->poolname = libxl_poolid_to_name(&ctx, c_info->poolid); + cpupool_qualifier_to_cpupoolid(buf, &c_info->poolid, NULL); + } + c_info->poolname = libxl_cpupoolid_to_name(&ctx, c_info->poolid); if (!c_info->poolname) { fprintf(stderr, "Illegal pool specified\n"); exit(1); @@ -3494,7 +3494,7 @@ printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9)); /* CPU AFFINITY */ pcpumap = nr_cpus > 64 ? (uint64_t)-1 : ((1ULL << nr_cpus) - 1); - for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) { + for (cpumap = vcpuinfo->cpumap.map; nr_cpus; ++cpumap) { if (*cpumap < pcpumap) { break; } @@ -3509,7 +3509,7 @@ if (!nr_cpus) { printf("any cpu\n"); } else { - for (cpumap = vcpuinfo->cpumap; nr_cpus; ++cpumap) { + for (cpumap = vcpuinfo->cpumap.map; nr_cpus; ++cpumap) { pcpumap = *cpumap; for (i = 0; !(pcpumap & 1); ++i, pcpumap >>= 1) ; @@ -3781,10 +3781,7 @@ printf("xen_minor : %d\n", info->xen_version_minor); printf("xen_extra : %s\n", info->xen_version_extra); printf("xen_caps : %s\n", info->capabilities); - printf("xen_scheduler : %s\n", - sched_id == XEN_SCHEDULER_SEDF ? "sedf" : - sched_id == XEN_SCHEDULER_CREDIT ? "credit" : - sched_id == XEN_SCHEDULER_CREDIT2 ? "credit2" : "unknown"); + printf("xen_scheduler : %s\n", libxl_schedid_to_name(&ctx, sched_id)); printf("xen_pagesize : %lu\n", info->pagesize); printf("platform_params : virt_start=0x%lx\n", info->virt_start); printf("xen_changeset : %s\n", info->changeset); @@ -3815,6 +3812,8 @@ libxl_physinfo info; const libxl_version_info *vinfo; unsigned int i; + libxl_cpumap cpumap; + int n = 0; if (libxl_get_physinfo(&ctx, &info) != 0) { fprintf(stderr, "libxl_physinfo failed.\n"); @@ -3841,6 +3840,13 @@ printf("total_memory : %"PRIu64"\n", info.total_pages / i); printf("free_memory : %"PRIu64"\n", info.free_pages / i); } + if (!libxl_get_freecpus(&ctx, &cpumap)) { + for (i = 0; i < cpumap.size * 8; i++) + if (libxl_cpumap_test(&cpumap, i)) + n++; + printf("free_cpus : %d\n", n); + free(cpumap.map); + } return; } @@ -5256,3 +5262,445 @@ printf("%d\n", mb); return 0; } + +int main_poolcreate(int argc, char **argv) +{ + char *filename = NULL; + char *p, extra_config[1024]; + int dryrun = 0; + int opt; + int option_index = 0; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"defconfig", 1, 0, 'f'}, + {"dryrun", 0, 0, 'n'}, + {0, 0, 0, 0} + }; + int ret; + void *config_data = 0; + int config_len = 0; + XLU_Config *config; + const char *buf; + char *name, *sched; + uint32_t poolid; + int schedid = -1; + XLU_ConfigList *cpus; + int n_cpus, i, n; + libxl_cpumap freemap; + libxl_cpumap cpumap; + libxl_uuid uuid; + + while (1) { + opt = getopt_long(argc, argv, "hnf:", long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 'f': + filename = optarg; + break; + case 'h': + help("pool-create"); + return 0; + case 'n': + dryrun = 1; + break; + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + memset(extra_config, 0, sizeof(extra_config)); + while (optind < argc) { + if ((p = strchr(argv[optind], '='))) { + if (strlen(extra_config) + 1 < sizeof(extra_config)) { + if (strlen(extra_config)) + strcat(extra_config, "\n"); + strcat(extra_config, argv[optind]); + } + } else if (!filename) { + filename = argv[optind]; + } else { + help("pool-create"); + return -ERROR_FAIL; + } + optind++; + } + + if (!filename) { + help("pool-create"); + return -ERROR_FAIL; + } + + if (libxl_read_file_contents(&ctx, filename, &config_data, &config_len)) { + fprintf(stderr, "Failed to read config file: %s: %s\n", + filename, strerror(errno)); + return -ERROR_FAIL; + } + if (strlen(extra_config)) { + if (config_len > INT_MAX - (strlen(extra_config) + 2)) { + fprintf(stderr, "Failed to attach extra configration\n"); + return -ERROR_FAIL; + } + config_data = xrealloc(config_data, + config_len + strlen(extra_config) + 2); + if (!config_data) { + fprintf(stderr, "Failed to realloc config_data\n"); + return -ERROR_FAIL; + } + strcat(config_data, "\n"); + strcat(config_data, extra_config); + strcat(config_data, "\n"); + config_len += (strlen(extra_config) + 2); + } + + config = xlu_cfg_init(stderr, filename); + if (!config) { + fprintf(stderr, "Failed to allocate for configuration\n"); + return -ERROR_FAIL; + } + + ret = xlu_cfg_readdata(config, config_data, config_len); + if (ret) { + fprintf(stderr, "Failed to parse config file: %s\n", strerror(ret)); + return -ERROR_FAIL; + } + + if (!xlu_cfg_get_string (config, "name", &buf)) + name = strdup(buf); + else + name = basename(filename); + if (!libxl_name_to_cpupoolid(&ctx, name, &poolid)) { + fprintf(stderr, "Pool name \"%s\" already exists\n", name); + return -ERROR_FAIL; + } + + if (!xlu_cfg_get_string (config, "sched", &buf)) { + if ((schedid = libxl_name_to_schedid(&ctx, buf)) < 0) { + fprintf(stderr, "Unknown scheduler\n"); + return -ERROR_FAIL; + } + } else { + if ((schedid = libxl_get_sched_id(&ctx)) < 0) { + fprintf(stderr, "get_sched_id sysctl failed.\n"); + return -ERROR_FAIL; + } + } + sched = libxl_schedid_to_name(&ctx, schedid); + + if (libxl_get_freecpus(&ctx, &freemap)) { + fprintf(stderr, "libxl_get_freecpus failed\n"); + return -ERROR_FAIL; + } + if (libxl_cpumap_alloc(&cpumap, freemap.size * 8)) { + fprintf(stderr, "Failed to allocate cpumap\n"); + return -ERROR_FAIL; + } + if (!xlu_cfg_get_list(config, "cpus", &cpus, 0, 0)) { + n_cpus = 0; + while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) { + i = atoi(buf); + if ((i < 0) || (i >= freemap.size * 8) || + !libxl_cpumap_test(&freemap, i)) { + fprintf(stderr, "cpu %d illegal or not free\n", i); + return -ERROR_FAIL; + } + libxl_cpumap_set(&cpumap, i); + n_cpus++; + } + } else { + n_cpus = 1; + n = 0; + for (i = 0; i < freemap.size; i++) + if (libxl_cpumap_test(&freemap, i)) { + n++; + libxl_cpumap_set(&cpumap, i); + break; + } + if (n != n_cpus) { + fprintf(stderr, "no free cpu found\n"); + return -ERROR_FAIL; + } + } + + libxl_uuid_generate(&uuid); + + printf("Using config file \"%s\"\n", filename); + printf("pool name: %s\n", name); + printf("scheduler: %s\n", sched); + printf("number of cpus: %d\n", n_cpus); + + if (dryrun) + return 0; + + poolid = 0; + if (libxl_create_cpupool(&ctx, name, schedid, cpumap, &uuid, &poolid)) { + fprintf(stderr, "error on creating cpupool\n"); + return -ERROR_FAIL; + } + + return 0; +} + +int main_poollist(int argc, char **argv) +{ + int opt; + int option_index = 0; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"long", 0, 0, 'l'}, + {"cpus", 0, 0, 'c'}, + {0, 0, 0, 0} + }; + int opt_long = 0; + int opt_cpus = 0; + char *pool = NULL; + libxl_cpupoolinfo *poolinfo; + int n_pools, p, c, n; + uint32_t poolid; + char *name; + int ret = 0; + + while (1) { + opt = getopt_long(argc, argv, "hlc", long_options, &option_index); + if (opt == -1) + break; + + switch (opt) { + case 'h': + help("pool-list"); + return 0; + case 'l': + opt_long = 1; + break; + case 'c': + opt_cpus = 1; + break; + default: + fprintf(stderr, "option not supported\n"); + break; + } + } + + if ((optind + 1) < argc) { + help("pool-list"); + return -ERROR_FAIL; + } + if (optind < argc) { + pool = argv[optind]; + if (libxl_name_to_cpupoolid(&ctx, pool, &poolid)) { + fprintf(stderr, "Pool \'%s\' does not exist\n", pool); + return -ERROR_FAIL; + } + } + + poolinfo = libxl_list_cpupool(&ctx, &n_pools); + if (!poolinfo) { + fprintf(stderr, "error getting cpupool info\n"); + return -ERROR_NOMEM; + } + + if (!opt_long) { + printf("%-19s", "Name"); + if (opt_cpus) + printf("CPU list\n"); + else + printf("CPUs Sched Active Domain count\n"); + } + + for (p = 0; p < n_pools; p++) { + if (!ret && (!pool || (poolinfo[p].poolid != poolid))) { + name = libxl_cpupoolid_to_name(&ctx, poolinfo[p].poolid); + if (!name) { + fprintf(stderr, "error getting cpupool info\n"); + ret = -ERROR_NOMEM; + } + else if (opt_long) { + ret = -ERROR_NI; + } else { + printf("%-19s", name); + free(name); + n = 0; + for (c = 0; c < poolinfo[p].cpumap.size * 8; c++) + if (poolinfo[p].cpumap.map[c / 64] & (1L << (c % 64))) { + if (n && opt_cpus) printf(","); + if (opt_cpus) printf("%d", c); + n++; + } + if (!opt_cpus) { + printf("%3d %9s y %4d", n, + libxl_schedid_to_name(&ctx, poolinfo[p].sched_id), + poolinfo[p].n_dom); + } + printf("\n"); + } + } + libxl_cpupoolinfo_destroy(poolinfo + p); + } + + return ret; +} + +int main_pooldestroy(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-destroy"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-destroy"); + return -ERROR_FAIL; + } + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_destroy_cpupool(&ctx, poolid); +} + +int main_poolcpuadd(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + int cpu; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-cpu-add"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-cpu-add"); + return -ERROR_FAIL; + } + + if (!argv[optind]) { + fprintf(stderr, "no cpu specified\n"); + help("pool-cpu-add"); + return -ERROR_FAIL; + } + cpu = atoi(argv[optind]); + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_cpuadd(&ctx, poolid, cpu); +} + +int main_poolcpuremove(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + int cpu; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-cpu-remove"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-cpu-remove"); + return -ERROR_FAIL; + } + + if (!argv[optind]) { + fprintf(stderr, "no cpu specified\n"); + help("pool-cpu-remove"); + return -ERROR_FAIL; + } + cpu = atoi(argv[optind]); + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_cpuremove(&ctx, poolid, cpu); +} + +int main_poolmigrate(int argc, char **argv) +{ + int opt; + char *pool; + uint32_t poolid; + char *dom; + uint32_t domid; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + help("pool-migrate"); + return 0; + default: + fprintf(stderr, "option `%c' not supported.\n", opt); + break; + } + } + + dom = argv[optind++]; + if (!dom) { + fprintf(stderr, "no domain specified\n"); + help("pool-migrate"); + return -ERROR_FAIL; + } + + pool = argv[optind++]; + if (!pool) { + fprintf(stderr, "no cpupool specified\n"); + help("pool-migrate"); + return -ERROR_FAIL; + } + + if (domain_qualifier_to_domid(dom, &domid, NULL) || + !libxl_domid_to_name(&ctx, domid)) { + fprintf(stderr, "unknown domain \'%s\'\n", dom); + return -ERROR_FAIL; + } + + if (cpupool_qualifier_to_cpupoolid(pool, &poolid, NULL) || + !libxl_cpupoolid_to_name(&ctx, poolid)) { + fprintf(stderr, "unknown pool \'%s\'\n", pool); + return -ERROR_FAIL; + } + + return -libxl_cpupool_movedomain(&ctx, poolid, domid); +} diff -r cfce8e755505 -r baee85a24411 tools/libxl/xl_cmdtable.c --- a/tools/libxl/xl_cmdtable.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/libxl/xl_cmdtable.c Tue Oct 05 15:26:24 2010 +0200 @@ -338,6 +338,41 @@ "destroy a domain's version 2 virtual network device", "<Domain> <DevId>", }, + { "pool-create", + &main_poolcreate, + "Create a CPU pool based an ConfigFile", + "[options] <ConfigFile> [vars]", + "-h, --help Print this help.\n" + "-f=FILE, --defconfig=FILE Use the given configuration file.\n" + "-n, --dryrun Dry run - prints the resulting configuration." + }, + { "pool-list", + &main_poollist, + "List CPU pools on host", + "[-l|--long] [-c|--cpus] [<CPU Pool>]", + "-l, --long Output all CPU pool details.\n" + "-c, --cpus Output list of CPUs used by a pool" + }, + { "pool-destroy", + &main_pooldestroy, + "Deactivates a CPU pool", + "<CPU Pool>", + }, + { "pool-cpu-add", + &main_poolcpuadd, + "Adds a CPU to a CPU pool", + "<CPU Pool> <CPU nr>", + }, + { "pool-cpu-remove", + &main_poolcpuremove, + "Removes a CPU from a CPU pool", + "<CPU Pool> <CPU nr>", + }, + { "pool-migrate", + &main_poolmigrate, + "Moves a domain into a CPU pool", + "<Domain> <CPU Pool>", + }, }; int cmdtable_len = sizeof(cmd_table)/sizeof(struct cmd_spec); diff -r cfce8e755505 -r baee85a24411 tools/python/xen/lowlevel/xl/xl.c --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 14:19:13 2010 +0200 +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 15:26:24 2010 +0200 @@ -208,6 +208,11 @@ return -1; } +int attrib__uint64_t_ptr_set(PyObject *v, uint64_t * *pptr) +{ + return -1; +} + int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) { return -1; @@ -254,6 +259,11 @@ } PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list *pptr) +{ + return NULL; +} + +PyObject *attrib__uint64_t_ptr_get(uint64_t * *pptr) { return NULL; } [-- Attachment #3: Type: text/plain, Size: 138 bytes --] _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-05 13:45 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross @ 2010-10-06 13:31 ` Ian Campbell 2010-10-06 13:47 ` Gianni Tedesco 1 sibling, 0 replies; 15+ messages in thread From: Ian Campbell @ 2010-10-06 13:31 UTC (permalink / raw) To: Juergen Gross; +Cc: xen-devel@lists.xensource.com On Tue, 2010-10-05 at 14:45 +0100, Juergen Gross wrote: > Support of cpu pools in xl: > library functions > xl pool-create > xl pool-list > xl pool-destroy > xl pool-cpu-add > xl pool-cpu-remove > xl pool-migrate > Renamed all cpu pool related names to *cpupool* > > Signed-off-by: juergen.gross@ts.fujitsu.com Acked-by: Ian Campbell <ian.campbell@citrix.com> > > > 13 files changed, 827 insertions(+), 86 deletions(-) > tools/libxl/libxl.c | 203 +++++++++++++++ > tools/libxl/libxl.h | 13 - > tools/libxl/libxl.idl | 16 - > tools/libxl/libxl_internal.h | 2 > tools/libxl/libxl_utils.c | 93 ++++++- > tools/libxl/libxl_utils.h | 10 > tools/libxl/libxltypes.py | 5 > tools/libxl/libxlu_cfg_l.c | 30 -- > tools/libxl/libxlu_cfg_l.h | 18 - > tools/libxl/xl.h | 6 > tools/libxl/xl_cmdimpl.c | 472 ++++++++++++++++++++++++++++++++++++- > tools/libxl/xl_cmdtable.c | 35 ++ > tools/python/xen/lowlevel/xl/xl.c | 10 > > ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-05 13:45 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 2010-10-06 13:31 ` Ian Campbell @ 2010-10-06 13:47 ` Gianni Tedesco 2010-10-08 8:41 ` Juergen Gross 1 sibling, 1 reply; 15+ messages in thread From: Gianni Tedesco @ 2010-10-06 13:47 UTC (permalink / raw) To: Juergen Gross; +Cc: xen-devel@lists.xensource.com On Tue, 2010-10-05 at 14:45 +0100, Juergen Gross wrote: > diff -r cfce8e755505 -r baee85a24411 tools/python/xen/lowlevel/xl/xl.c > --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 14:19:13 2010 +0200 > +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 15:26:24 2010 +0200 > @@ -208,6 +208,11 @@ > return -1; > } > > +int attrib__uint64_t_ptr_set(PyObject *v, uint64_t * *pptr) > +{ > + return -1; > +} > + > int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) > { > return -1; > @@ -254,6 +259,11 @@ > } > > PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list > *pptr) > +{ > + return NULL; > +} > + > +PyObject *attrib__uint64_t_ptr_get(uint64_t * *pptr) > { > return NULL; > } Because of using Reference(Uint64) directly in the idl - the python bindings autogenerate these type-marshalling functions. It's not quite clear how these are supposed to be implemented in a generic way! :) There ought to be a builtin type for this ala libxl_uuid and other types to generate correct bindings. The other chunk to libxltypes then becomes redundant but it's OK with me I think. NAK'd-by: Gianni Tedesco <gianni.tedesco@citrix.com> ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-06 13:47 ` Gianni Tedesco @ 2010-10-08 8:41 ` Juergen Gross 2010-10-08 8:52 ` Ian Campbell 0 siblings, 1 reply; 15+ messages in thread From: Juergen Gross @ 2010-10-08 8:41 UTC (permalink / raw) To: Gianni Tedesco; +Cc: xen-devel@lists.xensource.com On 10/06/10 15:47, Gianni Tedesco wrote: > On Tue, 2010-10-05 at 14:45 +0100, Juergen Gross wrote: >> diff -r cfce8e755505 -r baee85a24411 tools/python/xen/lowlevel/xl/xl.c >> --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 14:19:13 2010 +0200 >> +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 15:26:24 2010 +0200 >> @@ -208,6 +208,11 @@ >> return -1; >> } >> >> +int attrib__uint64_t_ptr_set(PyObject *v, uint64_t * *pptr) >> +{ >> + return -1; >> +} >> + >> int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) >> { >> return -1; >> @@ -254,6 +259,11 @@ >> } >> >> PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list >> *pptr) >> +{ >> + return NULL; >> +} >> + >> +PyObject *attrib__uint64_t_ptr_get(uint64_t * *pptr) >> { >> return NULL; >> } > > Because of using Reference(Uint64) directly in the idl - the python > bindings autogenerate these type-marshalling functions. It's not quite > clear how these are supposed to be implemented in a generic way! :) > > There ought to be a builtin type for this ala libxl_uuid and other types > to generate correct bindings. Gianni, I suppose I need a builtin for the complete libxl_cpumap type, not only for the uint64_t array due to the size info which is needed to access the array correctly. I'm not sure how to translate this into the correct bindings. I think the cpumap should be translated into a python list. Which methods do I need to include in xc.c? Or would it be okay to add just some minimal dummy functions and put in the functionality if needed? Juergeb -- Juergen Gross Principal Developer Operating Systems TSP ES&S SWE OS6 Telephone: +49 (0) 89 3222 2967 Fujitsu Technology Solutions e-mail: juergen.gross@ts.fujitsu.com Domagkstr. 28 Internet: ts.fujitsu.com D-80807 Muenchen Company details: ts.fujitsu.com/imprint.html ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-08 8:41 ` Juergen Gross @ 2010-10-08 8:52 ` Ian Campbell 2010-10-08 9:21 ` Gianni Tedesco 0 siblings, 1 reply; 15+ messages in thread From: Ian Campbell @ 2010-10-08 8:52 UTC (permalink / raw) To: Juergen Gross; +Cc: xen-devel@lists.xensource.com, Gianni Tedesco On Fri, 2010-10-08 at 09:41 +0100, Juergen Gross wrote: > On 10/06/10 15:47, Gianni Tedesco wrote: > > On Tue, 2010-10-05 at 14:45 +0100, Juergen Gross wrote: > >> diff -r cfce8e755505 -r baee85a24411 tools/python/xen/lowlevel/xl/xl.c > >> --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 14:19:13 2010 +0200 > >> +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 15:26:24 2010 +0200 > >> @@ -208,6 +208,11 @@ > >> return -1; > >> } > >> > >> +int attrib__uint64_t_ptr_set(PyObject *v, uint64_t * *pptr) > >> +{ > >> + return -1; > >> +} > >> + > >> int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) > >> { > >> return -1; > >> @@ -254,6 +259,11 @@ > >> } > >> > >> PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list > >> *pptr) > >> +{ > >> + return NULL; > >> +} > >> + > >> +PyObject *attrib__uint64_t_ptr_get(uint64_t * *pptr) > >> { > >> return NULL; > >> } > > > > Because of using Reference(Uint64) directly in the idl - the python > > bindings autogenerate these type-marshalling functions. It's not quite > > clear how these are supposed to be implemented in a generic way! :) > > > > There ought to be a builtin type for this ala libxl_uuid and other types > > to generate correct bindings. > > Gianni, I suppose I need a builtin for the complete libxl_cpumap type, not > only for the uint64_t array due to the size info which is needed to access > the array correctly. Yes, I think so. There is no way in the IDL to have a pure bitmap type which refers to a different field in the containing structure to get the length, and doing this would likely be unnecessarily complicated. > I'm not sure how to translate this into the correct bindings. I think the > cpumap should be translated into a python list. Yes, I think lists make sense. > Which methods do I need to include in xc.c? I think it will become clear when you try to build it, just follow the build errors ;-) > Or would it be okay to add just some minimal dummy > functions and put in the functionality if needed? Personally, given that you are planning to change the type from uint64_t to bytes I'd be happy if you stubbed them out for uint64_t for now and only implemented properly during the conversion. Ian. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2 of 3] support of cpupools in xl: commands and library changes 2010-10-08 8:52 ` Ian Campbell @ 2010-10-08 9:21 ` Gianni Tedesco 0 siblings, 0 replies; 15+ messages in thread From: Gianni Tedesco @ 2010-10-08 9:21 UTC (permalink / raw) To: Ian Campbell; +Cc: Juergen Gross, xen-devel@lists.xensource.com On Fri, 2010-10-08 at 09:52 +0100, Ian Campbell wrote: > On Fri, 2010-10-08 at 09:41 +0100, Juergen Gross wrote: > > On 10/06/10 15:47, Gianni Tedesco wrote: > > > On Tue, 2010-10-05 at 14:45 +0100, Juergen Gross wrote: > > >> diff -r cfce8e755505 -r baee85a24411 tools/python/xen/lowlevel/xl/xl.c > > >> --- a/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 14:19:13 2010 +0200 > > >> +++ b/tools/python/xen/lowlevel/xl/xl.c Tue Oct 05 15:26:24 2010 +0200 > > >> @@ -208,6 +208,11 @@ > > >> return -1; > > >> } > > >> > > >> +int attrib__uint64_t_ptr_set(PyObject *v, uint64_t * *pptr) > > >> +{ > > >> + return -1; > > >> +} > > >> + > > >> int attrib__libxl_cpumap_set(PyObject *v, libxl_cpumap *pptr) > > >> { > > >> return -1; > > >> @@ -254,6 +259,11 @@ > > >> } > > >> > > >> PyObject *attrib__libxl_cpuid_policy_list_get(libxl_cpuid_policy_list > > >> *pptr) > > >> +{ > > >> + return NULL; > > >> +} > > >> + > > >> +PyObject *attrib__uint64_t_ptr_get(uint64_t * *pptr) > > >> { > > >> return NULL; > > >> } > > > > > > Because of using Reference(Uint64) directly in the idl - the python > > > bindings autogenerate these type-marshalling functions. It's not quite > > > clear how these are supposed to be implemented in a generic way! :) > > > > > > There ought to be a builtin type for this ala libxl_uuid and other types > > > to generate correct bindings. > > > > Gianni, I suppose I need a builtin for the complete libxl_cpumap type, not > > only for the uint64_t array due to the size info which is needed to access > > the array correctly. Yes exactly, creating a full struct as you have done is "the right way to do it"(tm). See detailed comments below. > Yes, I think so. > > There is no way in the IDL to have a pure bitmap type which refers to a > different field in the containing structure to get the length, and doing > this would likely be unnecessarily complicated. > > > I'm not sure how to translate this into the correct bindings. I think the > > cpumap should be translated into a python list. > > Yes, I think lists make sense. > > > Which methods do I need to include in xc.c? > > I think it will become clear when you try to build it, just follow the > build errors ;-) > > > Or would it be okay to add just some minimal dummy > > functions and put in the functionality if needed? Yes exactly as Ian says. You will notice plenty of similar stubbed out and unimplemented functions in the python bindings that we can do such nice things with later. If you would like to flesh out the cpupool stuff at the same time as adding it then that would be much appreciated but given how incomplete the binding is we can't say it's 'mandatory' and keep a straight face. > Personally, given that you are planning to change the type from uint64_t > to bytes I'd be happy if you stubbed them out for uint64_t for now and > only implemented properly during the conversion. Yeha on closer inspection, this is all kind of moot from the binding perspective. What needs to happen is for libxl_cpumap to be the builtin type defined in libxl.h (and possibly c&p any destructor functions that were generated in to libxl.c). We don't need to generate bindings for an object who's attributes are: (array, length)... Similar to libxl_string_list. In that case the existing attrib__libxl_cpumap_(set|get) for cpupoolinfo can do all of the necessary work of converting to and from python lists and no patch is required to tools/python/.../xl.c. But yes, no point doing an non-dummy implementation of that if it's only going to change before the rest of the binding is actually written! :) Gianni ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2010-10-12 10:43 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-10-08 11:23 [PATCH 0 of 3] support of cpupools in xl Juergen Gross 2010-10-08 11:23 ` [PATCH 1 of 3] Support arbitrary numbers of physical cpus for cpupools in tools Juergen Gross 2010-10-08 11:23 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 2010-10-12 9:51 ` Ian Jackson 2010-10-12 9:56 ` Juergen Gross 2010-10-12 9:59 ` Ian Campbell 2010-10-12 10:43 ` Juergen Gross 2010-10-12 9:56 ` Ian Campbell 2010-10-08 11:23 ` [PATCH 3 of 3] add example cpupool config file Juergen Gross -- strict thread matches above, loose matches on Subject: below -- 2010-10-05 13:45 [PATCH 0 of 3] support of cpupools in xl Juergen Gross 2010-10-05 13:45 ` [PATCH 2 of 3] support of cpupools in xl: commands and library changes Juergen Gross 2010-10-06 13:31 ` Ian Campbell 2010-10-06 13:47 ` Gianni Tedesco 2010-10-08 8:41 ` Juergen Gross 2010-10-08 8:52 ` Ian Campbell 2010-10-08 9:21 ` Gianni Tedesco
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.