[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Support getting topology info in libxl
# HG changeset patch # User Juergen Gross <juergen.gross@xxxxxxxxxxxxxx> # Date 1291890090 -3600 # Node ID f713cff1a5870b44927db041745b54d5424014c2 # Parent 8079cba70803523dccaaeee22d35e5adc9932597 Support getting topology info in libxl Added new function libxl_get_topologyinfo() to obtain this information from hypervisor. Signed-off-by: juergen.gross@xxxxxxxxxxxxxx Signed-off-by: Ian Jackson <ian.jackson.citrix.com> --- tools/libxl/libxl.c | 53 ++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.h | 8 +++++ tools/libxl/libxl.idl | 7 +++++ tools/libxl/libxl_utils.c | 24 +++++++++++++++++ tools/libxl/libxl_utils.h | 2 + tools/python/xen/lowlevel/xl/xl.c | 24 +++++++++++++++++ 6 files changed, 118 insertions(+) diff -r 8079cba70803 -r f713cff1a587 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/libxl/libxl.c Thu Dec 09 11:21:30 2010 +0100 @@ -3223,6 +3223,59 @@ int libxl_get_physinfo(libxl_ctx *ctx, l return 0; } +int libxl_get_topologyinfo(libxl_ctx *ctx, libxl_topologyinfo *info) +{ + xc_topologyinfo_t tinfo; + DECLARE_HYPERCALL_BUFFER(xc_cpu_to_core_t, coremap); + DECLARE_HYPERCALL_BUFFER(xc_cpu_to_socket_t, socketmap); + DECLARE_HYPERCALL_BUFFER(xc_cpu_to_node_t, nodemap); + int i; + int rc = 0; + + rc += libxl_cpuarray_alloc(ctx, &info->coremap); + rc += libxl_cpuarray_alloc(ctx, &info->socketmap); + rc += libxl_cpuarray_alloc(ctx, &info->nodemap); + if (rc) + goto fail; + + coremap = xc_hypercall_buffer_alloc(ctx->xch, coremap, sizeof(*coremap) * info->coremap.entries); + socketmap = xc_hypercall_buffer_alloc(ctx->xch, socketmap, sizeof(*socketmap) * info->socketmap.entries); + nodemap = xc_hypercall_buffer_alloc(ctx->xch, nodemap, sizeof(*nodemap) * info->nodemap.entries); + if ((coremap == NULL) || (socketmap == NULL) || (nodemap == NULL)) + goto fail; + + set_xen_guest_handle(tinfo.cpu_to_core, coremap); + set_xen_guest_handle(tinfo.cpu_to_socket, socketmap); + set_xen_guest_handle(tinfo.cpu_to_node, nodemap); + tinfo.max_cpu_index = info->coremap.entries - 1; + if (xc_topologyinfo(ctx->xch, &tinfo) != 0) + goto fail; + + for (i = 0; i <= tinfo.max_cpu_index; i++) { + if (i < info->coremap.entries) + info->coremap.array[i] = (coremap[i] == INVALID_TOPOLOGY_ID) ? + LIBXL_CPUARRAY_INVALID_ENTRY : coremap[i]; + if (i < info->socketmap.entries) + info->socketmap.array[i] = (socketmap[i] == INVALID_TOPOLOGY_ID) ? + LIBXL_CPUARRAY_INVALID_ENTRY : socketmap[i]; + if (i < info->nodemap.entries) + info->nodemap.array[i] = (nodemap[i] == INVALID_TOPOLOGY_ID) ? + LIBXL_CPUARRAY_INVALID_ENTRY : nodemap[i]; + } + + xc_hypercall_buffer_free(ctx->xch, coremap); + xc_hypercall_buffer_free(ctx->xch, socketmap); + xc_hypercall_buffer_free(ctx->xch, nodemap); + return 0; + +fail: + xc_hypercall_buffer_free(ctx->xch, coremap); + xc_hypercall_buffer_free(ctx->xch, socketmap); + xc_hypercall_buffer_free(ctx->xch, nodemap); + libxl_topologyinfo_destroy(info); + return ERROR_FAIL; +} + const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx) { union { diff -r 8079cba70803 -r f713cff1a587 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/libxl/libxl.h Thu Dec 09 11:21:30 2010 +0100 @@ -148,6 +148,13 @@ typedef struct { uint8_t *map; } libxl_cpumap; void libxl_cpumap_destroy(libxl_cpumap *map); + +typedef struct { + uint32_t entries; + uint32_t *array; +} libxl_cpuarray; +#define LIBXL_CPUARRAY_INVALID_ENTRY ~0 +void libxl_cpuarray_destroy(libxl_cpuarray *array); typedef enum { XENFV = 1, @@ -468,6 +475,7 @@ int libxl_button_press(libxl_ctx *ctx, u int libxl_button_press(libxl_ctx *ctx, uint32_t domid, libxl_button button); int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo); +int libxl_get_topologyinfo(libxl_ctx *ctx, libxl_topologyinfo *info); libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid, int *nb_vcpu, int *nrcpus); int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid, diff -r 8079cba70803 -r f713cff1a587 tools/libxl/libxl.idl --- a/tools/libxl/libxl.idl Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/libxl/libxl.idl Thu Dec 09 11:21:30 2010 +0100 @@ -7,6 +7,7 @@ libxl_uuid = Builtin("uuid") libxl_uuid = Builtin("uuid") libxl_mac = Builtin("mac") libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE) +libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_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_") @@ -302,6 +303,12 @@ libxl_physinfo = Struct("physinfo", [ ("phys_cap", uint32), ], destructor_fn=None) +libxl_topologyinfo = Struct("topologyinfo", [ + ("coremap", libxl_cpuarray, False, "cpu to core map"), + ("socketmap", libxl_cpuarray, False, "cpu to socket map"), + ("nodemap", libxl_cpuarray, False, "cpu to node map"), + ]) + libxl_sched_credit = Struct("sched_credit", [ ("weight", integer), ("cap", integer), diff -r 8079cba70803 -r f713cff1a587 tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/libxl/libxl_utils.c Thu Dec 09 11:21:30 2010 +0100 @@ -751,6 +751,30 @@ void libxl_cpumap_reset(libxl_cpumap *cp cpumap->map[cpu / 8] &= ~(1 << (cpu & 7)); } +int libxl_cpuarray_alloc(libxl_ctx *ctx, libxl_cpuarray *cpuarray) +{ + int max_cpus; + int i; + + max_cpus = libxl_get_max_cpus(ctx); + if (max_cpus == 0) + return ERROR_FAIL; + + cpuarray->array = calloc(max_cpus, sizeof(*cpuarray->array)); + if (!cpuarray->array) + return ERROR_NOMEM; + cpuarray->entries = max_cpus; + for (i = 0; i < max_cpus; i++) + cpuarray->array[i] = LIBXL_CPUARRAY_INVALID_ENTRY; + + return 0; +} + +void libxl_cpuarray_destroy(libxl_cpuarray *array) +{ + free(array->array); +} + int libxl_get_max_cpus(libxl_ctx *ctx) { return xc_get_max_cpus(ctx->xch); diff -r 8079cba70803 -r f713cff1a587 tools/libxl/libxl_utils.h --- a/tools/libxl/libxl_utils.h Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/libxl/libxl_utils.h Thu Dec 09 11:21:30 2010 +0100 @@ -82,5 +82,7 @@ void libxl_cpumap_reset(libxl_cpumap *cp void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu); #define libxl_for_each_cpu(var, map) for (var = 0; var < (map).size * 8; var++) +int libxl_cpuarray_alloc(libxl_ctx *ctx, libxl_cpuarray *cpuarray); + #endif diff -r 8079cba70803 -r f713cff1a587 tools/python/xen/lowlevel/xl/xl.c --- a/tools/python/xen/lowlevel/xl/xl.c Fri Dec 03 09:36:47 2010 +0000 +++ b/tools/python/xen/lowlevel/xl/xl.c Thu Dec 09 11:21:30 2010 +0100 @@ -224,6 +224,11 @@ int attrib__libxl_cpumap_set(PyObject *v return 0; } +int attrib__libxl_cpuarray_set(PyObject *v, libxl_cpuarray *pptr) +{ + return -1; +} + int attrib__libxl_domain_build_state_ptr_set(PyObject *v, libxl_domain_build_state **pptr) { return -1; @@ -284,6 +289,25 @@ PyObject *attrib__libxl_cpumap_get(libxl } } return cpulist; +} + +PyObject *attrib__libxl_cpuarray_get(libxl_cpuarray *pptr) +{ + PyObject *list = NULL; + int i; + + list = PyList_New(0); + for (i = 0; i < pptr->entries; i++) { + if (pptr->array[i] == LIBXL_CPUARRAY_INVALID_ENTRY) { + PyList_Append(list, Py_None); + } else { + PyObject* pyint = PyInt_FromLong(pptr->array[i]); + + PyList_Append(list, pyint); + Py_DECREF(pyint); + } + } + return list; } PyObject *attrib__libxl_domain_build_state_ptr_get(libxl_domain_build_state **pptr) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |