diff options
author | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2010-12-09 11:21:30 +0100 |
---|---|---|
committer | Juergen Gross <juergen.gross@ts.fujitsu.com> | 2010-12-09 11:21:30 +0100 |
commit | 93039a68a59a917e9e3419dfe6114b1571207acc (patch) | |
tree | 4171c62e090a9ad4158c6a06b7c3c77398c1942e /tools/libxl | |
parent | d2c71cadc565bcb8098563dafd8abcafc0c2358c (diff) | |
download | xen-93039a68a59a917e9e3419dfe6114b1571207acc.tar.gz xen-93039a68a59a917e9e3419dfe6114b1571207acc.tar.bz2 xen-93039a68a59a917e9e3419dfe6114b1571207acc.zip |
Support getting topology info in libxl
Added new function libxl_get_topologyinfo() to obtain this information from
hypervisor.
Signed-off-by: juergen.gross@ts.fujitsu.com
Signed-off-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/libxl')
-rw-r--r-- | tools/libxl/libxl.c | 53 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 8 | ||||
-rw-r--r-- | tools/libxl/libxl.idl | 7 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.c | 24 | ||||
-rw-r--r-- | tools/libxl/libxl_utils.h | 2 |
5 files changed, 94 insertions, 0 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index b8aa5d304d..4be8b8f988 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3223,6 +3223,59 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo) 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 --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 56f872300c..63fb9f9a13 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -149,6 +149,13 @@ typedef struct { } 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, XENPV, @@ -468,6 +475,7 @@ typedef enum { 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 --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl index 8dd774969f..81fcfd9a50 100644 --- a/tools/libxl/libxl.idl +++ b/tools/libxl/libxl.idl @@ -7,6 +7,7 @@ libxl_ctx = Builtin("ctx") 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 --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 20b2208f01..40c73d4610 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -751,6 +751,30 @@ void libxl_cpumap_reset(libxl_cpumap *cpumap, int cpu) 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 --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 7846c4233c..a8f7f105c1 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -82,5 +82,7 @@ void libxl_cpumap_set(libxl_cpumap *cpumap, int cpu); 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 |