From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chao Peng Subject: [PATCH v8 11/13] tools/libxl: introduce some socket helpers Date: Thu, 21 May 2015 16:41:42 +0800 Message-ID: <1432197704-20816-12-git-send-email-chao.p.peng@linux.intel.com> References: <1432197704-20816-1-git-send-email-chao.p.peng@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1432197704-20816-1-git-send-email-chao.p.peng@linux.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: keir@xen.org, Ian.Campbell@citrix.com, stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, Ian.Jackson@eu.citrix.com, will.auld@intel.com, JBeulich@suse.com, wei.liu2@citrix.com, dgdegra@tycho.nsa.gov List-Id: xen-devel@lists.xenproject.org Add libxl_socket_bitmap_alloc() to allow allocating a socket specific libxl_bitmap (as it is for cpu/node bitmap). Internal function libxl__count_physical_sockets() is introduced together to get the socket count when the size of bitmap is not specified. Signed-off-by: Chao Peng Acked-by: Ian Campbell --- Changes in v7: * Broadcast LIBXL_HAVE_SOCKET_BITMAP_ALLOC --- tools/libxl/libxl.h | 7 +++++++ tools/libxl/libxl_internal.h | 2 ++ tools/libxl/libxl_utils.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_utils.h | 2 ++ 4 files changed, 57 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 2ed7194..6ce93f5 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -768,6 +768,13 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src); */ #define LIBXL_HAVE_PCITOPOLOGY 1 +/* + * LIBXL_HAVE_SOCKET_BITMAP_ALLOC + * + * If this is defined, then libxl_socket_bitmap_alloc exists. + */ +#define LIBXL_HAVE_SOCKET_BITMAP_ALLOC 1 + typedef char **libxl_string_list; void libxl_string_list_dispose(libxl_string_list *sl); int libxl_string_list_length(const libxl_string_list *sl); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 8aaa1ad..89ca694 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3697,6 +3697,8 @@ static inline void libxl__update_config_vtpm(libxl__gc *gc, */ void libxl__bitmap_copy_best_effort(libxl__gc *gc, libxl_bitmap *dptr, const libxl_bitmap *sptr); + +int libxl__count_physical_sockets(libxl__gc *gc, int *sockets); #endif /* diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index f6be2d7..bfc9699 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -840,6 +840,52 @@ int libxl_node_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *nodemap, return rc; } +int libxl__count_physical_sockets(libxl__gc *gc, int *sockets) +{ + int rc; + libxl_physinfo info; + + libxl_physinfo_init(&info); + + rc = libxl_get_physinfo(CTX, &info); + if (rc) + return rc; + + *sockets = info.nr_cpus / info.threads_per_core + / info.cores_per_socket; + + libxl_physinfo_dispose(&info); + return 0; +} + +int libxl_socket_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *socketmap, + int max_sockets) +{ + GC_INIT(ctx); + int rc = 0; + + if (max_sockets < 0) { + rc = ERROR_INVAL; + LOG(ERROR, "invalid number of sockets provided"); + goto out; + } + + if (max_sockets == 0) { + rc = libxl__count_physical_sockets(gc, &max_sockets); + if (rc) { + LOGE(ERROR, "failed to get system socket count"); + goto out; + } + } + /* This can't fail: no need to check and log */ + libxl_bitmap_alloc(ctx, socketmap, max_sockets); + + out: + GC_FREE; + return rc; + +} + int libxl_nodemap_to_cpumap(libxl_ctx *ctx, const libxl_bitmap *nodemap, libxl_bitmap *cpumap) diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 1c1761d..82340ec 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -141,6 +141,8 @@ static inline int libxl_bitmap_equal(const libxl_bitmap *ba, int libxl_cpu_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *cpumap, int max_cpus); int libxl_node_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *nodemap, int max_nodes); +int libxl_socket_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *socketmap, + int max_sockets); /* Populate cpumap with the cpus spanned by the nodes in nodemap */ int libxl_nodemap_to_cpumap(libxl_ctx *ctx, -- 1.9.1