Hello,

Here's a new patchset that fixes the remaining problems on my side.
01 is basically the same I sent earlier.
02 and 03 export two core functions to plugins
04 is basically the same I sent earlier, without the hacky #include
<private/private.h> that was waiting for 02-03
05 lets me check that topology-xen.c builds when libxen isn't available
(useful for regression testing all backends when changing internals,
used with "make check -C tests/ports")

The Xen component seems to work fine as a plugin. The Xen lib dependency
is only in the plugin:
$ ldd utils/.libs/lstopo | grep xen
$ ldd src/.libs/libhwloc.so | grep xen
$ ldd src/.libs/hwloc_xen.so | grep xen
    libxenctrl-4.3.so => /usr/lib/libxenctrl-4.3.so (0x00007f3de693c000)

You can try with
    make && make install && HWLOC_XEN=1 utils/lstopo
Add HWLOC_PLUGINS_VERBOSE for details about plugins being loaded. And
HWLOC_COMPONENTS_VERBOSE for details components being enabled or not.


A couple comments below.


Le 01/01/2014 22:47, Andrew Cooper a écrit :
> At the moment, my list of activities is:
> * See about getting plugins working (./configure is still wanting to
> build Xen support in, rather than making it a plugin)
> * Get NUMA memory and distances recorded (as the information is already
> available)
> * Get offline cpus working.
>
> I am in two minds about that patch to libxc.
>
> On the one hand, libxenctrl is a fairly lightweight library (no
> dependencies), whose purpose is to be a thin wrapper to basic Xen
> controls.  However, it explicitly has an unstable API which is free to
> change in the future, and I can make no guarentee that the API of those
> functions wont change (especially as I have a plan to remove the
> ambiguity between online/offline cpus and their topology location).

Is there a #define that we check to easily detect which API is available
without having multiple API checks in configure?

> The other option which I discounted initially was to use libxenlight. 
> libxl explicitly has a stable API (but unstable ABI).  It comes with a
> host of dependencies (libxlutil, libxenstore, libxenguest, libyajl,
> libuuid, libbz2, liblzma, libz off the top of my head, and probably more).

According to you, in reality, how often will libxl be installed on
existing platforms, compared to libxc?

> Furthermore, libxc exported the information in the format I wanted to
> consume it in, rather than libxl which translates it to a less useful
> format as part of retrieving the information.
>
> As the Xen part of hwloc is going to be a plugin, using libxl might not
> be so bad, and having a stable API would certainly be good (even if it
> means doing a reverse transform on the information received from libxl).

We won't release hwloc v1.9 before a couple months. You can take some
time to decide. I don't have a strong feeling about this choice.

Brice

commit 518e8916b38da6dcb2a51f147a30a88021e2c11f
Author: Brice Goglin <brice.gog...@inria.fr>
List-Post: hwloc-devel@lists.open-mpi.org
Date:   Mon Jan 6 13:22:47 2014 +0100

    tests/ports: add cross-testing

diff --git a/config/hwloc_internal.m4 b/config/hwloc_internal.m4
index 13bb21d..0fd5d05 100644
--- a/config/hwloc_internal.m4
+++ b/config/hwloc_internal.m4
@@ -1,6 +1,6 @@
 dnl -*- Autoconf -*-
 dnl
-dnl Copyright (c) 2009-2012 Inria.  All rights reserved.
+dnl Copyright (c) 2009-2014 Inria.  All rights reserved.
 dnl Copyright (c) 2009, 2011 Université Bordeaux 1
 dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
 dnl                         University Research and Technology
@@ -420,6 +420,7 @@ int foo(void) {
 	hwloc_config_prefix[tests/ports/topology-netbsd.c]:hwloc_config_prefix[src/topology-netbsd.c]
 	hwloc_config_prefix[tests/ports/topology-hpux.c]:hwloc_config_prefix[src/topology-hpux.c]
 	hwloc_config_prefix[tests/ports/topology-bgq.c]:hwloc_config_prefix[src/topology-bgq.c]
+	hwloc_config_prefix[tests/ports/topology-xen.c]:hwloc_config_prefix[src/topology-xen.c]
 	hwloc_config_prefix[tests/ports/topology-opencl.c]:hwloc_config_prefix[src/topology-opencl.c]
 	hwloc_config_prefix[tests/ports/topology-cuda.c]:hwloc_config_prefix[src/topology-cuda.c]
 	hwloc_config_prefix[tests/ports/topology-nvml.c]:hwloc_config_prefix[src/topology-nvml.c]
diff --git a/tests/ports/Makefile.am b/tests/ports/Makefile.am
index 7bbdbfe..b6cc5c3 100644
--- a/tests/ports/Makefile.am
+++ b/tests/ports/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright © 2009-2012 Inria.  All rights reserved.
+# Copyright © 2009-2014 Inria.  All rights reserved.
 # Copyright © 2009, 2011-2012 Université Bordeaux 1
 # Copyright © 2009-2010 Cisco Systems, Inc.  All rights reserved.
 # See COPYING in top-level directory.
@@ -20,6 +20,7 @@ check_LTLIBRARIES = \
 	libhwloc-port-osf.la \
 	libhwloc-port-solaris.la \
 	libhwloc-port-windows.la \
+	libhwloc-port-xen.la \
 	libhwloc-port-opencl.la \
 	libhwloc-port-cuda.la \
 	libhwloc-port-nvml.la \
@@ -138,6 +139,13 @@ libhwloc_port_windows_la_CPPFLAGS = $(common_CPPFLAGS) \
 	-DHWLOC_WIN_SYS \
 	-DHAVE__SC_LARGE_PAGESIZE -D_SC_LARGE_PAGESIZE=33

+nodist_libhwloc_port_xen_la_SOURCES = topology-xen.c
+libhwloc_port_xen_la_SOURCES = \
+	include/xen/xenctrl.h
+libhwloc_port_xen_la_CPPFLAGS = $(common_CPPFLAGS) \
+	-I$(HWLOC_top_srcdir)/tests/ports/include/xen \
+	-DHWLOC_XEN_SYS
+
 nodist_libhwloc_port_opencl_la_SOURCES = topology-opencl.c
 libhwloc_port_opencl_la_SOURCES = \
 	include/opencl/CL/cl_ext.h
diff --git a/tests/ports/include/xen/xenctrl.h b/tests/ports/include/xen/xenctrl.h
new file mode 100644
index 0000000..422801e
--- /dev/null
+++ b/tests/ports/include/xen/xenctrl.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2014 Inria.  All rights reserved.
+ * See COPYING in top-level directory.
+ */
+
+#ifndef HWLOC_PORT_XEN_XENCTRL_H
+#define HWLOC_PORT_XEN_XENCTRL_H
+
+typedef struct xc_interface_core xc_interface;
+
+xc_interface *xc_interface_open(void *, void *, unsigned);
+int xc_interface_close(xc_interface *);
+
+struct xen_sysctl_physinfo {
+    uint32_t threads_per_core;
+    uint32_t cores_per_socket;
+    uint32_t nr_cpus;
+    uint32_t max_cpu_id;
+    uint32_t nr_nodes;
+    uint32_t max_node_id;
+};
+typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t;
+typedef xen_sysctl_physinfo_t xc_physinfo_t;
+
+int xc_physinfo(xc_interface *, xc_physinfo_t *);
+
+int xc_topologyinfo_bounced(xc_interface *, uint32_t *, uint32_t *, uint32_t *, uint32_t *);
+
+int xc_numainfo_bounced(xc_interface *, uint32_t *, uint64_t *, uint64_t *, uint32_t *);
+
+#endif /* HWLOC_PORT_XEN_XENCTRL_H */
commit e114b725e35e08def8ec4a48024548067d388fdd
Author: Brice Goglin <brice.gog...@inria.fr>
List-Post: hwloc-devel@lists.open-mpi.org
Date:   Tue Dec 31 16:52:18 2013 +0100

    Make xen plugin-able

diff --git a/config/hwloc.m4 b/config/hwloc.m4
index 600d596..75b0702 100644
--- a/config/hwloc.m4
+++ b/config/hwloc.m4
@@ -1,6 +1,6 @@
 dnl -*- Autoconf -*-
 dnl
-dnl Copyright © 2009-2013 Inria.  All rights reserved.
+dnl Copyright © 2009-2014 Inria.  All rights reserved.
 dnl Copyright (c) 2009-2012 Université Bordeaux 1
 dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
 dnl                         University Research and Technology
@@ -932,6 +932,7 @@ EOF])
       AC_DEFINE([HWLOC_HAVE_XEN], [1], [Define to 1 if you have the `XEN' library.])
       AC_SUBST([HWLOC_HAVE_XEN], [1])
       hwloc_components="$hwloc_components xen"
+      hwloc_xen_component_maybeplugin=1
       hwloc_xen=yes
     else
       AC_SUBST([HWLOC_HAVE_XEN], [0])
@@ -1151,6 +1152,10 @@ EOF])
           [HWLOC_LIBS="$HWLOC_LIBS $HWLOC_GL_LIBS"
            HWLOC_CFLAGS="$HWLOC_CFLAGS $HWLOC_GL_CFLAGS"
            HWLOC_REQUIRES="$HWLOC_GL_REQUIRES $HWLOC_REQUIRES"])
+    AS_IF([test "$hwloc_xen_component" = "static"],
+          [HWLOC_LIBS="$HWLOC_LIBS $HWLOC_XEN_LIBS"
+           HWLOC_CFLAGS="$HWLOC_CFLAGS $HWLOC_XEN_CFLAGS"
+           HWLOC_REQUIRES="$HWLOC_XEN_REQUIRES $HWLOC_REQUIRES"])
     AS_IF([test "$hwloc_xml_libxml_component" = "static"],
           [HWLOC_LIBS="$HWLOC_LIBS $HWLOC_LIBXML2_LIBS"
            HWLOC_CFLAGS="$HWLOC_CFLAGS $HWLOC_LIBXML2_CFLAGS"
@@ -1274,6 +1279,7 @@ AC_DEFUN([HWLOC_DO_AM_CONDITIONALS],[
         AM_CONDITIONAL([HWLOC_CUDA_BUILD_STATIC], [test "x$hwloc_cuda_component" = "xstatic"])
         AM_CONDITIONAL([HWLOC_NVML_BUILD_STATIC], [test "x$hwloc_nvml_component" = "xstatic"])
         AM_CONDITIONAL([HWLOC_GL_BUILD_STATIC], [test "x$hwloc_gl_component" = "xstatic"])
+        AM_CONDITIONAL([HWLOC_XEN_BUILD_STATIC], [test "x$hwloc_xen_component" = "xstatic"])
         AM_CONDITIONAL([HWLOC_XML_LIBXML_BUILD_STATIC], [test "x$hwloc_xml_libxml_component" = "xstatic"])

         AM_CONDITIONAL([HWLOC_HAVE_CXX], [test "x$hwloc_have_cxx" = "xyes"])
diff --git a/src/Makefile.am b/src/Makefile.am
index 11dd6a2..69b80a0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-# Copyright © 2009-2013 Inria.  All rights reserved.
+# Copyright © 2009-2014 Inria.  All rights reserved.
 # Copyright © 2009-2012 Université Bordeaux 1
 # Copyright © 2009-2010 Cisco Systems, Inc.  All rights reserved.
 # Copyright © 2011-2012 Oracle and/or its affiliates.  All rights reserved.
@@ -162,8 +162,14 @@ sources += topology-x86.c
 endif HWLOC_HAVE_CPUID

 if HWLOC_HAVE_XEN
+if HWLOC_XEN_BUILD_STATIC
 sources += topology-xen.c
-ldflags += $(HWLOC_XEN_LIBS)
+else
+plugins_LTLIBRARIES += hwloc_xen.la
+hwloc_xen_la_SOURCES = topology-xen.c
+hwloc_xen_la_CFLAGS = $(AM_CFLAGS) $(HWLOC_XEN_CFLAGS) -DHWLOC_INSIDE_PLUGIN
+hwloc_xen_la_LDFLAGS = $(plugins_ldflags) $(HWLOC_XEN_LIBS)
+endif
 endif HWLOC_HAVE_XEN

 if HWLOC_HAVE_GCC
diff --git a/src/topology-xen.c b/src/topology-xen.c
index c0b416a..3c7d688 100644
--- a/src/topology-xen.c
+++ b/src/topology-xen.c
@@ -4,8 +4,12 @@
  */

 #include <private/autogen/config.h>
-#include <private/private.h>
 #include <hwloc.h>
+#include <hwloc/plugins.h>
+
+/* private headers allowed for convenience because this plugin is built within hwloc */
+#include <private/debug.h>
+#include <private/misc.h>

 #include <inttypes.h>
 #include <assert.h>
@@ -156,7 +160,7 @@ hwloc_xen_discover(struct hwloc_backend *backend)
   hwloc_bitmap_t each_socket, each_node, each_core;
   uint32_t i, z;

-  if (topology->levels[0][0]->cpuset)
+  if (hwloc_get_root_obj(topology)->cpuset)
     return 0;

   hwloc_debug("Discovering Xen topology\n");
@@ -258,7 +262,7 @@ hwloc_xen_discover(struct hwloc_backend *backend)
   hwloc_bitmap_free(each_node);


-  hwloc_obj_add_info(topology->levels[0][0], "Backend", "Xen");
+  hwloc_obj_add_info(hwloc_get_root_obj(topology), "Backend", "Xen");

   free_xen_info(data);

@@ -336,6 +340,10 @@ static struct hwloc_disc_component hwloc_xen_disc_component = {
   NULL
 };

+#ifdef HWLOC_INSIDE_PLUGIN
+HWLOC_DECLSPEC extern const struct hwloc_component hwloc_xen_component;
+#endif
+
 const struct hwloc_component hwloc_xen_component = {
   HWLOC_COMPONENT_ABI,
   HWLOC_COMPONENT_TYPE_DISC,
commit d454aeb932a6973ca818ee351e845d540d9d481e
Author: Brice Goglin <brice.gog...@inria.fr>
List-Post: hwloc-devel@lists.open-mpi.org
Date:   Mon Jan 6 13:09:19 2014 +0100

    plugins: cleanup hwloc_setup_pu_level() and export it to plugins

    Xen needs it.

diff --git a/NEWS b/NEWS
index 5e0d78a..8b136f5 100644
--- a/NEWS
+++ b/NEWS
@@ -29,7 +29,8 @@ Version 1.9.0
     or Sockets instead of Caches when possible.
   + Add -e as a synonym to --get-last-cpu-location in hwloc-bind.
 * Plugins
-  + Add the new hwloc_alloc_root_sets() function for plugins that discover CPUs.
+  + Add hwloc_alloc_root_sets() and hwloc_setup_pu_level() functions for
+    plugins that discover CPUs.


 Version 1.8.0
diff --git a/include/hwloc/plugins.h b/include/hwloc/plugins.h
index 964da66..52db2e3 100644
--- a/include/hwloc/plugins.h
+++ b/include/hwloc/plugins.h
@@ -311,6 +311,12 @@ HWLOC_DECLSPEC int hwloc_fill_object_sets(hwloc_obj_t obj);
  */
 HWLOC_DECLSPEC int hwloc_alloc_root_sets(struct hwloc_topology *topology);

+/** \brief Create a level of \p nb PU objects starting from index 0.
+ *
+ * Used for creating PU objects when there are no holes in the index list.
+ */
+HWLOC_DECLSPEC int hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb);
+
 /** \brief Insert a list of PCI devices and bridges in the backend topology.
  *
  * Insert a list of objects (either PCI device or bridges) starting at first_obj
diff --git a/include/hwloc/rename.h b/include/hwloc/rename.h
index 424a3e9..4f682e5 100644
--- a/include/hwloc/rename.h
+++ b/include/hwloc/rename.h
@@ -486,6 +486,7 @@ extern "C" {
 #define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object)
 #define hwloc_fill_object_sets HWLOC_NAME(fill_object_sets)
 #define hwloc_alloc_root_sets HWLOC_NAME(alloc_root_sets)
+#define hwloc_setup_pu_level HWLOC_NAME(setup_pu_level)

 #define hwloc_insert_pci_device_list HWLOC_NAME(insert_pci_device_list)
 #define hwloc_pci_find_cap HWLOC_NAME(pci_find_cap)
diff --git a/include/private/private.h b/include/private/private.h
index 3c28683..5fb268c 100644
--- a/include/private/private.h
+++ b/include/private/private.h
@@ -128,7 +128,6 @@ struct hwloc_topology {
   struct hwloc_backend * backends;
 };

-extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
 extern int hwloc_get_sysctlbyname(const char *name, int64_t *n);
 extern int hwloc_get_sysctl(int name[], unsigned namelen, int *n);
 extern unsigned hwloc_fallback_nbprocessors(struct hwloc_topology *topology);
diff --git a/src/topology.c b/src/topology.c
index 8a45b9b..cee7526 100644
--- a/src/topology.c
+++ b/src/topology.c
@@ -174,29 +174,28 @@ hwloc_fallback_nbprocessors(struct hwloc_topology *topology) {
 }

 /*
- * Use the given number of processors and the optional online cpuset if given
- * to set a PU level.
+ * Use the given number of processors to set a PU level.
  */
-void
+int
 hwloc_setup_pu_level(struct hwloc_topology *topology,
 		     unsigned nb_pus)
 {
   struct hwloc_obj *obj;
-  unsigned oscpu,cpu;
+  unsigned oscpu;

   hwloc_debug("%s", "\n\n * CPU cpusets *\n\n");
-  for (cpu=0,oscpu=0; cpu<nb_pus; oscpu++)
+  for (oscpu=0; oscpu<nb_pus; oscpu++)
     {
       obj = hwloc_alloc_setup_object(HWLOC_OBJ_PU, oscpu);
       obj->cpuset = hwloc_bitmap_alloc();
       hwloc_bitmap_only(obj->cpuset, oscpu);

-      hwloc_debug_2args_bitmap("cpu %u (os %u) has cpuset %s\n",
-		 cpu, oscpu, obj->cpuset);
+      hwloc_debug_1arg_bitmap("OS cpu %u has cpuset %s\n",
+			      oscpu, obj->cpuset);
       hwloc_insert_object_by_cpuset(topology, obj);
-
-      cpu++;
     }
+
+  return 0;
 }

 static void
commit 5957bcd31d18f44a80c2c100eaff472293261f42
Author: Brice Goglin <brice.gog...@inria.fr>
List-Post: hwloc-devel@lists.open-mpi.org
Date:   Mon Jan 6 12:52:14 2014 +0100

    plugins: export hwloc_alloc_root_sets()

    Renamed from the old hwloc_alloc_obj_cpusets(),
    now officially specialized for root objects only,
    and now exported to plugins (Xen will need it).

diff --git a/NEWS b/NEWS
index eec10ea..5e0d78a 100644
--- a/NEWS
+++ b/NEWS
@@ -28,6 +28,8 @@ Version 1.9.0
   + hwloc-ps reports locations as likely-more-useful objects such as Cores
     or Sockets instead of Caches when possible.
   + Add -e as a synonym to --get-last-cpu-location in hwloc-bind.
+* Plugins
+  + Add the new hwloc_alloc_root_sets() function for plugins that discover CPUs.


 Version 1.8.0
diff --git a/include/hwloc/plugins.h b/include/hwloc/plugins.h
index aa5d993..964da66 100644
--- a/include/hwloc/plugins.h
+++ b/include/hwloc/plugins.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2013 Inria.  All rights reserved.
+ * Copyright © 2013-2014 Inria.  All rights reserved.
  * See COPYING in top-level directory.
  */

@@ -305,6 +305,12 @@ hwloc_alloc_setup_object(hwloc_obj_type_t type, signed os_index)
  */
 HWLOC_DECLSPEC int hwloc_fill_object_sets(hwloc_obj_t obj);

+/** \brief Allocate object CPU and node sets of the root object.
+ *
+ * Used for initializing the root object sets prior to discovering CPUs and NUMA nodes.
+ */
+HWLOC_DECLSPEC int hwloc_alloc_root_sets(struct hwloc_topology *topology);
+
 /** \brief Insert a list of PCI devices and bridges in the backend topology.
  *
  * Insert a list of objects (either PCI device or bridges) starting at first_obj
diff --git a/include/hwloc/rename.h b/include/hwloc/rename.h
index 6266264..424a3e9 100644
--- a/include/hwloc/rename.h
+++ b/include/hwloc/rename.h
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
- * Copyright © 2010-2013 Inria.  All rights reserved.
+ * Copyright © 2010-2014 Inria.  All rights reserved.
  * See COPYING in top-level directory.
  */

@@ -485,6 +485,7 @@ extern "C" {
 #define hwloc_insert_object_by_parent HWLOC_NAME(insert_object_by_parent)
 #define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object)
 #define hwloc_fill_object_sets HWLOC_NAME(fill_object_sets)
+#define hwloc_alloc_root_sets HWLOC_NAME(alloc_root_sets)

 #define hwloc_insert_pci_device_list HWLOC_NAME(insert_pci_device_list)
 #define hwloc_pci_find_cap HWLOC_NAME(pci_find_cap)
diff --git a/include/private/private.h b/include/private/private.h
index a9009de..3c28683 100644
--- a/include/private/private.h
+++ b/include/private/private.h
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009      CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2012 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  *
@@ -128,7 +128,6 @@ struct hwloc_topology {
   struct hwloc_backend * backends;
 };

-extern void hwloc_alloc_obj_cpusets(hwloc_obj_t obj);
 extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
 extern int hwloc_get_sysctlbyname(const char *name, int64_t *n);
 extern int hwloc_get_sysctl(int name[], unsigned namelen, int *n);
diff --git a/src/topology-aix.c b/src/topology-aix.c
index e19faeb..977998f 100644
--- a/src/topology-aix.c
+++ b/src/topology-aix.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2011, 2013 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -709,7 +709,7 @@ hwloc_look_aix(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   /* TODO: R_LGPGDEF/R_LGPGFREE for large pages */

diff --git a/src/topology-bgq.c b/src/topology-bgq.c
index 5a2e611..df7186e 100644
--- a/src/topology-bgq.c
+++ b/src/topology-bgq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2013 Inria.  All rights reserved.
+ * Copyright © 2013-2014 Inria.  All rights reserved.
  * See COPYING in top-level directory.
  */

@@ -29,7 +29,7 @@ hwloc_look_bgq(struct hwloc_backend *backend)

 #define HWLOC_BGQ_CORES 17 /* spare core ignored for now */

-    hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+    hwloc_alloc_root_sets(topology);
     /* mark the 17th core (OS-reserved) as disallowed */
     hwloc_bitmap_clr_range(topology->levels[0][0]->allowed_cpuset, (HWLOC_BGQ_CORES-1)*4, HWLOC_BGQ_CORES*4-1);

diff --git a/src/topology-darwin.c b/src/topology-darwin.c
index 39e13a3..70e23ee 100644
--- a/src/topology-darwin.c
+++ b/src/topology-darwin.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2013 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -43,7 +43,7 @@ hwloc_look_darwin(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   if (hwloc_get_sysctlbyname("hw.ncpu", &_nprocs) || _nprocs <= 0)
     return -1;
diff --git a/src/topology-freebsd.c b/src/topology-freebsd.c
index 7e13ca1..59d5b8b 100644
--- a/src/topology-freebsd.c
+++ b/src/topology-freebsd.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2013 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2010, 2012 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -182,7 +182,7 @@ hwloc_look_freebsd(struct hwloc_backend *backend)

   if (!topology->levels[0][0]->cpuset) {
     /* Nobody (even the x86 backend) created objects yet, setup basic objects */
-    hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+    hwloc_alloc_root_sets(topology);
     hwloc_setup_pu_level(topology, nbprocs);
   }

diff --git a/src/topology-hpux.c b/src/topology-hpux.c
index bd84379..91885f3 100644
--- a/src/topology-hpux.c
+++ b/src/topology-hpux.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2010, 2013 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -175,7 +175,7 @@ hwloc_look_hpux(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   if (has_numa) {
     nbnodes = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
diff --git a/src/topology-linux.c b/src/topology-linux.c
index 2841f23..2796ae7 100644
--- a/src/topology-linux.c
+++ b/src/topology-linux.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2013 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2013 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  * Copyright © 2010 IBM
@@ -3445,7 +3445,7 @@ hwloc_look_linuxfs(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   /* Gather the list of admin-disabled cpus and mems */
   hwloc_find_linux_cpuset_mntpnt(&cgroup_mntpnt, &cpuset_mntpnt, data->root_fd);
diff --git a/src/topology-netbsd.c b/src/topology-netbsd.c
index c88ba87..9988b9e 100644
--- a/src/topology-netbsd.c
+++ b/src/topology-netbsd.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2012 Aleksej Saushev, The NetBSD Foundation
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2010 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -138,7 +138,7 @@ hwloc_look_netbsd(struct hwloc_backend *backend)

   if (!topology->levels[0][0]->cpuset) {
     /* Nobody (even the x86 backend) created objects yet, setup basic objects */
-    hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+    hwloc_alloc_root_sets(topology);
     hwloc_setup_pu_level(topology, nbprocs);
   }

diff --git a/src/topology-noos.c b/src/topology-noos.c
index 8c74ded..c26e981 100644
--- a/src/topology-noos.c
+++ b/src/topology-noos.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2012 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -19,7 +19,7 @@ hwloc_look_noos(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);
   hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
   if (topology->is_thissystem)
     hwloc_add_uname_info(topology);
diff --git a/src/topology-osf.c b/src/topology-osf.c
index 52300fc..0b3c45e 100644
--- a/src/topology-osf.c
+++ b/src/topology-osf.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2011 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -254,7 +254,7 @@ hwloc_look_osf(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   nbnodes = rad_get_num();

diff --git a/src/topology-solaris.c b/src/topology-solaris.c
index fec511d..59decca 100644
--- a/src/topology-solaris.c
+++ b/src/topology-solaris.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2011 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * Copyright © 2011      Oracle and/or its affiliates.  All rights reserved.
@@ -726,7 +726,7 @@ hwloc_look_solaris(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

 #ifdef HAVE_LIBLGRP
   hwloc_look_lgrp(topology);
diff --git a/src/topology-synthetic.c b/src/topology-synthetic.c
index 11c8c33..6120696 100644
--- a/src/topology-synthetic.c
+++ b/src/topology-synthetic.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2010 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -352,7 +352,7 @@ hwloc_look_synthetic(struct hwloc_backend *backend)

   assert(!topology->levels[0][0]->cpuset);

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   topology->support.discovery->pu = 1;

diff --git a/src/topology-windows.c b/src/topology-windows.c
index 8d811c7..f33d4ec 100644
--- a/src/topology-windows.c
+++ b/src/topology-windows.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2012 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2012 Université Bordeaux 1
  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -490,7 +490,7 @@ hwloc_look_windows(struct hwloc_backend *backend)
     /* somebody discovered things */
     return 0;

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);

   GetSystemInfo(&SystemInfo);

diff --git a/src/topology-x86.c b/src/topology-x86.c
index 9fa0f88..4c72dcc 100644
--- a/src/topology-x86.c
+++ b/src/topology-x86.c
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2010-2013 Inria.  All rights reserved.
+ * Copyright © 2010-2014 Inria.  All rights reserved.
  * Copyright © 2010-2013 Université Bordeaux 1
  * Copyright © 2010-2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -885,7 +885,7 @@ hwloc_x86_discover(struct hwloc_backend *backend)
     return 0;
   } else {
     /* topology is empty, initialize it */
-    hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+    hwloc_alloc_root_sets(topology);
   }

 fulldiscovery:
diff --git a/src/topology-xen.c b/src/topology-xen.c
index 28526fe..c0b416a 100644
--- a/src/topology-xen.c
+++ b/src/topology-xen.c
@@ -180,7 +180,7 @@ hwloc_xen_discover(struct hwloc_backend *backend)
       hwloc_debug("  node[%3"PRIu32"], size %"PRIu64", free %"PRIu64"\n",
                   z, data->node_to_memsize[z], data->node_to_memfree[z]);

-  hwloc_alloc_obj_cpusets(topology->levels[0][0]);
+  hwloc_alloc_root_sets(topology);
   hwloc_setup_pu_level(topology, data->max_cpu_id+1);

   /* Socket information */
diff --git a/src/topology.c b/src/topology.c
index 8afe5a4..8a45b9b 100644
--- a/src/topology.c
+++ b/src/topology.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2009 CNRS
- * Copyright © 2009-2013 Inria.  All rights reserved.
+ * Copyright © 2009-2014 Inria.  All rights reserved.
  * Copyright © 2009-2012 Université Bordeaux 1
  * Copyright © 2009-2011 Cisco Systems, Inc.  All rights reserved.
  * See COPYING in top-level directory.
@@ -2282,8 +2282,9 @@ hwloc_connect_levels(hwloc_topology_t topology)
   return 0;
 }

-void hwloc_alloc_obj_cpusets(hwloc_obj_t obj)
+int hwloc_alloc_root_sets(hwloc_topology_t topology)
 {
+  hwloc_obj_t obj = hwloc_get_root_obj(topology);
   obj->cpuset = hwloc_bitmap_alloc_full();
   obj->complete_cpuset = hwloc_bitmap_alloc();
   obj->online_cpuset = hwloc_bitmap_alloc_full();
@@ -2291,6 +2292,7 @@ void hwloc_alloc_obj_cpusets(hwloc_obj_t obj)
   obj->nodeset = hwloc_bitmap_alloc();
   obj->complete_nodeset = hwloc_bitmap_alloc();
   obj->allowed_nodeset = hwloc_bitmap_alloc_full();
+  return 0;
 }

 /* Main discovery loop */
commit 26e8b2896cec152643701ea8d8636ed5d561788b
Author: Brice Goglin <brice.gog...@inria.fr>
List-Post: hwloc-devel@lists.open-mpi.org
Date:   Tue Dec 31 19:35:59 2013 +0100

    properly abort xen component instantiate if not running as root in dom0

diff --git a/src/topology-xen.c b/src/topology-xen.c
index b74f9f5..28526fe 100644
--- a/src/topology-xen.c
+++ b/src/topology-xen.c
@@ -305,7 +305,10 @@ hwloc_xen_component_instantiate(struct hwloc_disc_component *component,

   /* This will fail if we are not running as root in dom0. */
   priv->xch = xc_interface_open(NULL, NULL, 0);
-  assert(priv->xch && "Are you running as root in dom0?");
+  if (!priv->xch) {
+    hwloc_debug("xc_interface_open() failed, are you running as root in dom0? Disabling xen component.");
+    goto err;
+  }

   backend->private_data = priv;
   backend->discover = hwloc_xen_discover;
@@ -314,7 +317,7 @@ hwloc_xen_component_instantiate(struct hwloc_disc_component *component,
   return backend;

  err:
-  if (priv->xch)
+  if (priv && priv->xch)
     xc_interface_close(priv->xch);
   free(priv);
   free(backend);

Reply via email to