[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 04 of 10 [RFC]] libxl: Introduce libxl_get_numainfo() calling xc_numainfo()
xc_numainfo is already there, and it provides information about things like free memory on each NUMA node and `distances` among the various nodes. In preparation of putting an automatic domain-on-nodes placement logic --which will benefit a lot from having such information available-- make it possible to retrieve them within libxl by a new libxl_get_numainfo() API call (very similar to libxl_get_topologyinfo). TODO: * Enable exporting node distances as soon as we figure out how to stick an array in an IDL defined type (patches have been posted, will rebase onto them if it'll turn out to be the case. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2830,6 +2830,83 @@ int libxl_get_physinfo(libxl_ctx *ctx, l return 0; } +libxl_numainfo *libxl_get_numainfo(libxl_ctx *ctx, int *nr) +{ + xc_numainfo_t ninfo; + DECLARE_HYPERCALL_BUFFER(xc_node_to_memsize_t, memsize); + DECLARE_HYPERCALL_BUFFER(xc_node_to_memfree_t, memfree); + DECLARE_HYPERCALL_BUFFER(uint32_t, node_distances); + libxl_numainfo *ret = NULL; + int i, max_nodes; + + max_nodes = libxl_get_max_nodes(ctx); + if (max_nodes == 0) + { + LIBXL__LOG(ctx, XTL_ERROR, "Unable to determine number of NODES"); + return NULL; + } + + memsize = xc_hypercall_buffer_alloc + (ctx->xch, memsize, sizeof(*memsize) * max_nodes); + memfree = xc_hypercall_buffer_alloc + (ctx->xch, memfree, sizeof(*memfree) * max_nodes); + node_distances = xc_hypercall_buffer_alloc + (ctx->xch, node_distances, sizeof(*node_distances) * max_nodes * max_nodes); + if ((memsize == NULL) || (memfree == NULL) || (node_distances == NULL)) { + LIBXL__LOG_ERRNOVAL(ctx, XTL_ERROR, ENOMEM, + "Unable to allocate hypercall arguments"); + goto fail; + } + + set_xen_guest_handle(ninfo.node_to_memsize, memsize); + set_xen_guest_handle(ninfo.node_to_memfree, memfree); + set_xen_guest_handle(ninfo.node_to_node_distance, node_distances); + ninfo.max_node_index = max_nodes - 1; + if (xc_numainfo(ctx->xch, &ninfo) != 0) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting numainfo"); + goto fail; + } + + ret = malloc(sizeof(libxl_numainfo) * max_nodes); + if (ret == NULL) { + LIBXL__LOG_ERRNOVAL(ctx, XTL_ERROR, ENOMEM, + "Unable to allocate return value"); + goto fail; + } + /* XXX Neglect node distances for now, as we need some sort of array + * type support in the IDL. RFC patches for that have been posted, + * will rebase on top of those for next round if it is the case. + * + * for (i = 0; i < max_nodes; i++) { + * ret[i].distances = malloc(sizeof(*node_distances) * max_nodes); + * if (ret == NULL) { + * for (int j = i; j >=0; j--) + * free(ret[i].distances); + * free(ret); + * goto fail; + * } + * } + */ + + for (i = 0; i < max_nodes; i++) { + ret[i].size = memsize[i]; + ret[i].free = memfree[i]; + /* for (int j = 0; j < max_nodes; j++) + * ret[i].distances[j] = + * node_distances[i*(max_nodes+1) + j]; + */ + } + +fail: + xc_hypercall_buffer_free(ctx->xch, memsize); + xc_hypercall_buffer_free(ctx->xch, memfree); + xc_hypercall_buffer_free(ctx->xch, node_distances); + + if (ret) + *nr = max_nodes; + return ret; +} + libxl_cputopology *libxl_get_cpu_topology(libxl_ctx *ctx, int *nr) { xc_topologyinfo_t tinfo; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -716,6 +716,8 @@ int libxl_userdata_retrieve(libxl_ctx *c */ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo); +libxl_numainfo *libxl_get_numainfo(libxl_ctx *ctx, int *nr); +void libxl_numainfo_list_free(libxl_numainfo *, int nr); #define LIBXL_CPUTOPOLOGY_INVALID_ENTRY (~(uint32_t)0) libxl_cputopology *libxl_get_cpu_topology(libxl_ctx *ctx, int *nr); void libxl_cputopology_list_free(libxl_cputopology *, int nr); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -411,6 +411,12 @@ libxl_physinfo = Struct("physinfo", [ ("cap_hvm_directio", bool), ], dir=DIR_OUT) +libxl_numainfo = Struct("numainfo", [ + ("size", uint64), + ("free", uint64), + ("distances", uint32), + ], dir=DIR_OUT) + libxl_cputopology = Struct("cputopology", [ ("core", uint32), ("socket", uint32), diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -521,6 +521,14 @@ int libxl__enum_from_string(const libxl_ return ERROR_FAIL; } +void libxl_numainfo_list_free(libxl_numainfo *list, int nr) +{ + int i; + for (i = 0; i < nr; i++) + libxl_numainfo_dispose(&list[i]); + free(list); +} + void libxl_cputopology_list_free(libxl_cputopology *list, int nr) { int i; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |