aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2010-12-09 11:21:30 +0100
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2010-12-09 11:21:30 +0100
commit93039a68a59a917e9e3419dfe6114b1571207acc (patch)
tree4171c62e090a9ad4158c6a06b7c3c77398c1942e /tools/libxl
parentd2c71cadc565bcb8098563dafd8abcafc0c2358c (diff)
downloadxen-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.c53
-rw-r--r--tools/libxl/libxl.h8
-rw-r--r--tools/libxl/libxl.idl7
-rw-r--r--tools/libxl/libxl_utils.c24
-rw-r--r--tools/libxl/libxl_utils.h2
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