Update hwloc to latest shmem branch. Correct typos in update-my-copyright.pl.
Signed-off-by: Ralph Castain <rhc@open-mpi.org>
Этот коммит содержится в:
родитель
033a0eb373
Коммит
98f36711e3
@ -71,9 +71,9 @@ my $my_manual_list = "";
|
|||||||
|
|
||||||
# Protected directories
|
# Protected directories
|
||||||
my @protected = qw(
|
my @protected = qw(
|
||||||
opal\\/mca\\/pmi\\/pmix.+?\\/pmix\\/
|
opal\\/mca\\/pmix\\/pmix.+?\\/pmix\\/
|
||||||
opal\\/mca\\/hwloc\\/hwloc.+?\\/hwloc\\/
|
opal\\/mca\\/hwloc\\/hwloc.+?\\/hwloc\\/
|
||||||
opal\\/mca\\/libevent\\/libevent.+?\\/libevent\\/
|
opal\\/mca\\/event\\/libevent.+?\\/libevent\\/
|
||||||
contrib\\/update-my-copyright.pl
|
contrib\\/update-my-copyright.pl
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -18,72 +18,6 @@ EXTRA_DIST = \
|
|||||||
|
|
||||||
SUBDIRS = include hwloc
|
SUBDIRS = include hwloc
|
||||||
|
|
||||||
if BUILD_NETLOC
|
|
||||||
SUBDIRS += netloc
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
SUBDIRS += utils tests contrib/systemd contrib/misc
|
|
||||||
# We need doc/ if HWLOC_BUILD_DOXYGEN, or during make install if HWLOC_INSTALL_DOXYGEN.
|
|
||||||
# There's no INSTALL_SUBDIRS, so always enter doc/ and check HWLOC_BUILD/INSTALL_DOXYGEN there
|
|
||||||
SUBDIRS += doc
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Do not let automake automatically add the non-standalone dirs to the
|
# Do not let automake automatically add the non-standalone dirs to the
|
||||||
# distribution tarball if we're building in embedded mode.
|
# distribution tarball if we're building in embedded mode.
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
|
||||||
# Only install the pkg file if we're building in standalone mode (and not on Windows)
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = hwloc.pc
|
|
||||||
if BUILD_NETLOC
|
|
||||||
# JMS Need to compare hwloc.pc and netloc.pc -- I think netloc.pc is
|
|
||||||
# missing some things.
|
|
||||||
# pkgconfig_DATA += netloc.pc Disabled until the netloc API is public
|
|
||||||
EXTRA_DIST += netloc.pc
|
|
||||||
if BUILD_NETLOCSCOTCH
|
|
||||||
pkgconfig_DATA += netlocscotch.pc
|
|
||||||
endif BUILD_NETLOCSCOTCH
|
|
||||||
endif BUILD_NETLOC
|
|
||||||
endif HWLOC_BUILD_STANDALONE
|
|
||||||
|
|
||||||
# Only install the valgrind suppressions file if we're building in
|
|
||||||
# standalone mode
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
dist_pkgdata_DATA = contrib/hwloc-valgrind.supp
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Only install entire visual studio subdirectory if we're building in
|
|
||||||
# standalone mode
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
EXTRA_DIST += contrib/windows
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
dist-hook:
|
|
||||||
sh "$(top_srcdir)/config/distscript.sh" "$(top_srcdir)" "$(distdir)" "$(HWLOC_VERSION)"
|
|
||||||
endif HWLOC_BUILD_STANDALONE
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
if HWLOC_HAVE_WINDOWS
|
|
||||||
#
|
|
||||||
# Winball specific rules
|
|
||||||
#
|
|
||||||
install-data-local:
|
|
||||||
sed -e 's/$$/'$$'\015'/ < $(srcdir)/README > $(DESTDIR)$(prefix)/README.txt
|
|
||||||
sed -e 's/$$/'$$'\015'/ < $(srcdir)/NEWS > $(DESTDIR)$(prefix)/NEWS.txt
|
|
||||||
sed -e 's/$$/'$$'\015'/ < $(srcdir)/COPYING > $(DESTDIR)$(prefix)/COPYING.txt
|
|
||||||
uninstall-local:
|
|
||||||
rm -f $(DESTDIR)$(prefix)/README.txt $(DESTDIR)$(prefix)/NEWS.txt $(DESTDIR)$(prefix)/COPYING.txt
|
|
||||||
endif HWLOC_HAVE_WINDOWS
|
|
||||||
endif HWLOC_BUILD_STANDALONE
|
|
||||||
|
|
||||||
#
|
|
||||||
# Build the documenation and top-level README file
|
|
||||||
#
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
.PHONY: doc readme
|
|
||||||
doc readme:
|
|
||||||
$(MAKE) -C doc
|
|
||||||
endif HWLOC_BUILD_STANDALONE
|
|
||||||
|
@ -3,7 +3,6 @@ Copyright © 2009-2017 Inria. All rights reserved.
|
|||||||
Copyright © 2009-2013 Université Bordeaux
|
Copyright © 2009-2013 Université Bordeaux
|
||||||
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||||
|
|
||||||
Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
$COPYRIGHT$
|
$COPYRIGHT$
|
||||||
|
|
||||||
Additional copyrights may follow
|
Additional copyrights may follow
|
||||||
@ -51,6 +50,8 @@ Version 2.0.0
|
|||||||
for instance for exporting XMLs that are compatible with hwloc 1.x.
|
for instance for exporting XMLs that are compatible with hwloc 1.x.
|
||||||
+ The distance API has been completely reworked. It is now described
|
+ The distance API has been completely reworked. It is now described
|
||||||
in hwloc/distances.h.
|
in hwloc/distances.h.
|
||||||
|
+ Add hwloc/shmem.h for sharing topologies between processes running on
|
||||||
|
the same machine (for reducing the memory footprint).
|
||||||
+ Add the experimental netloc subproject. It is enabled by default when
|
+ Add the experimental netloc subproject. It is enabled by default when
|
||||||
supported and can be disabled with --disable-netloc.
|
supported and can be disabled with --disable-netloc.
|
||||||
It currently brings command-line tools to gather and visualize the
|
It currently brings command-line tools to gather and visualize the
|
||||||
|
@ -18,17 +18,17 @@ release=0
|
|||||||
# requirement is that it must be entirely printable ASCII characters
|
# requirement is that it must be entirely printable ASCII characters
|
||||||
# and have no white space.
|
# and have no white space.
|
||||||
|
|
||||||
greek=
|
greek=a1
|
||||||
|
|
||||||
# The date when this release was created
|
# The date when this release was created
|
||||||
|
|
||||||
date="Jul 21, 2017"
|
date="Unreleased developer copy"
|
||||||
|
|
||||||
# If snapshot=1, then use the value from snapshot_version as the
|
# If snapshot=1, then use the value from snapshot_version as the
|
||||||
# entire hwloc version (i.e., ignore major, minor, release, and
|
# entire hwloc version (i.e., ignore major, minor, release, and
|
||||||
# greek). This is only set to 1 when making snapshot tarballs.
|
# greek). This is only set to 1 when making snapshot tarballs.
|
||||||
snapshot=0
|
snapshot=1
|
||||||
snapshot_version=${major}.${minor}.${release}${greek}-git
|
snapshot_version=shmem-20170815.1857.git2478ce8
|
||||||
|
|
||||||
# The shared library version of hwloc's public library. This version
|
# The shared library version of hwloc's public library. This version
|
||||||
# is maintained in accordance with the "Library Interface Versions"
|
# is maintained in accordance with the "Library Interface Versions"
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
# Copyright © 2010-2014 Inria. All rights reserved.
|
# Copyright © 2010-2014 Inria. All rights reserved.
|
||||||
# Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
# Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
||||||
# Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
|
@ -12,7 +12,6 @@ dnl Copyright © 2004-2005 The Regents of the University of California.
|
|||||||
dnl All rights reserved.
|
dnl All rights reserved.
|
||||||
dnl Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
dnl Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||||
dnl Copyright © 2015 Inria. All rights reserved.
|
dnl Copyright © 2015 Inria. All rights reserved.
|
||||||
dnl Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
dnl $COPYRIGHT$
|
dnl $COPYRIGHT$
|
||||||
dnl
|
dnl
|
||||||
dnl Additional copyrights may follow
|
dnl Additional copyrights may follow
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
# Copyright © 2008-2014 Cisco Systems, Inc. All rights reserved.
|
# Copyright © 2008-2014 Cisco Systems, Inc. All rights reserved.
|
||||||
# Copyright © 2014 Inria. All rights reserved.
|
# Copyright © 2014 Inria. All rights reserved.
|
||||||
# Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
|
@ -356,6 +356,10 @@ EOF
|
|||||||
[#include <numa.h>])
|
[#include <numa.h>])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([stdlib.h], [
|
||||||
|
AC_CHECK_FUNCS([mkstemp])
|
||||||
|
])
|
||||||
|
|
||||||
AC_CHECK_HEADERS([infiniband/verbs.h], [
|
AC_CHECK_HEADERS([infiniband/verbs.h], [
|
||||||
AC_CHECK_LIB([ibverbs], [ibv_open_device],
|
AC_CHECK_LIB([ibverbs], [ibv_open_device],
|
||||||
[AC_DEFINE([HAVE_LIBIBVERBS], 1, [Define to 1 if we have -libverbs])
|
[AC_DEFINE([HAVE_LIBIBVERBS], 1, [Define to 1 if we have -libverbs])
|
||||||
|
@ -51,7 +51,6 @@ AH_TOP([/* -*- c -*-
|
|||||||
*
|
*
|
||||||
* Copyright © 2009, 2011, 2012 CNRS, inria., Université Bordeaux All rights reserved.
|
* Copyright © 2009, 2011, 2012 CNRS, inria., Université Bordeaux All rights reserved.
|
||||||
* Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -269,7 +269,7 @@ int hwloc_internal_distances_add_by_index(hwloc_topology_t topology,
|
|||||||
/* cannot group without objects,
|
/* cannot group without objects,
|
||||||
* and we don't group from XML anyway since the hwloc that generated the XML should have grouped already.
|
* and we don't group from XML anyway since the hwloc that generated the XML should have grouped already.
|
||||||
*/
|
*/
|
||||||
if (flags & HWLOC_DISTANCES_FLAG_GROUP) {
|
if (flags & HWLOC_DISTANCES_ADD_FLAG_GROUP) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -291,12 +291,12 @@ int hwloc_internal_distances_add(hwloc_topology_t topology,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (topology->grouping && (flags & HWLOC_DISTANCES_FLAG_GROUP)) {
|
if (topology->grouping && (flags & HWLOC_DISTANCES_ADD_FLAG_GROUP)) {
|
||||||
float full_accuracy = 0.f;
|
float full_accuracy = 0.f;
|
||||||
float *accuracies;
|
float *accuracies;
|
||||||
unsigned nbaccuracies;
|
unsigned nbaccuracies;
|
||||||
|
|
||||||
if (flags & HWLOC_DISTANCES_FLAG_GROUP_INACCURATE) {
|
if (flags & HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE) {
|
||||||
accuracies = topology->grouping_accuracies;
|
accuracies = topology->grouping_accuracies;
|
||||||
nbaccuracies = topology->grouping_nbaccuracies;
|
nbaccuracies = topology->grouping_nbaccuracies;
|
||||||
} else {
|
} else {
|
||||||
@ -335,7 +335,7 @@ int hwloc_internal_distances_add(hwloc_topology_t topology,
|
|||||||
#define HWLOC_DISTANCES_KIND_FROM_ALL (HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_FROM_USER)
|
#define HWLOC_DISTANCES_KIND_FROM_ALL (HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_FROM_USER)
|
||||||
#define HWLOC_DISTANCES_KIND_MEANS_ALL (HWLOC_DISTANCES_KIND_MEANS_LATENCY|HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH)
|
#define HWLOC_DISTANCES_KIND_MEANS_ALL (HWLOC_DISTANCES_KIND_MEANS_LATENCY|HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH)
|
||||||
#define HWLOC_DISTANCES_KIND_ALL (HWLOC_DISTANCES_KIND_FROM_ALL|HWLOC_DISTANCES_KIND_MEANS_ALL)
|
#define HWLOC_DISTANCES_KIND_ALL (HWLOC_DISTANCES_KIND_FROM_ALL|HWLOC_DISTANCES_KIND_MEANS_ALL)
|
||||||
#define HWLOC_DISTANCES_FLAG_ALL (HWLOC_DISTANCES_FLAG_GROUP|HWLOC_DISTANCES_FLAG_GROUP_INACCURATE)
|
#define HWLOC_DISTANCES_ADD_FLAG_ALL (HWLOC_DISTANCES_ADD_FLAG_GROUP|HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE)
|
||||||
|
|
||||||
/* The actual function exported to the user
|
/* The actual function exported to the user
|
||||||
*/
|
*/
|
||||||
@ -356,7 +356,7 @@ int hwloc_distances_add(hwloc_topology_t topology,
|
|||||||
if ((kind & ~HWLOC_DISTANCES_KIND_ALL)
|
if ((kind & ~HWLOC_DISTANCES_KIND_ALL)
|
||||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_FROM_ALL) != 1
|
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_FROM_ALL) != 1
|
||||||
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_MEANS_ALL) != 1
|
|| hwloc_weight_long(kind & HWLOC_DISTANCES_KIND_MEANS_ALL) != 1
|
||||||
|| (flags & ~HWLOC_DISTANCES_FLAG_ALL)) {
|
|| (flags & ~HWLOC_DISTANCES_ADD_FLAG_ALL)) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -327,14 +327,14 @@ hwloc_pci_add_object(struct hwloc_obj *parent, struct hwloc_obj **parent_io_firs
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hwloc_pci_tree_insert_by_busid(struct hwloc_obj **treep,
|
hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep,
|
||||||
struct hwloc_obj *obj)
|
struct hwloc_obj *obj)
|
||||||
{
|
{
|
||||||
hwloc_pci_add_object(NULL /* no parent on top of tree */, treep, obj);
|
hwloc_pci_add_object(NULL /* no parent on top of tree */, treep, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
hwloc_pci_tree_attach_belowroot(struct hwloc_topology *topology, struct hwloc_obj *old_tree)
|
hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *old_tree)
|
||||||
{
|
{
|
||||||
struct hwloc_obj **next_hb_p;
|
struct hwloc_obj **next_hb_p;
|
||||||
enum hwloc_type_filter_e bfilter;
|
enum hwloc_type_filter_e bfilter;
|
||||||
@ -539,8 +539,8 @@ hwloc__pci_find_busid_parent(struct hwloc_topology *topology, struct hwloc_pcide
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct hwloc_obj *
|
struct hwloc_obj *
|
||||||
hwloc_pci_find_busid_parent(struct hwloc_topology *topology,
|
hwloc_pcidisc_find_busid_parent(struct hwloc_topology *topology,
|
||||||
unsigned domain, unsigned bus, unsigned dev, unsigned func)
|
unsigned domain, unsigned bus, unsigned dev, unsigned func)
|
||||||
{
|
{
|
||||||
struct hwloc_pcidev_attr_s busid;
|
struct hwloc_pcidev_attr_s busid;
|
||||||
busid.domain = domain;
|
busid.domain = domain;
|
||||||
@ -652,8 +652,8 @@ hwloc__pci_belowroot_find_by_busid(hwloc_obj_t parent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct hwloc_obj *
|
struct hwloc_obj *
|
||||||
hwloc_pci_belowroot_find_by_busid(struct hwloc_topology *topology,
|
hwloc_pcidisc_find_by_busid(struct hwloc_topology *topology,
|
||||||
unsigned domain, unsigned bus, unsigned dev, unsigned func)
|
unsigned domain, unsigned bus, unsigned dev, unsigned func)
|
||||||
{
|
{
|
||||||
hwloc_obj_t root = hwloc_get_root_obj(topology);
|
hwloc_obj_t root = hwloc_get_root_obj(topology);
|
||||||
hwloc_obj_t parent = hwloc__pci_belowroot_find_by_busid(root, domain, bus, dev, func);
|
hwloc_obj_t parent = hwloc__pci_belowroot_find_by_busid(root, domain, bus, dev, func);
|
||||||
@ -670,7 +670,7 @@ hwloc_pci_belowroot_find_by_busid(struct hwloc_topology *topology,
|
|||||||
#define HWLOC_PCI_CAP_LIST_NEXT 1
|
#define HWLOC_PCI_CAP_LIST_NEXT 1
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
hwloc_pci_find_cap(const unsigned char *config, unsigned cap)
|
hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap)
|
||||||
{
|
{
|
||||||
unsigned char seen[256] = { 0 };
|
unsigned char seen[256] = { 0 };
|
||||||
unsigned char ptr; /* unsigned char to make sure we stay within the 256-byte config space */
|
unsigned char ptr; /* unsigned char to make sure we stay within the 256-byte config space */
|
||||||
@ -702,8 +702,8 @@ hwloc_pci_find_cap(const unsigned char *config, unsigned cap)
|
|||||||
#define HWLOC_PCI_EXP_LNKSTA_WIDTH 0x03f0
|
#define HWLOC_PCI_EXP_LNKSTA_WIDTH 0x03f0
|
||||||
|
|
||||||
int
|
int
|
||||||
hwloc_pci_find_linkspeed(const unsigned char *config,
|
hwloc_pcidisc_find_linkspeed(const unsigned char *config,
|
||||||
unsigned offset, float *linkspeed)
|
unsigned offset, float *linkspeed)
|
||||||
{
|
{
|
||||||
unsigned linksta, speed, width;
|
unsigned linksta, speed, width;
|
||||||
float lanespeed;
|
float lanespeed;
|
||||||
@ -733,7 +733,7 @@ hwloc_pci_find_linkspeed(const unsigned char *config,
|
|||||||
#define HWLOC_PCI_CLASS_BRIDGE_PCI 0x0604
|
#define HWLOC_PCI_CLASS_BRIDGE_PCI 0x0604
|
||||||
|
|
||||||
hwloc_obj_type_t
|
hwloc_obj_type_t
|
||||||
hwloc_pci_check_bridge_type(unsigned device_class, const unsigned char *config)
|
hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config)
|
||||||
{
|
{
|
||||||
unsigned char headertype;
|
unsigned char headertype;
|
||||||
|
|
||||||
@ -750,8 +750,8 @@ hwloc_pci_check_bridge_type(unsigned device_class, const unsigned char *config)
|
|||||||
#define HWLOC_PCI_SUBORDINATE_BUS 0x1a
|
#define HWLOC_PCI_SUBORDINATE_BUS 0x1a
|
||||||
|
|
||||||
int
|
int
|
||||||
hwloc_pci_setup_bridge_attr(hwloc_obj_t obj,
|
hwloc_pcidisc_setup_bridge_attr(hwloc_obj_t obj,
|
||||||
const unsigned char *config)
|
const unsigned char *config)
|
||||||
{
|
{
|
||||||
struct hwloc_bridge_attr_s *battr = &obj->attr->bridge;
|
struct hwloc_bridge_attr_s *battr = &obj->attr->bridge;
|
||||||
struct hwloc_pcidev_attr_s *pattr = &battr->upstream.pci;
|
struct hwloc_pcidev_attr_s *pattr = &battr->upstream.pci;
|
||||||
|
@ -107,19 +107,19 @@ hwloc_shmem_topology_write(hwloc_topology_t topology,
|
|||||||
|
|
||||||
err = write(fd, &header, sizeof(header));
|
err = write(fd, &header, sizeof(header));
|
||||||
if (err != sizeof(header))
|
if (err != sizeof(header))
|
||||||
return -2;
|
return -1;
|
||||||
|
|
||||||
err = ftruncate(fd, fileoffset + length);
|
err = ftruncate(fd, fileoffset + length);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return -3;
|
return -1;
|
||||||
|
|
||||||
mmap_res = mmap(mmap_address, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, fileoffset);
|
mmap_res = mmap(mmap_address, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, fileoffset);
|
||||||
if (mmap_res == MAP_FAILED)
|
if (mmap_res == MAP_FAILED)
|
||||||
return -4;
|
return -1;
|
||||||
if (mmap_res != mmap_address) {
|
if (mmap_res != mmap_address) {
|
||||||
munmap(mmap_res, length);
|
munmap(mmap_res, length);
|
||||||
errno = EBUSY;
|
errno = EBUSY;
|
||||||
return -5;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tma.malloc = tma_shmem_malloc;
|
tma.malloc = tma_shmem_malloc;
|
||||||
|
@ -109,9 +109,9 @@ hwloc_cuda_discover(struct hwloc_backend *backend)
|
|||||||
|
|
||||||
parent = NULL;
|
parent = NULL;
|
||||||
if (hwloc_cudart_get_device_pci_ids(NULL /* topology unused */, i, &domain, &bus, &dev) == 0) {
|
if (hwloc_cudart_get_device_pci_ids(NULL /* topology unused */, i, &domain, &bus, &dev) == 0) {
|
||||||
parent = hwloc_pci_belowroot_find_by_busid(topology, domain, bus, dev, 0);
|
parent = hwloc_pcidisc_find_by_busid(topology, domain, bus, dev, 0);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_pci_find_busid_parent(topology, domain, bus, dev, 0);
|
parent = hwloc_pcidisc_find_busid_parent(topology, domain, bus, dev, 0);
|
||||||
}
|
}
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_get_root_obj(topology);
|
parent = hwloc_get_root_obj(topology);
|
||||||
|
@ -120,9 +120,9 @@ hwloc_gl_discover(struct hwloc_backend *backend)
|
|||||||
if (productname)
|
if (productname)
|
||||||
hwloc_obj_add_info(osdev, "GPUModel", productname);
|
hwloc_obj_add_info(osdev, "GPUModel", productname);
|
||||||
|
|
||||||
parent = hwloc_pci_belowroot_find_by_busid(topology, nv_ctrl_pci_domain, nv_ctrl_pci_bus, nv_ctrl_pci_device, nv_ctrl_pci_func);
|
parent = hwloc_pcidisc_find_by_busid(topology, nv_ctrl_pci_domain, nv_ctrl_pci_bus, nv_ctrl_pci_device, nv_ctrl_pci_func);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_pci_find_busid_parent(topology, nv_ctrl_pci_domain, nv_ctrl_pci_bus, nv_ctrl_pci_device, nv_ctrl_pci_func);
|
parent = hwloc_pcidisc_find_busid_parent(topology, nv_ctrl_pci_domain, nv_ctrl_pci_bus, nv_ctrl_pci_device, nv_ctrl_pci_func);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_get_root_obj(topology);
|
parent = hwloc_get_root_obj(topology);
|
||||||
|
|
||||||
|
@ -3230,7 +3230,7 @@ look_sysfsnode(struct hwloc_topology *topology,
|
|||||||
if (distances)
|
if (distances)
|
||||||
hwloc_internal_distances_add(topology, nbnodes, nodes, distances,
|
hwloc_internal_distances_add(topology, nbnodes, nodes, distances,
|
||||||
HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_MEANS_LATENCY,
|
HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_MEANS_LATENCY,
|
||||||
HWLOC_DISTANCES_FLAG_GROUP);
|
HWLOC_DISTANCES_ADD_FLAG_GROUP);
|
||||||
else
|
else
|
||||||
free(nodes);
|
free(nodes);
|
||||||
}
|
}
|
||||||
@ -3818,7 +3818,7 @@ hwloc_linux_parse_cpuinfo(struct hwloc_linux_backend_data_s *data,
|
|||||||
while (end[-1] == ' ' || end[-1] == '\t') end--; /* need a strrspn() */
|
while (end[-1] == ' ' || end[-1] == '\t') end--; /* need a strrspn() */
|
||||||
*end = 0;
|
*end = 0;
|
||||||
/* find beginning of value, its end is already marked */
|
/* find beginning of value, its end is already marked */
|
||||||
value = dot+1 + strspn(dot+1, " ");
|
value = dot+1 + strspn(dot+1, " \t");
|
||||||
|
|
||||||
/* defines for parsing numbers */
|
/* defines for parsing numbers */
|
||||||
# define getprocnb_begin(field, var) \
|
# define getprocnb_begin(field, var) \
|
||||||
@ -4210,7 +4210,7 @@ hwloc_linux_try_hardwired_cpuinfo(struct hwloc_backend *backend)
|
|||||||
if (hwloc_read_path_by_length("/proc/cpuinfo", line, sizeof(line), data->root_fd) < 0)
|
if (hwloc_read_path_by_length("/proc/cpuinfo", line, sizeof(line), data->root_fd) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (strncmp(line, "cpu ", 4))
|
if (strncmp(line, "cpu\t", 4))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (strstr(line, "Fujitsu SPARC64 VIIIfx"))
|
if (strstr(line, "Fujitsu SPARC64 VIIIfx"))
|
||||||
@ -4626,11 +4626,11 @@ hwloc_linuxfs_find_osdev_parent(struct hwloc_backend *backend, int root_fd,
|
|||||||
|
|
||||||
if (foundpci) {
|
if (foundpci) {
|
||||||
/* attach to a PCI parent */
|
/* attach to a PCI parent */
|
||||||
parent = hwloc_pci_belowroot_find_by_busid(topology, pcidomain, pcibus, pcidev, pcifunc);
|
parent = hwloc_pcidisc_find_by_busid(topology, pcidomain, pcibus, pcidev, pcifunc);
|
||||||
if (parent)
|
if (parent)
|
||||||
return parent;
|
return parent;
|
||||||
/* attach to a normal (non-I/O) parent found by PCI affinity */
|
/* attach to a normal (non-I/O) parent found by PCI affinity */
|
||||||
parent = hwloc_pci_find_busid_parent(topology, pcidomain, pcibus, pcidev, pcifunc);
|
parent = hwloc_pcidisc_find_busid_parent(topology, pcidomain, pcibus, pcidev, pcifunc);
|
||||||
if (parent)
|
if (parent)
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
@ -5503,7 +5503,7 @@ hwloc_linuxfs_pci_look_pcidevices(struct hwloc_backend *backend)
|
|||||||
&& !hwloc_read_path_by_length(path, value, sizeof(value), root_fd))
|
&& !hwloc_read_path_by_length(path, value, sizeof(value), root_fd))
|
||||||
class_id = strtoul(value, NULL, 16) >> 8;
|
class_id = strtoul(value, NULL, 16) >> 8;
|
||||||
|
|
||||||
type = hwloc_pci_check_bridge_type(class_id, config_space_cache);
|
type = hwloc_pcidisc_check_bridge_type(class_id, config_space_cache);
|
||||||
|
|
||||||
/* filtered? */
|
/* filtered? */
|
||||||
if (type == HWLOC_OBJ_PCI_DEVICE) {
|
if (type == HWLOC_OBJ_PCI_DEVICE) {
|
||||||
@ -5563,7 +5563,7 @@ hwloc_linuxfs_pci_look_pcidevices(struct hwloc_backend *backend)
|
|||||||
|
|
||||||
/* bridge specific attributes */
|
/* bridge specific attributes */
|
||||||
if (type == HWLOC_OBJ_BRIDGE) {
|
if (type == HWLOC_OBJ_BRIDGE) {
|
||||||
if (hwloc_pci_setup_bridge_attr(obj, config_space_cache) < 0)
|
if (hwloc_pcidisc_setup_bridge_attr(obj, config_space_cache) < 0)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5571,16 +5571,16 @@ hwloc_linuxfs_pci_look_pcidevices(struct hwloc_backend *backend)
|
|||||||
attr->revision = config_space_cache[HWLOC_PCI_REVISION_ID];
|
attr->revision = config_space_cache[HWLOC_PCI_REVISION_ID];
|
||||||
|
|
||||||
/* try to get the link speed */
|
/* try to get the link speed */
|
||||||
offset = hwloc_pci_find_cap(config_space_cache, HWLOC_PCI_CAP_ID_EXP);
|
offset = hwloc_pcidisc_find_cap(config_space_cache, HWLOC_PCI_CAP_ID_EXP);
|
||||||
if (offset > 0 && offset + 20 /* size of PCI express block up to link status */ <= CONFIG_SPACE_CACHESIZE)
|
if (offset > 0 && offset + 20 /* size of PCI express block up to link status */ <= CONFIG_SPACE_CACHESIZE)
|
||||||
hwloc_pci_find_linkspeed(config_space_cache, offset, &attr->linkspeed);
|
hwloc_pcidisc_find_linkspeed(config_space_cache, offset, &attr->linkspeed);
|
||||||
|
|
||||||
hwloc_pci_tree_insert_by_busid(&tree, obj);
|
hwloc_pcidisc_tree_insert_by_busid(&tree, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
|
||||||
hwloc_pci_tree_attach_belowroot(backend->topology, tree);
|
hwloc_pcidisc_tree_attach(backend->topology, tree);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +69,9 @@ hwloc_nvml_discover(struct hwloc_backend *backend)
|
|||||||
|
|
||||||
parent = NULL;
|
parent = NULL;
|
||||||
if (NVML_SUCCESS == nvmlDeviceGetPciInfo(device, &pci)) {
|
if (NVML_SUCCESS == nvmlDeviceGetPciInfo(device, &pci)) {
|
||||||
parent = hwloc_pci_belowroot_find_by_busid(topology, pci.domain, pci.bus, pci.device, 0);
|
parent = hwloc_pcidisc_find_by_busid(topology, pci.domain, pci.bus, pci.device, 0);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_pci_find_busid_parent(topology, pci.domain, pci.bus, pci.device, 0);
|
parent = hwloc_pcidisc_find_busid_parent(topology, pci.domain, pci.bus, pci.device, 0);
|
||||||
#if HAVE_DECL_NVMLDEVICEGETMAXPCIELINKGENERATION
|
#if HAVE_DECL_NVMLDEVICEGETMAXPCIELINKGENERATION
|
||||||
if (parent && parent->type == HWLOC_OBJ_PCI_DEVICE) {
|
if (parent && parent->type == HWLOC_OBJ_PCI_DEVICE) {
|
||||||
unsigned maxwidth = 0, maxgen = 0;
|
unsigned maxwidth = 0, maxgen = 0;
|
||||||
|
@ -141,9 +141,9 @@ hwloc_opencl_discover(struct hwloc_backend *backend)
|
|||||||
|
|
||||||
parent = NULL;
|
parent = NULL;
|
||||||
#ifdef CL_DEVICE_TOPOLOGY_AMD
|
#ifdef CL_DEVICE_TOPOLOGY_AMD
|
||||||
parent = hwloc_pci_belowroot_find_by_busid(topology, 0, amdtopo.pcie.bus, amdtopo.pcie.device, amdtopo.pcie.function);
|
parent = hwloc_pcidisc_find_by_busid(topology, 0, amdtopo.pcie.bus, amdtopo.pcie.device, amdtopo.pcie.function);
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_pci_find_busid_parent(topology, 0, amdtopo.pcie.bus, amdtopo.pcie.device, amdtopo.pcie.function);
|
parent = hwloc_pcidisc_find_busid_parent(topology, 0, amdtopo.pcie.bus, amdtopo.pcie.device, amdtopo.pcie.function);
|
||||||
#endif
|
#endif
|
||||||
if (!parent)
|
if (!parent)
|
||||||
parent = hwloc_get_root_obj(topology);
|
parent = hwloc_get_root_obj(topology);
|
||||||
|
@ -140,7 +140,7 @@ hwloc_look_pci(struct hwloc_backend *backend)
|
|||||||
device_class = pcidev->device_class >> 8;
|
device_class = pcidev->device_class >> 8;
|
||||||
|
|
||||||
/* bridge or pci dev? */
|
/* bridge or pci dev? */
|
||||||
type = hwloc_pci_check_bridge_type(device_class, config_space_cache);
|
type = hwloc_pcidisc_check_bridge_type(device_class, config_space_cache);
|
||||||
|
|
||||||
/* filtered? */
|
/* filtered? */
|
||||||
if (type == HWLOC_OBJ_PCI_DEVICE) {
|
if (type == HWLOC_OBJ_PCI_DEVICE) {
|
||||||
@ -222,13 +222,13 @@ hwloc_look_pci(struct hwloc_backend *backend)
|
|||||||
obj->attr->pcidev.revision = config_space_cache[PCI_REVISION_ID];
|
obj->attr->pcidev.revision = config_space_cache[PCI_REVISION_ID];
|
||||||
|
|
||||||
obj->attr->pcidev.linkspeed = 0; /* unknown */
|
obj->attr->pcidev.linkspeed = 0; /* unknown */
|
||||||
offset = hwloc_pci_find_cap(config_space_cache, PCI_CAP_ID_EXP);
|
offset = hwloc_pcidisc_find_cap(config_space_cache, PCI_CAP_ID_EXP);
|
||||||
|
|
||||||
if (offset > 0 && offset + 20 /* size of PCI express block up to link status */ <= CONFIG_SPACE_CACHESIZE)
|
if (offset > 0 && offset + 20 /* size of PCI express block up to link status */ <= CONFIG_SPACE_CACHESIZE)
|
||||||
hwloc_pci_find_linkspeed(config_space_cache, offset, &obj->attr->pcidev.linkspeed);
|
hwloc_pcidisc_find_linkspeed(config_space_cache, offset, &obj->attr->pcidev.linkspeed);
|
||||||
|
|
||||||
if (type == HWLOC_OBJ_BRIDGE) {
|
if (type == HWLOC_OBJ_BRIDGE) {
|
||||||
if (hwloc_pci_setup_bridge_attr(obj, config_space_cache) < 0)
|
if (hwloc_pcidisc_setup_bridge_attr(obj, config_space_cache) < 0)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,14 +260,14 @@ hwloc_look_pci(struct hwloc_backend *backend)
|
|||||||
vendorname && *vendorname ? vendorname : "??",
|
vendorname && *vendorname ? vendorname : "??",
|
||||||
devicename && *devicename ? devicename : "??");
|
devicename && *devicename ? devicename : "??");
|
||||||
|
|
||||||
hwloc_pci_tree_insert_by_busid(&tree, obj);
|
hwloc_pcidisc_tree_insert_by_busid(&tree, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finalize device scanning */
|
/* finalize device scanning */
|
||||||
pci_iterator_destroy(iter);
|
pci_iterator_destroy(iter);
|
||||||
pci_system_cleanup();
|
pci_system_cleanup();
|
||||||
|
|
||||||
hwloc_pci_tree_attach_belowroot(topology, tree);
|
hwloc_pcidisc_tree_attach(topology, tree);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
* Copyright © 2013 Université Bordeaux. All rights reserved.
|
* Copyright © 2013 Université Bordeaux. All rights reserved.
|
||||||
* Copyright © 2016 Inria. All rights reserved.
|
* Copyright © 2016 Inria. All rights reserved.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -425,7 +425,7 @@ hwloc_look_lgrp(struct hwloc_topology *topology)
|
|||||||
}
|
}
|
||||||
hwloc_internal_distances_add(topology, curlgrp, glob_lgrps, distances,
|
hwloc_internal_distances_add(topology, curlgrp, glob_lgrps, distances,
|
||||||
HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_MEANS_LATENCY,
|
HWLOC_DISTANCES_KIND_FROM_OS|HWLOC_DISTANCES_KIND_MEANS_LATENCY,
|
||||||
HWLOC_DISTANCES_FLAG_GROUP);
|
HWLOC_DISTANCES_ADD_FLAG_GROUP);
|
||||||
} else
|
} else
|
||||||
#endif /* HAVE_DECL_LGRP_LATENCY_COOKIE */
|
#endif /* HAVE_DECL_LGRP_LATENCY_COOKIE */
|
||||||
free(glob_lgrps);
|
free(glob_lgrps);
|
||||||
|
@ -764,13 +764,19 @@ hwloc__xml_import_object(hwloc_topology_t topology,
|
|||||||
if (!strcasecmp(attrvalue, "Cache")) {
|
if (!strcasecmp(attrvalue, "Cache")) {
|
||||||
obj->type = _HWLOC_OBJ_CACHE_OLD; /* will be fixed below */
|
obj->type = _HWLOC_OBJ_CACHE_OLD; /* will be fixed below */
|
||||||
attribute_less_cache = 1;
|
attribute_less_cache = 1;
|
||||||
} else
|
} else {
|
||||||
|
if (hwloc__xml_verbose())
|
||||||
|
fprintf(stderr, "unrecognized object type string %s\n", attrvalue);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* type needed first */
|
/* type needed first */
|
||||||
if (obj->type == HWLOC_OBJ_TYPE_NONE)
|
if (obj->type == HWLOC_OBJ_TYPE_NONE) {
|
||||||
|
if (hwloc__xml_verbose())
|
||||||
|
fprintf(stderr, "object attribute %s found before type\n", attrname);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
|
}
|
||||||
hwloc__xml_import_object_attr(topology, obj, attrname, attrvalue, state);
|
hwloc__xml_import_object_attr(topology, obj, attrname, attrvalue, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -830,23 +836,35 @@ hwloc__xml_import_object(hwloc_topology_t topology,
|
|||||||
if (!obj->cpuset != !obj->allowed_cpuset
|
if (!obj->cpuset != !obj->allowed_cpuset
|
||||||
|| !obj->cpuset != !obj->complete_cpuset) {
|
|| !obj->cpuset != !obj->complete_cpuset) {
|
||||||
/* has some cpuset without others */
|
/* has some cpuset without others */
|
||||||
if (obj->type == HWLOC_OBJ_GROUP)
|
if (obj->type == HWLOC_OBJ_GROUP) {
|
||||||
ignored = 1;
|
ignored = 1;
|
||||||
else
|
} else {
|
||||||
|
if (hwloc__xml_verbose())
|
||||||
|
fprintf(stderr, "invalid object %s P#%u with some missing cpusets\n",
|
||||||
|
hwloc_type_name(obj->type), obj->os_index);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
|
}
|
||||||
} else if (!obj->nodeset != !obj->allowed_nodeset
|
} else if (!obj->nodeset != !obj->allowed_nodeset
|
||||||
|| !obj->nodeset != !obj->complete_nodeset) {
|
|| !obj->nodeset != !obj->complete_nodeset) {
|
||||||
/* has some nodeset withot others */
|
/* has some nodeset withot others */
|
||||||
if (obj->type == HWLOC_OBJ_GROUP)
|
if (obj->type == HWLOC_OBJ_GROUP) {
|
||||||
ignored = 1;
|
ignored = 1;
|
||||||
else
|
} else {
|
||||||
|
if (hwloc__xml_verbose())
|
||||||
|
fprintf(stderr, "invalid object %s P#%u with some missing nodesets\n",
|
||||||
|
hwloc_type_name(obj->type), obj->os_index);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
|
}
|
||||||
} else if (obj->nodeset && !obj->cpuset) {
|
} else if (obj->nodeset && !obj->cpuset) {
|
||||||
/* has nodesets without cpusets (the contrary is allowed in pre-2.0) */
|
/* has nodesets without cpusets (the contrary is allowed in pre-2.0) */
|
||||||
if (obj->type == HWLOC_OBJ_GROUP)
|
if (obj->type == HWLOC_OBJ_GROUP) {
|
||||||
ignored = 1;
|
ignored = 1;
|
||||||
else
|
} else {
|
||||||
|
if (hwloc__xml_verbose())
|
||||||
|
fprintf(stderr, "invalid object %s P#%u with either cpuset or nodeset missing\n",
|
||||||
|
hwloc_type_name(obj->type), obj->os_index);
|
||||||
goto error_with_object;
|
goto error_with_object;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check NUMA nodes */
|
/* check NUMA nodes */
|
||||||
@ -2220,20 +2238,20 @@ hwloc_export_obj_userdata(void *reserved,
|
|||||||
int encoded;
|
int encoded;
|
||||||
size_t encoded_length;
|
size_t encoded_length;
|
||||||
const char *realname;
|
const char *realname;
|
||||||
if (!strncmp(name, "normal", 6)) {
|
if (!strncmp(name, "base64", 6)) {
|
||||||
encoded = 0;
|
|
||||||
encoded_length = length;
|
|
||||||
} else if (!strncmp(name, "base64", 6)) {
|
|
||||||
encoded = 1;
|
encoded = 1;
|
||||||
encoded_length = BASE64_ENCODED_LENGTH(length);
|
encoded_length = BASE64_ENCODED_LENGTH(length);
|
||||||
} else
|
} else {
|
||||||
assert(0);
|
assert(!strncmp(name, "normal", 6));
|
||||||
|
encoded = 0;
|
||||||
|
encoded_length = length;
|
||||||
|
}
|
||||||
if (name[6] == ':')
|
if (name[6] == ':')
|
||||||
realname = name+7;
|
realname = name+7;
|
||||||
else if (!strcmp(name+6, "-anon"))
|
else {
|
||||||
|
assert(!strcmp(name+6, "-anon"));
|
||||||
realname = NULL;
|
realname = NULL;
|
||||||
else
|
}
|
||||||
assert(0);
|
|
||||||
hwloc__export_obj_userdata(state, encoded, realname, length, buffer, encoded_length);
|
hwloc__export_obj_userdata(state, encoded, realname, length, buffer, encoded_length);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
|
@ -199,6 +199,35 @@ hwloc_setup_pu_level(struct hwloc_topology *topology,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Traverse children of a parent */
|
||||||
|
#define for_each_child(child, parent) for(child = parent->first_child; child; child = child->next_sibling)
|
||||||
|
#define for_each_io_child(child, parent) for(child = parent->io_first_child; child; child = child->next_sibling)
|
||||||
|
#define for_each_misc_child(child, parent) for(child = parent->misc_first_child; child; child = child->next_sibling)
|
||||||
|
|
||||||
|
/* Traverse children of a parent in a safe way: reread the next pointer as
|
||||||
|
* appropriate to prevent crash on child deletion: */
|
||||||
|
#define for_each_child_safe(child, parent, pchild) \
|
||||||
|
for (pchild = &(parent)->first_child, child = *pchild; \
|
||||||
|
child; \
|
||||||
|
/* Check whether the current child was not dropped. */ \
|
||||||
|
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
||||||
|
/* Get pointer to next child. */ \
|
||||||
|
child = *pchild)
|
||||||
|
#define for_each_io_child_safe(child, parent, pchild) \
|
||||||
|
for (pchild = &(parent)->io_first_child, child = *pchild; \
|
||||||
|
child; \
|
||||||
|
/* Check whether the current child was not dropped. */ \
|
||||||
|
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
||||||
|
/* Get pointer to next child. */ \
|
||||||
|
child = *pchild)
|
||||||
|
#define for_each_misc_child_safe(child, parent, pchild) \
|
||||||
|
for (pchild = &(parent)->misc_first_child, child = *pchild; \
|
||||||
|
child; \
|
||||||
|
/* Check whether the current child was not dropped. */ \
|
||||||
|
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
||||||
|
/* Get pointer to next child. */ \
|
||||||
|
child = *pchild)
|
||||||
|
|
||||||
#ifdef HWLOC_DEBUG
|
#ifdef HWLOC_DEBUG
|
||||||
/* Just for debugging. */
|
/* Just for debugging. */
|
||||||
static void
|
static void
|
||||||
@ -257,11 +286,11 @@ hwloc_debug_print_objects(int indent __hwloc_attribute_unused, hwloc_obj_t obj)
|
|||||||
{
|
{
|
||||||
hwloc_obj_t child;
|
hwloc_obj_t child;
|
||||||
hwloc_debug_print_object(indent, obj);
|
hwloc_debug_print_object(indent, obj);
|
||||||
for (child = obj->first_child; child; child = child->next_sibling)
|
for_each_child (child, obj)
|
||||||
hwloc_debug_print_objects(indent + 1, child);
|
hwloc_debug_print_objects(indent + 1, child);
|
||||||
for (child = obj->io_first_child; child; child = child->next_sibling)
|
for_each_io_child (child, obj)
|
||||||
hwloc_debug_print_objects(indent + 1, child);
|
hwloc_debug_print_objects(indent + 1, child);
|
||||||
for (child = obj->misc_first_child; child; child = child->next_sibling)
|
for_each_misc_child (child, obj)
|
||||||
hwloc_debug_print_objects(indent + 1, child);
|
hwloc_debug_print_objects(indent + 1, child);
|
||||||
}
|
}
|
||||||
#else /* !HWLOC_DEBUG */
|
#else /* !HWLOC_DEBUG */
|
||||||
@ -389,30 +418,6 @@ static int hwloc__tma_dup_infos(struct hwloc_tma *tma, hwloc_obj_t new, hwloc_ob
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Traverse children of a parent in a safe way: reread the next pointer as
|
|
||||||
* appropriate to prevent crash on child deletion: */
|
|
||||||
#define for_each_child_safe(child, parent, pchild) \
|
|
||||||
for (pchild = &(parent)->first_child, child = *pchild; \
|
|
||||||
child; \
|
|
||||||
/* Check whether the current child was not dropped. */ \
|
|
||||||
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
|
||||||
/* Get pointer to next child. */ \
|
|
||||||
child = *pchild)
|
|
||||||
#define for_each_io_child_safe(child, parent, pchild) \
|
|
||||||
for (pchild = &(parent)->io_first_child, child = *pchild; \
|
|
||||||
child; \
|
|
||||||
/* Check whether the current child was not dropped. */ \
|
|
||||||
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
|
||||||
/* Get pointer to next child. */ \
|
|
||||||
child = *pchild)
|
|
||||||
#define for_each_misc_child_safe(child, parent, pchild) \
|
|
||||||
for (pchild = &(parent)->misc_first_child, child = *pchild; \
|
|
||||||
child; \
|
|
||||||
/* Check whether the current child was not dropped. */ \
|
|
||||||
(*pchild == child ? pchild = &(child->next_sibling) : NULL), \
|
|
||||||
/* Get pointer to next child. */ \
|
|
||||||
child = *pchild)
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hwloc__free_object_contents(hwloc_obj_t obj)
|
hwloc__free_object_contents(hwloc_obj_t obj)
|
||||||
{
|
{
|
||||||
@ -654,9 +659,14 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
unsigned level_width;
|
unsigned level_width;
|
||||||
size_t len;
|
size_t len;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
hwloc_obj_t child;
|
hwloc_obj_t child, prev;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
/* either we're duplicating to an already allocated new root, which has no newparent,
|
||||||
|
* or we're duplicating to a non-yet allocated new non-root, which will have a newparent.
|
||||||
|
*/
|
||||||
|
assert(!newparent == !!newobj);
|
||||||
|
|
||||||
if (!newobj) {
|
if (!newobj) {
|
||||||
newobj = hwloc_alloc_setup_object(newtopology, src->type, src->os_index);
|
newobj = hwloc_alloc_setup_object(newtopology, src->type, src->os_index);
|
||||||
if (!newobj)
|
if (!newobj)
|
||||||
@ -737,17 +747,17 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
newobj->misc_arity = src->misc_arity;
|
newobj->misc_arity = src->misc_arity;
|
||||||
|
|
||||||
/* actually insert children now */
|
/* actually insert children now */
|
||||||
for(child = src->first_child; child; child = child->next_sibling) {
|
for_each_child(child, src) {
|
||||||
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_with_children;
|
goto out_with_children;
|
||||||
}
|
}
|
||||||
for(child = src->io_first_child; child; child = child->next_sibling) {
|
for_each_io_child(child, src) {
|
||||||
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_with_children;
|
goto out_with_children;
|
||||||
}
|
}
|
||||||
for(child = src->misc_first_child; child; child = child->next_sibling) {
|
for_each_misc_child(child, src) {
|
||||||
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
err = hwloc__duplicate_object(newtopology, newobj, NULL, child);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_with_children;
|
goto out_with_children;
|
||||||
@ -755,13 +765,35 @@ hwloc__duplicate_object(struct hwloc_topology *newtopology,
|
|||||||
|
|
||||||
out_with_children:
|
out_with_children:
|
||||||
|
|
||||||
/* link some children if all of them where inserted */
|
/* link children if all of them where inserted */
|
||||||
if (!err && newobj->arity) {
|
if (!err) {
|
||||||
newobj->children[0]->prev_sibling = NULL;
|
/* only next_sibling is set by insert_by_parent().
|
||||||
for(i=1; i<newobj->arity; i++)
|
* sibling_rank was set above.
|
||||||
newobj->children[i]->prev_sibling = newobj->children[i-1];
|
*/
|
||||||
newobj->first_child = newobj->children[0];
|
if (newobj->arity) {
|
||||||
newobj->last_child = newobj->children[newobj->arity-1];
|
newobj->children[0]->prev_sibling = NULL;
|
||||||
|
for(i=1; i<newobj->arity; i++)
|
||||||
|
newobj->children[i]->prev_sibling = newobj->children[i-1];
|
||||||
|
newobj->last_child = newobj->children[newobj->arity-1];
|
||||||
|
}
|
||||||
|
if (newobj->io_arity) {
|
||||||
|
child = newobj->io_first_child;
|
||||||
|
prev = NULL;
|
||||||
|
while (child) {
|
||||||
|
child->prev_sibling = prev;
|
||||||
|
prev = child;
|
||||||
|
child = child->next_sibling;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newobj->misc_arity) {
|
||||||
|
child = newobj->misc_first_child;
|
||||||
|
prev = NULL;
|
||||||
|
while (child) {
|
||||||
|
child->prev_sibling = prev;
|
||||||
|
prev = child;
|
||||||
|
child = child->next_sibling;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* some children insertion may have failed, but some children may have been inserted below us already.
|
/* some children insertion may have failed, but some children may have been inserted below us already.
|
||||||
@ -919,6 +951,7 @@ static const unsigned obj_type_order[] = {
|
|||||||
/* next entry is HWLOC_OBJ_OS_DEVICE */ 16
|
/* next entry is HWLOC_OBJ_OS_DEVICE */ 16
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef NDEBUG /* only used in debug check assert if !NDEBUG */
|
||||||
static const hwloc_obj_type_t obj_order_type[] = {
|
static const hwloc_obj_type_t obj_order_type[] = {
|
||||||
HWLOC_OBJ_SYSTEM,
|
HWLOC_OBJ_SYSTEM,
|
||||||
HWLOC_OBJ_MACHINE,
|
HWLOC_OBJ_MACHINE,
|
||||||
@ -940,6 +973,7 @@ static const hwloc_obj_type_t obj_order_type[] = {
|
|||||||
HWLOC_OBJ_PU,
|
HWLOC_OBJ_PU,
|
||||||
HWLOC_OBJ_MISC, /* Misc is always a leaf */
|
HWLOC_OBJ_MISC, /* Misc is always a leaf */
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
/***** Make sure you update obj_type_priority[] below as well. *****/
|
/***** Make sure you update obj_type_priority[] below as well. *****/
|
||||||
|
|
||||||
/* priority to be used when merging identical parent/children object
|
/* priority to be used when merging identical parent/children object
|
||||||
@ -1551,14 +1585,12 @@ hwloc_get_highest_obj_covering_complete_cpuset (hwloc_topology_t topology, hwloc
|
|||||||
|
|
||||||
recurse:
|
recurse:
|
||||||
/* find the right child */
|
/* find the right child */
|
||||||
child = current->first_child;
|
for_each_child(child, current) {
|
||||||
while (child) {
|
|
||||||
if (hwloc_bitmap_isequal(set, child->complete_cpuset))
|
if (hwloc_bitmap_isequal(set, child->complete_cpuset))
|
||||||
/* child puset is exactly what we want, no need to look at children, we want the highest */
|
/* child puset is exactly what we want, no need to look at children, we want the highest */
|
||||||
return child;
|
return child;
|
||||||
if (!hwloc_bitmap_iszero(child->complete_cpuset) && hwloc_bitmap_isincluded(set, child->complete_cpuset))
|
if (!hwloc_bitmap_iszero(child->complete_cpuset) && hwloc_bitmap_isincluded(set, child->complete_cpuset))
|
||||||
break;
|
break;
|
||||||
child = child->next_sibling;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (child) {
|
if (child) {
|
||||||
@ -1627,14 +1659,14 @@ static int hwloc_memory_page_type_compare(const void *_a, const void *_b)
|
|||||||
static void
|
static void
|
||||||
propagate_total_memory(hwloc_obj_t obj)
|
propagate_total_memory(hwloc_obj_t obj)
|
||||||
{
|
{
|
||||||
hwloc_obj_t *temp, child;
|
hwloc_obj_t child;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* reset total before counting local and children memory */
|
/* reset total before counting local and children memory */
|
||||||
obj->memory.total_memory = 0;
|
obj->memory.total_memory = 0;
|
||||||
|
|
||||||
/* Propagate memory up. */
|
/* Propagate memory up. */
|
||||||
for_each_child_safe(child, obj, temp) {
|
for_each_child(child, obj) {
|
||||||
propagate_total_memory(child);
|
propagate_total_memory(child);
|
||||||
obj->memory.total_memory += child->memory.total_memory;
|
obj->memory.total_memory += child->memory.total_memory;
|
||||||
}
|
}
|
||||||
@ -1657,7 +1689,7 @@ propagate_total_memory(hwloc_obj_t obj)
|
|||||||
static void
|
static void
|
||||||
collect_proc_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
collect_proc_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
||||||
{
|
{
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
|
|
||||||
if (sys) {
|
if (sys) {
|
||||||
/* We are already given a pointer to a system object */
|
/* We are already given a pointer to a system object */
|
||||||
@ -1672,7 +1704,7 @@ collect_proc_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_safe(child, obj, temp)
|
for_each_child(child, obj)
|
||||||
collect_proc_cpuset(child, sys);
|
collect_proc_cpuset(child, sys);
|
||||||
/* No PU under I/O or Misc */
|
/* No PU under I/O or Misc */
|
||||||
}
|
}
|
||||||
@ -1682,7 +1714,7 @@ collect_proc_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
|||||||
static void
|
static void
|
||||||
propagate_unused_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
propagate_unused_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
||||||
{
|
{
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
|
|
||||||
if (obj->cpuset) {
|
if (obj->cpuset) {
|
||||||
if (sys) {
|
if (sys) {
|
||||||
@ -1733,7 +1765,7 @@ propagate_unused_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_safe(child, obj, temp)
|
for_each_child(child, obj)
|
||||||
propagate_unused_cpuset(child, sys);
|
propagate_unused_cpuset(child, sys);
|
||||||
/* No PU under I/O or Misc */
|
/* No PU under I/O or Misc */
|
||||||
}
|
}
|
||||||
@ -1762,11 +1794,9 @@ hwloc_obj_add_children_sets(hwloc_obj_t obj)
|
|||||||
{
|
{
|
||||||
hwloc_obj_t child;
|
hwloc_obj_t child;
|
||||||
assert(obj->cpuset != NULL);
|
assert(obj->cpuset != NULL);
|
||||||
child = obj->first_child;
|
for_each_child(child, obj) {
|
||||||
while (child) {
|
|
||||||
assert(child->cpuset != NULL);
|
assert(child->cpuset != NULL);
|
||||||
hwloc_obj_add_other_obj_sets(obj, child);
|
hwloc_obj_add_other_obj_sets(obj, child);
|
||||||
child = child->next_sibling;
|
|
||||||
}
|
}
|
||||||
/* No need to look at Misc children, they contain no PU. */
|
/* No need to look at Misc children, they contain no PU. */
|
||||||
return 0;
|
return 0;
|
||||||
@ -1776,7 +1806,7 @@ hwloc_obj_add_children_sets(hwloc_obj_t obj)
|
|||||||
static void
|
static void
|
||||||
propagate_nodeset(hwloc_obj_t obj, hwloc_obj_t sys)
|
propagate_nodeset(hwloc_obj_t obj, hwloc_obj_t sys)
|
||||||
{
|
{
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
hwloc_bitmap_t parent_nodeset = NULL;
|
hwloc_bitmap_t parent_nodeset = NULL;
|
||||||
int parent_weight = 0;
|
int parent_weight = 0;
|
||||||
|
|
||||||
@ -1797,7 +1827,7 @@ propagate_nodeset(hwloc_obj_t obj, hwloc_obj_t sys)
|
|||||||
obj->nodeset = hwloc_bitmap_alloc();
|
obj->nodeset = hwloc_bitmap_alloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_safe(child, obj, temp) {
|
for_each_child(child, obj) {
|
||||||
/* Propagate singleton nodesets down */
|
/* Propagate singleton nodesets down */
|
||||||
if (parent_weight == 1) {
|
if (parent_weight == 1) {
|
||||||
if (!child->nodeset)
|
if (!child->nodeset)
|
||||||
@ -1824,9 +1854,9 @@ static void
|
|||||||
propagate_nodesets(hwloc_obj_t obj)
|
propagate_nodesets(hwloc_obj_t obj)
|
||||||
{
|
{
|
||||||
hwloc_bitmap_t mask = hwloc_bitmap_alloc();
|
hwloc_bitmap_t mask = hwloc_bitmap_alloc();
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
|
|
||||||
for_each_child_safe(child, obj, temp) {
|
for_each_child(child, obj) {
|
||||||
if (obj->nodeset) {
|
if (obj->nodeset) {
|
||||||
/* Update complete nodesets down */
|
/* Update complete nodesets down */
|
||||||
if (child->complete_nodeset) {
|
if (child->complete_nodeset) {
|
||||||
@ -1875,7 +1905,7 @@ propagate_nodesets(hwloc_obj_t obj)
|
|||||||
static void
|
static void
|
||||||
remove_unused_sets(hwloc_obj_t obj)
|
remove_unused_sets(hwloc_obj_t obj)
|
||||||
{
|
{
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
|
|
||||||
if (obj->cpuset) {
|
if (obj->cpuset) {
|
||||||
hwloc_bitmap_and(obj->cpuset, obj->cpuset, obj->allowed_cpuset);
|
hwloc_bitmap_and(obj->cpuset, obj->cpuset, obj->allowed_cpuset);
|
||||||
@ -1893,7 +1923,7 @@ remove_unused_sets(hwloc_obj_t obj)
|
|||||||
obj->memory.page_types[i].count = 0;
|
obj->memory.page_types[i].count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_safe(child, obj, temp)
|
for_each_child(child, obj)
|
||||||
remove_unused_sets(child);
|
remove_unused_sets(child);
|
||||||
/* No cpuset under I/O or Misc */
|
/* No cpuset under I/O or Misc */
|
||||||
}
|
}
|
||||||
@ -2160,7 +2190,7 @@ hwloc_propagate_symmetric_subtree(hwloc_topology_t topology, hwloc_obj_t root)
|
|||||||
* return if any child is not symmetric.
|
* return if any child is not symmetric.
|
||||||
*/
|
*/
|
||||||
ok = 1;
|
ok = 1;
|
||||||
for(child = root->first_child; child; child = child->next_sibling) {
|
for_each_child(child, root) {
|
||||||
hwloc_propagate_symmetric_subtree(topology, child);
|
hwloc_propagate_symmetric_subtree(topology, child);
|
||||||
if (!child->symmetric_subtree)
|
if (!child->symmetric_subtree)
|
||||||
ok = 0;
|
ok = 0;
|
||||||
@ -2302,7 +2332,7 @@ find_same_type(hwloc_obj_t root, hwloc_obj_t obj)
|
|||||||
if (hwloc_type_cmp(root, obj) == HWLOC_OBJ_EQUAL)
|
if (hwloc_type_cmp(root, obj) == HWLOC_OBJ_EQUAL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for (child = root->first_child; child; child = child->next_sibling)
|
for_each_child (child, root)
|
||||||
if (find_same_type(child, obj))
|
if (find_same_type(child, obj))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -2392,7 +2422,7 @@ hwloc_append_special_object(struct hwloc_special_level_s *level, hwloc_obj_t obj
|
|||||||
static void
|
static void
|
||||||
hwloc_list_io_misc_objects(hwloc_topology_t topology, hwloc_obj_t obj)
|
hwloc_list_io_misc_objects(hwloc_topology_t topology, hwloc_obj_t obj)
|
||||||
{
|
{
|
||||||
hwloc_obj_t child, *temp;
|
hwloc_obj_t child;
|
||||||
|
|
||||||
if (obj->type == HWLOC_OBJ_MISC) {
|
if (obj->type == HWLOC_OBJ_MISC) {
|
||||||
obj->next_cousin = NULL;
|
obj->next_cousin = NULL;
|
||||||
@ -2400,7 +2430,7 @@ hwloc_list_io_misc_objects(hwloc_topology_t topology, hwloc_obj_t obj)
|
|||||||
/* Insert the main Misc list */
|
/* Insert the main Misc list */
|
||||||
hwloc_append_special_object(&topology->slevels[HWLOC_SLEVEL_MISC], obj);
|
hwloc_append_special_object(&topology->slevels[HWLOC_SLEVEL_MISC], obj);
|
||||||
/* Recurse, Misc only have Misc children */
|
/* Recurse, Misc only have Misc children */
|
||||||
for_each_misc_child_safe(child, obj, temp)
|
for_each_misc_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
|
|
||||||
} else if (hwloc_obj_type_is_io(obj->type)) {
|
} else if (hwloc_obj_type_is_io(obj->type)) {
|
||||||
@ -2422,18 +2452,18 @@ hwloc_list_io_misc_objects(hwloc_topology_t topology, hwloc_obj_t obj)
|
|||||||
hwloc_append_special_object(&topology->slevels[HWLOC_SLEVEL_OSDEV], obj);
|
hwloc_append_special_object(&topology->slevels[HWLOC_SLEVEL_OSDEV], obj);
|
||||||
}
|
}
|
||||||
/* Recurse, I/O only have I/O and Misc children */
|
/* Recurse, I/O only have I/O and Misc children */
|
||||||
for_each_io_child_safe(child, obj, temp)
|
for_each_io_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
for_each_misc_child_safe(child, obj, temp)
|
for_each_misc_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* Recurse */
|
/* Recurse */
|
||||||
for_each_child_safe(child, obj, temp)
|
for_each_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
for_each_io_child_safe(child, obj, temp)
|
for_each_io_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
for_each_misc_child_safe(child, obj, temp)
|
for_each_misc_child(child, obj)
|
||||||
hwloc_list_io_misc_objects(topology, child);
|
hwloc_list_io_misc_objects(topology, child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3442,6 +3472,34 @@ void * hwloc_topology_get_userdata(struct hwloc_topology * topology)
|
|||||||
* Debug Checks *
|
* Debug Checks *
|
||||||
****************/
|
****************/
|
||||||
|
|
||||||
|
#ifndef NDEBUG /* assert only enabled if !NDEBUG */
|
||||||
|
|
||||||
|
static void
|
||||||
|
hwloc__check_child_siblings(hwloc_obj_t parent, hwloc_obj_t *array,
|
||||||
|
unsigned arity, unsigned i,
|
||||||
|
hwloc_obj_t child, hwloc_obj_t prev)
|
||||||
|
{
|
||||||
|
assert(child->parent == parent);
|
||||||
|
|
||||||
|
assert(child->sibling_rank == i);
|
||||||
|
if (array)
|
||||||
|
assert(child == array[i]);
|
||||||
|
|
||||||
|
if (prev)
|
||||||
|
assert(prev->next_sibling == child);
|
||||||
|
assert(child->prev_sibling == prev);
|
||||||
|
|
||||||
|
if (!i)
|
||||||
|
assert(child->prev_sibling == NULL);
|
||||||
|
else
|
||||||
|
assert(child->prev_sibling != NULL);
|
||||||
|
|
||||||
|
if (i == arity-1)
|
||||||
|
assert(child->next_sibling == NULL);
|
||||||
|
else
|
||||||
|
assert(child->next_sibling != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hwloc__check_object(hwloc_topology_t topology, hwloc_obj_t obj);
|
hwloc__check_object(hwloc_topology_t topology, hwloc_obj_t obj);
|
||||||
|
|
||||||
@ -3449,6 +3507,7 @@ hwloc__check_object(hwloc_topology_t topology, hwloc_obj_t obj);
|
|||||||
static void
|
static void
|
||||||
hwloc__check_children(hwloc_topology_t topology, hwloc_obj_t parent)
|
hwloc__check_children(hwloc_topology_t topology, hwloc_obj_t parent)
|
||||||
{
|
{
|
||||||
|
hwloc_obj_t child, prev;
|
||||||
unsigned j;
|
unsigned j;
|
||||||
|
|
||||||
if (!parent->arity) {
|
if (!parent->arity) {
|
||||||
@ -3464,22 +3523,18 @@ hwloc__check_children(hwloc_topology_t topology, hwloc_obj_t parent)
|
|||||||
assert(parent->last_child);
|
assert(parent->last_child);
|
||||||
|
|
||||||
/* sibling checks */
|
/* sibling checks */
|
||||||
for(j=0; j<parent->arity; j++) {
|
for(prev = NULL, child = parent->first_child, j = 0;
|
||||||
hwloc_obj_t child = parent->children[j];
|
child;
|
||||||
assert(child->parent == parent);
|
prev = child, child = child->next_sibling, j++) {
|
||||||
assert(child->sibling_rank == j);
|
|
||||||
if (j)
|
|
||||||
assert(child->prev_sibling == parent->children[j-1]);
|
|
||||||
else
|
|
||||||
assert(!child->prev_sibling);
|
|
||||||
if (j == parent->arity-1)
|
|
||||||
assert(!child->next_sibling);
|
|
||||||
else
|
|
||||||
assert(child->next_sibling == parent->children[j+1]);
|
|
||||||
assert(child->depth > parent->depth);
|
assert(child->depth > parent->depth);
|
||||||
|
/* check siblings */
|
||||||
|
hwloc__check_child_siblings(parent, parent->children, parent->arity, j, child, prev);
|
||||||
/* recurse */
|
/* recurse */
|
||||||
hwloc__check_object(topology, child);
|
hwloc__check_object(topology, child);
|
||||||
}
|
}
|
||||||
|
/* check arity */
|
||||||
|
assert(j == parent->arity);
|
||||||
|
|
||||||
assert(parent->first_child == parent->children[0]);
|
assert(parent->first_child == parent->children[0]);
|
||||||
assert(parent->last_child == parent->children[parent->arity-1]);
|
assert(parent->last_child == parent->children[parent->arity-1]);
|
||||||
|
|
||||||
@ -3565,16 +3620,8 @@ hwloc__check_io_children(hwloc_topology_t topology, hwloc_obj_t parent)
|
|||||||
prev = child, child = child->next_sibling, j++) {
|
prev = child, child = child->next_sibling, j++) {
|
||||||
/* all children must be I/O */
|
/* all children must be I/O */
|
||||||
assert(hwloc_obj_type_is_io(child->type));
|
assert(hwloc_obj_type_is_io(child->type));
|
||||||
|
|
||||||
/* check siblings */
|
/* check siblings */
|
||||||
assert(child->parent == parent);
|
hwloc__check_child_siblings(parent, NULL, parent->io_arity, j, child, prev);
|
||||||
assert(child->sibling_rank == j);
|
|
||||||
if (prev)
|
|
||||||
assert(prev->next_sibling == child);
|
|
||||||
assert(child->prev_sibling == prev);
|
|
||||||
if (j == parent->io_arity-1)
|
|
||||||
assert(child->next_sibling == NULL);
|
|
||||||
|
|
||||||
/* only I/O and Misc children, recurse */
|
/* only I/O and Misc children, recurse */
|
||||||
assert(!child->first_child);
|
assert(!child->first_child);
|
||||||
hwloc__check_object(topology, child);
|
hwloc__check_object(topology, child);
|
||||||
@ -3602,16 +3649,8 @@ hwloc__check_misc_children(hwloc_topology_t topology, hwloc_obj_t parent)
|
|||||||
prev = child, child = child->next_sibling, j++) {
|
prev = child, child = child->next_sibling, j++) {
|
||||||
/* all children must be Misc */
|
/* all children must be Misc */
|
||||||
assert(child->type == HWLOC_OBJ_MISC);
|
assert(child->type == HWLOC_OBJ_MISC);
|
||||||
|
|
||||||
/* check siblings */
|
/* check siblings */
|
||||||
assert(child->parent == parent);
|
hwloc__check_child_siblings(parent, NULL, parent->misc_arity, j, child, prev);
|
||||||
assert(child->sibling_rank == j);
|
|
||||||
if (prev)
|
|
||||||
assert(prev->next_sibling == child);
|
|
||||||
assert(child->prev_sibling == prev);
|
|
||||||
if (j == parent->misc_arity-1)
|
|
||||||
assert(child->next_sibling == NULL);
|
|
||||||
|
|
||||||
/* only Misc children, recurse */
|
/* only Misc children, recurse */
|
||||||
assert(!child->first_child);
|
assert(!child->first_child);
|
||||||
assert(!child->io_first_child);
|
assert(!child->io_first_child);
|
||||||
@ -3666,6 +3705,16 @@ hwloc__check_object(hwloc_topology_t topology, hwloc_obj_t obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check cache type/depth vs type */
|
/* check cache type/depth vs type */
|
||||||
|
if (hwloc_obj_type_is_cache(obj->type)) {
|
||||||
|
if (hwloc_obj_type_is_icache(obj->type))
|
||||||
|
assert(obj->attr->cache.type == HWLOC_OBJ_CACHE_INSTRUCTION);
|
||||||
|
else if (hwloc_obj_type_is_dcache(obj->type))
|
||||||
|
assert(obj->attr->cache.type == HWLOC_OBJ_CACHE_DATA
|
||||||
|
|| obj->attr->cache.type == HWLOC_OBJ_CACHE_UNIFIED);
|
||||||
|
else
|
||||||
|
assert(0);
|
||||||
|
assert(hwloc_cache_type_by_depth_type(obj->attr->cache.depth, obj->attr->cache.type) == obj->type);
|
||||||
|
}
|
||||||
|
|
||||||
/* check children */
|
/* check children */
|
||||||
hwloc__check_children(topology, obj);
|
hwloc__check_children(topology, obj);
|
||||||
@ -3817,3 +3866,12 @@ hwloc_topology_check(struct hwloc_topology *topology)
|
|||||||
* Should only occur if XML is invalid.
|
* Should only occur if XML is invalid.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* NDEBUG */
|
||||||
|
|
||||||
|
void
|
||||||
|
hwloc_topology_check(struct hwloc_topology *topology __hwloc_attribute_unused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* NDEBUG */
|
||||||
|
@ -80,7 +80,14 @@ extern "C" {
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \brief Indicate at build time which hwloc API version is being used. */
|
/** \brief Indicate at build time which hwloc API version is being used.
|
||||||
|
*
|
||||||
|
* This number is updated to (X>>16)+(Y>>8)+Z when a new release X.Y.Z
|
||||||
|
* actually modifies the API.
|
||||||
|
*
|
||||||
|
* Users may check for available features at build time using this number
|
||||||
|
* (see \ref faq_upgrade).
|
||||||
|
*/
|
||||||
#define HWLOC_API_VERSION 0x00020000
|
#define HWLOC_API_VERSION 0x00020000
|
||||||
|
|
||||||
/** \brief Indicate at runtime which hwloc API version was used at build time.
|
/** \brief Indicate at runtime which hwloc API version was used at build time.
|
||||||
|
@ -40,7 +40,11 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
struct hwloc_distances_s {
|
struct hwloc_distances_s {
|
||||||
unsigned nbobjs; /**< \brief Number of objects described by the distance matrix. */
|
unsigned nbobjs; /**< \brief Number of objects described by the distance matrix. */
|
||||||
hwloc_obj_t *objs; /**< \brief Array of objects described by the distance matrix. */
|
hwloc_obj_t *objs; /**< \brief Array of objects described by the distance matrix.
|
||||||
|
* These objects are not in any particular order,
|
||||||
|
* see hwloc_distances_obj_index() and hwloc_distances_obj_pair_values()
|
||||||
|
* for easy ways to find objects in this array and their corresponding values.
|
||||||
|
*/
|
||||||
unsigned long kind; /**< \brief OR'ed set of ::hwloc_distances_kind_e. */
|
unsigned long kind; /**< \brief OR'ed set of ::hwloc_distances_kind_e. */
|
||||||
hwloc_uint64_t *values; /**< \brief Matrix of distances between objects, stored as a one-dimension array.
|
hwloc_uint64_t *values; /**< \brief Matrix of distances between objects, stored as a one-dimension array.
|
||||||
*
|
*
|
||||||
@ -147,22 +151,65 @@ hwloc_distances_release(hwloc_topology_t topology, struct hwloc_distances_s *dis
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** \defgroup hwlocality_distances_consult Helpers for consulting distances structures
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \brief Find the index of an object in a distances structure.
|
||||||
|
*
|
||||||
|
* \return -1 if object \p obj is not involved in structure \p distances.
|
||||||
|
*/
|
||||||
|
static __hwloc_inline int
|
||||||
|
hwloc_distances_obj_index(struct hwloc_distances_s *distances, hwloc_obj_t obj)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for(i=0; i<distances->nbobjs; i++)
|
||||||
|
if (distances->objs[i] == obj)
|
||||||
|
return (int)i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Find the values between two objects in a distances structure.
|
||||||
|
*
|
||||||
|
* The distance from \p obj1 to \p obj2 is stored in the value pointed by
|
||||||
|
* \p value1to2 and reciprocally.
|
||||||
|
*
|
||||||
|
* \return -1 if object \p obj1 or \p obj2 is not involved in structure \p distances.
|
||||||
|
*/
|
||||||
|
static __hwloc_inline int
|
||||||
|
hwloc_distances_obj_pair_values(struct hwloc_distances_s *distances,
|
||||||
|
hwloc_obj_t obj1, hwloc_obj_t obj2,
|
||||||
|
hwloc_uint64_t *value1to2, hwloc_uint64_t *value2to1)
|
||||||
|
{
|
||||||
|
int i1 = hwloc_distances_obj_index(distances, obj1);
|
||||||
|
int i2 = hwloc_distances_obj_index(distances, obj2);
|
||||||
|
if (i1 < 0 || i2 < 0)
|
||||||
|
return -1;
|
||||||
|
*value1to2 = distances->values[i1 * distances->nbobjs + i2];
|
||||||
|
*value2to1 = distances->values[i2 * distances->nbobjs + i1];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_distances_add Add or remove distances between objects
|
/** \defgroup hwlocality_distances_add Add or remove distances between objects
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \brief Flags for adding a new distances to a topology. */
|
/** \brief Flags for adding a new distances to a topology. */
|
||||||
enum hwloc_distances_flag_e {
|
enum hwloc_distances_add_flag_e {
|
||||||
/** \brief Try to group objects based on the newly provided distance information.
|
/** \brief Try to group objects based on the newly provided distance information.
|
||||||
* \hideinitializer
|
* \hideinitializer
|
||||||
*/
|
*/
|
||||||
HWLOC_DISTANCES_FLAG_GROUP = (1UL<<0),
|
HWLOC_DISTANCES_ADD_FLAG_GROUP = (1UL<<0),
|
||||||
/** \brief If grouping, consider the distance values as inaccurate and relax the
|
/** \brief If grouping, consider the distance values as inaccurate and relax the
|
||||||
* comparisons during the grouping algorithms. The actual accuracy may be modified
|
* comparisons during the grouping algorithms. The actual accuracy may be modified
|
||||||
* through the HWLOC_GROUPING_ACCURACY environment variable (see \ref envvar).
|
* through the HWLOC_GROUPING_ACCURACY environment variable (see \ref envvar).
|
||||||
* \hideinitializer
|
* \hideinitializer
|
||||||
*/
|
*/
|
||||||
HWLOC_DISTANCES_FLAG_GROUP_INACCURATE = (1UL<<1)
|
HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE = (1UL<<1)
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \brief Provide a distance matrix.
|
/** \brief Provide a distance matrix.
|
||||||
@ -175,7 +222,7 @@ enum hwloc_distances_flag_e {
|
|||||||
* \p kind specifies the kind of distance as a OR'ed set of ::hwloc_distances_kind_e.
|
* \p kind specifies the kind of distance as a OR'ed set of ::hwloc_distances_kind_e.
|
||||||
*
|
*
|
||||||
* \p flags configures the behavior of the function using an optional OR'ed set of
|
* \p flags configures the behavior of the function using an optional OR'ed set of
|
||||||
* ::hwloc_distances_flag_e.
|
* ::hwloc_distances_add_flag_e.
|
||||||
*
|
*
|
||||||
* Objects must be of the same type. They cannot be of type Group.
|
* Objects must be of the same type. They cannot be of type Group.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2013-2016 Inria. All rights reserved.
|
* Copyright © 2013-2017 Inria. All rights reserved.
|
||||||
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
||||||
* See COPYING in top-level directory.
|
* See COPYING in top-level directory.
|
||||||
*/
|
*/
|
||||||
@ -440,7 +440,7 @@ hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_components_pci_funcs Components and Plugins: PCI functions to be used by components
|
/** \defgroup hwlocality_components_pcidisc Components and Plugins: helpers for PCI discovery
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -448,20 +448,20 @@ hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj)
|
|||||||
*
|
*
|
||||||
* This function requires a 256-bytes config space. Unknown/unavailable bytes should be set to 0xff.
|
* This function requires a 256-bytes config space. Unknown/unavailable bytes should be set to 0xff.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC unsigned hwloc_pci_find_cap(const unsigned char *config, unsigned cap);
|
HWLOC_DECLSPEC unsigned hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap);
|
||||||
|
|
||||||
/** \brief Fill linkspeed by reading the PCI config space where PCI_CAP_ID_EXP is at position offset.
|
/** \brief Fill linkspeed by reading the PCI config space where PCI_CAP_ID_EXP is at position offset.
|
||||||
*
|
*
|
||||||
* Needs 20 bytes of EXP capability block starting at offset in the config space
|
* Needs 20 bytes of EXP capability block starting at offset in the config space
|
||||||
* for registers up to link status.
|
* for registers up to link status.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_pci_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed);
|
HWLOC_DECLSPEC int hwloc_pcidisc_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed);
|
||||||
|
|
||||||
/** \brief Return the hwloc object type (PCI device or Bridge) for the given class and configuration space.
|
/** \brief Return the hwloc object type (PCI device or Bridge) for the given class and configuration space.
|
||||||
*
|
*
|
||||||
* This function requires 16 bytes of common configuration header at the beginning of config.
|
* This function requires 16 bytes of common configuration header at the beginning of config.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pci_check_bridge_type(unsigned device_class, const unsigned char *config);
|
HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config);
|
||||||
|
|
||||||
/** \brief Fills the attributes of the given PCI bridge using the given PCI config space.
|
/** \brief Fills the attributes of the given PCI bridge using the given PCI config space.
|
||||||
*
|
*
|
||||||
@ -469,38 +469,47 @@ HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pci_check_bridge_type(unsigned device_clas
|
|||||||
*
|
*
|
||||||
* Returns -1 and destroys /p obj if bridge fields are invalid.
|
* Returns -1 and destroys /p obj if bridge fields are invalid.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_pci_setup_bridge_attr(hwloc_obj_t obj, const unsigned char *config);
|
HWLOC_DECLSPEC int hwloc_pcidisc_setup_bridge_attr(hwloc_obj_t obj, const unsigned char *config);
|
||||||
|
|
||||||
/** \brief Insert a PCI object in the given PCI tree by looking at PCI bus IDs.
|
/** \brief Insert a PCI object in the given PCI tree by looking at PCI bus IDs.
|
||||||
*
|
*
|
||||||
* If \p treep points to \c NULL, the new object is inserted there.
|
* If \p treep points to \c NULL, the new object is inserted there.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC void hwloc_pci_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj);
|
HWLOC_DECLSPEC void hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj);
|
||||||
|
|
||||||
/** \brief Add some hostbridges on top of the given tree of PCI objects and attach them to the root of the topology.
|
/** \brief Add some hostbridges on top of the given tree of PCI objects and attach them to the topology.
|
||||||
*
|
*
|
||||||
* The core will move them to their actual PCI locality using hwloc_pci_belowroot_apply_locality()
|
* For now, they will be attached to the root object. The core will move them to their actual PCI
|
||||||
* at the end of the discovery.
|
* locality using hwloc_pci_belowroot_apply_locality() at the end of the discovery.
|
||||||
* In the meantime, other backends will easily lookup PCI objects (for instance to attach OS devices)
|
*
|
||||||
* by using hwloc_pci_belowroot_find_by_busid() or by manually looking at the topology root object
|
* In the meantime, other backends lookup PCI objects or localities (for instance to attach OS devices)
|
||||||
* io_first_child pointer.
|
* by using hwloc_pcidisc_find_by_busid() or hwloc_pcidisc_find_busid_parent().
|
||||||
|
*/
|
||||||
|
HWLOC_DECLSPEC int hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *tree);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** \defgroup hwlocality_components_pcifind Components and Plugins: finding PCI objects during other discoveries
|
||||||
|
* @{
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_pci_tree_attach_belowroot(struct hwloc_topology *topology, struct hwloc_obj *tree);
|
|
||||||
|
|
||||||
/** \brief Find the PCI object that matches the bus ID.
|
/** \brief Find the PCI object that matches the bus ID.
|
||||||
*
|
*
|
||||||
* To be used after a PCI backend added PCI devices with hwloc_pci_tree_attach_belowroot()
|
* To be used after a PCI backend added PCI devices with hwloc_pcidisc_tree_attach()
|
||||||
* and before the core moves them to their actual location with hwloc_pci_belowroot_apply_locality().
|
* and before the core moves them to their actual location with hwloc_pci_belowroot_apply_locality().
|
||||||
*
|
*
|
||||||
* If no exactly matching object is found, return the container bridge if any, or NULL.
|
* If no exactly matching object is found, return the container bridge if any, or NULL.
|
||||||
*
|
*
|
||||||
* On failure, it may be possible to find the PCI locality (instead of the PCI device)
|
* On failure, it may be possible to find the PCI locality (instead of the PCI device)
|
||||||
* by calling hwloc_pci_find_busid_parent().
|
* by calling hwloc_pcidisc_find_busid_parent().
|
||||||
*
|
*
|
||||||
* \note This is semantically identical to hwloc_get_pcidev_by_busid() which only works
|
* \note This is semantically identical to hwloc_get_pcidev_by_busid() which only works
|
||||||
* after the topology is fully loaded.
|
* after the topology is fully loaded.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_belowroot_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pcidisc_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
||||||
|
|
||||||
/** \brief Find the normal parent of a PCI bus ID.
|
/** \brief Find the normal parent of a PCI bus ID.
|
||||||
*
|
*
|
||||||
@ -508,11 +517,11 @@ HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_belowroot_find_by_busid(struct hwloc
|
|||||||
*
|
*
|
||||||
* This function should be used to attach an I/O device directly under a normal
|
* This function should be used to attach an I/O device directly under a normal
|
||||||
* (non-I/O) object, instead of below a PCI object.
|
* (non-I/O) object, instead of below a PCI object.
|
||||||
* It is usually used by backends when hwloc_pci_belowroot_find_by_busid() failed
|
* It is usually used by backends when hwloc_pcidisc_find_by_busid() failed
|
||||||
* to find the hwloc object corresponding to this bus ID, for instance because
|
* to find the hwloc object corresponding to this bus ID, for instance because
|
||||||
* PCI discovery is not supported on this platform.
|
* PCI discovery is not supported on this platform.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_busid_parent(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pcidisc_find_busid_parent(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
@ -376,10 +376,12 @@ extern "C" {
|
|||||||
#define hwloc_distances_get_by_depth HWLOC_NAME(distances_get_by_depth)
|
#define hwloc_distances_get_by_depth HWLOC_NAME(distances_get_by_depth)
|
||||||
#define hwloc_distances_get_by_type HWLOC_NAME(distances_get_by_type)
|
#define hwloc_distances_get_by_type HWLOC_NAME(distances_get_by_type)
|
||||||
#define hwloc_distances_release HWLOC_NAME(distances_release)
|
#define hwloc_distances_release HWLOC_NAME(distances_release)
|
||||||
|
#define hwloc_distances_obj_index HWLOC_NAME(distances_obj_index)
|
||||||
|
#define hwloc_distances_obj_pair_values HWLOC_NAME(distances_pair_values)
|
||||||
|
|
||||||
#define hwloc_distances_flag_e HWLOC_NAME(distances_flag_e)
|
#define hwloc_distances_add_flag_e HWLOC_NAME(distances_add_flag_e)
|
||||||
#define HWLOC_DISTANCES_FLAG_GROUP HWLOC_NAME_CAPS(DISTANCES_FLAG_GROUP)
|
#define HWLOC_DISTANCES_ADD_FLAG_GROUP HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP)
|
||||||
#define HWLOC_DISTANCES_FLAG_GROUP_INACCURATE HWLOC_NAME_CAPS(DISTANCES_FLAG_GROUP_INACCURATE)
|
#define HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP_INACCURATE)
|
||||||
|
|
||||||
#define hwloc_distances_add HWLOC_NAME(distances_add)
|
#define hwloc_distances_add HWLOC_NAME(distances_add)
|
||||||
#define hwloc_distances_remove HWLOC_NAME(distances_remove)
|
#define hwloc_distances_remove HWLOC_NAME(distances_remove)
|
||||||
@ -531,14 +533,15 @@ extern "C" {
|
|||||||
#define hwloc_filter_check_keep_object_type HWLOC_NAME(filter_check_keep_object_type)
|
#define hwloc_filter_check_keep_object_type HWLOC_NAME(filter_check_keep_object_type)
|
||||||
#define hwloc_filter_check_keep_object HWLOC_NAME(filter_check_keep_object)
|
#define hwloc_filter_check_keep_object HWLOC_NAME(filter_check_keep_object)
|
||||||
|
|
||||||
#define hwloc_pci_find_cap HWLOC_NAME(pci_find_cap)
|
#define hwloc_pcidisc_find_cap HWLOC_NAME(pcidisc_find_cap)
|
||||||
#define hwloc_pci_find_linkspeed HWLOC_NAME(pci_find_linkspeed)
|
#define hwloc_pcidisc_find_linkspeed HWLOC_NAME(pcidisc_find_linkspeed)
|
||||||
#define hwloc_pci_check_bridge_type HWLOC_NAME(pci_check_bridge_type)
|
#define hwloc_pcidisc_check_bridge_type HWLOC_NAME(pcidisc_check_bridge_type)
|
||||||
#define hwloc_pci_setup_bridge_attr HWLOC_NAME(pci_setup_bridge_attr)
|
#define hwloc_pcidisc_setup_bridge_attr HWLOC_NAME(pcidisc_setup_bridge_attr)
|
||||||
#define hwloc_pci_tree_insert_by_busid HWLOC_NAME(pci_tree_insert_by_busid)
|
#define hwloc_pcidisc_tree_insert_by_busid HWLOC_NAME(pcidisc_tree_insert_by_busid)
|
||||||
#define hwloc_pci_tree_attach_belowroot HWLOC_NAME(pci_tree_attach_belowroot)
|
#define hwloc_pcidisc_tree_attach HWLOC_NAME(pcidisc_tree_attach)
|
||||||
#define hwloc_pci_belowroot_find_by_busid HWLOC_NAME(pci_belowroot_find_by_busid)
|
|
||||||
#define hwloc_pci_find_busid_parent HWLOC_NAME(pci_find_busid_parent)
|
#define hwloc_pcidisc_find_by_busid HWLOC_NAME(pcidisc_find_by_busid)
|
||||||
|
#define hwloc_pcidisc_find_busid_parent HWLOC_NAME(pcidisc_find_busid_parent)
|
||||||
|
|
||||||
/* hwloc/deprecated.h */
|
/* hwloc/deprecated.h */
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@ extern "C" {
|
|||||||
|
|
||||||
/** \brief Get the required shared memory length for storing a topology.
|
/** \brief Get the required shared memory length for storing a topology.
|
||||||
*
|
*
|
||||||
* This length must be used in hwloc_shmem_topology_write() and
|
* This length (in bytes) must be used in hwloc_shmem_topology_write()
|
||||||
* hwloc_shmem_topology_adopt() later.
|
* and hwloc_shmem_topology_adopt() later.
|
||||||
*
|
*
|
||||||
* \note Flags \p flags are currently unused, must be 0.
|
* \note Flags \p flags are currently unused, must be 0.
|
||||||
*/
|
*/
|
||||||
@ -57,21 +57,27 @@ HWLOC_DECLSPEC int hwloc_shmem_topology_get_length(hwloc_topology_t topology,
|
|||||||
/** \brief Duplicate a topology to a shared memory file.
|
/** \brief Duplicate a topology to a shared memory file.
|
||||||
*
|
*
|
||||||
* Temporarily map a file in virtual memory and duplicate the
|
* Temporarily map a file in virtual memory and duplicate the
|
||||||
* topology \p topology by allocating duplicates there.
|
* topology \p topology by allocating duplicates in there.
|
||||||
*
|
*
|
||||||
* The segment of the file pointed by descriptor \p fd,
|
* The segment of the file pointed by descriptor \p fd,
|
||||||
* starting at offset \p fileoffset, and of length \p length,
|
* starting at offset \p fileoffset, and of length \p length (in bytes),
|
||||||
* will be temporarily mapped at virtual address \p mmap_address.
|
* will be temporarily mapped at virtual address \p mmap_address
|
||||||
|
* during the duplication.
|
||||||
*
|
*
|
||||||
* The mapping length \p length must have been previously obtained with
|
* The mapping length \p length must have been previously obtained with
|
||||||
* hwloc_shmem_topology_get_length()
|
* hwloc_shmem_topology_get_length()
|
||||||
* and the topology must not have been modified in the meantime.
|
* and the topology must not have been modified in the meantime.
|
||||||
*
|
*
|
||||||
* \return -1 with errno set to EBUSY is the requested memory mapping isn't available.
|
|
||||||
* \return -1 with errno set to EINVAL if fileoffset, mmap_address or length
|
|
||||||
* aren't page-aligned.
|
|
||||||
*
|
|
||||||
* \note Flags \p flags are currently unused, must be 0.
|
* \note Flags \p flags are currently unused, must be 0.
|
||||||
|
*
|
||||||
|
* \note The object userdata pointer is duplicated but the pointed buffer
|
||||||
|
* is not. However the caller may also allocate it manually in shared memory
|
||||||
|
* to share it as well.
|
||||||
|
*
|
||||||
|
* \return -1 with errno set to EBUSY if the virtual memory mapping defined
|
||||||
|
* by \p mmap_address and \p length isn't available in the process.
|
||||||
|
* \return -1 with errno set to EINVAL if \p fileoffset, \p mmap_address
|
||||||
|
* or \p length aren't page-aligned.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_shmem_topology_write(hwloc_topology_t topology,
|
HWLOC_DECLSPEC int hwloc_shmem_topology_write(hwloc_topology_t topology,
|
||||||
int fd, hwloc_uint64_t fileoffset,
|
int fd, hwloc_uint64_t fileoffset,
|
||||||
@ -86,19 +92,28 @@ HWLOC_DECLSPEC int hwloc_shmem_topology_write(hwloc_topology_t topology,
|
|||||||
* The returned adopted topology in \p topologyp can be used just like any
|
* The returned adopted topology in \p topologyp can be used just like any
|
||||||
* topology. And it must be destroyed with hwloc_topology_destroy() as usual.
|
* topology. And it must be destroyed with hwloc_topology_destroy() as usual.
|
||||||
*
|
*
|
||||||
|
* However the topology is read-only.
|
||||||
|
* For instance, it cannot be modified with hwloc_topology_restrict()
|
||||||
|
* and object userdata pointers cannot be changed.
|
||||||
|
*
|
||||||
* The segment of the file pointed by descriptor \p fd,
|
* The segment of the file pointed by descriptor \p fd,
|
||||||
* starting at offset \p fileoffset, and of length \p length,
|
* starting at offset \p fileoffset, and of length \p length (in bytes),
|
||||||
* will be mapped at virtual address \p mmap_address.
|
* will be mapped at virtual address \p mmap_address.
|
||||||
*
|
*
|
||||||
* The file pointed by descriptor \p fd, the offset \p fileoffset,
|
* The file pointed by descriptor \p fd, the offset \p fileoffset,
|
||||||
* the requested mapping virtual address \p mmap_address and the length \p length
|
* the requested mapping virtual address \p mmap_address and the length \p length
|
||||||
* must be identical to what was given to hwloc_shmem_topology_write() earlier.
|
* must be identical to what was given to hwloc_shmem_topology_write() earlier.
|
||||||
*
|
*
|
||||||
* \return -1 with errno set to EBUSY is the requested memory mapping isn't available.
|
|
||||||
* \return -1 with errno set to EINVAL if fileoffset, mmap_address or length
|
|
||||||
* aren't page-aligned.
|
|
||||||
*
|
|
||||||
* \note Flags \p flags are currently unused, must be 0.
|
* \note Flags \p flags are currently unused, must be 0.
|
||||||
|
*
|
||||||
|
* \note The object userdata pointer should not be used unless the process
|
||||||
|
* that created the shared topology also placed userdata-pointed buffers
|
||||||
|
* in shared memory.
|
||||||
|
*
|
||||||
|
* \return -1 with errno set to EBUSY if the virtual memory mapping defined
|
||||||
|
* by \p mmap_address and \p length isn't available in the process.
|
||||||
|
* \return -1 with errno set to EINVAL if \p fileoffset, \p mmap_address
|
||||||
|
* or \p length aren't page-aligned.
|
||||||
*/
|
*/
|
||||||
HWLOC_DECLSPEC int hwloc_shmem_topology_adopt(hwloc_topology_t *topologyp,
|
HWLOC_DECLSPEC int hwloc_shmem_topology_adopt(hwloc_topology_t *topologyp,
|
||||||
int fd, hwloc_uint64_t fileoffset,
|
int fd, hwloc_uint64_t fileoffset,
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright © 2015-2016 Inria. All rights reserved.
|
* Copyright © 2015-2016 Inria. All rights reserved.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2016 Inria. All rights reserved.
|
* Copyright © 2016 Inria. All rights reserved.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
*
|
*
|
||||||
* Copyright © 2009, 2011, 2012 CNRS, inria., Université Bordeaux All rights reserved.
|
* Copyright © 2009, 2011, 2012 CNRS, inria., Université Bordeaux All rights reserved.
|
||||||
* Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
* Copyright © 2009-2014 Cisco Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -231,6 +230,9 @@
|
|||||||
/* Define to 1 if you have the <memory.h> header file. */
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
#undef HAVE_MEMORY_H
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `mkstemp' function. */
|
||||||
|
#undef HAVE_MKSTEMP
|
||||||
|
|
||||||
/* Define to 1 if you have the <mpi.h> header file. */
|
/* Define to 1 if you have the <mpi.h> header file. */
|
||||||
#undef HAVE_MPI_H
|
#undef HAVE_MPI_H
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright © 2015-2017 Inria. All rights reserved.
|
* Copyright © 2015-2017 Inria. All rights reserved.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -134,6 +134,7 @@ struct hwloc_topology {
|
|||||||
*/
|
*/
|
||||||
unsigned long kind;
|
unsigned long kind;
|
||||||
|
|
||||||
|
/* objects are currently stored in physical_index order */
|
||||||
hwloc_obj_t *objs; /* array of objects */
|
hwloc_obj_t *objs; /* array of objects */
|
||||||
int objs_are_valid; /* set to 1 if the array objs is still valid, 0 if needs refresh */
|
int objs_are_valid; /* set to 1 if the array objs is still valid, 0 if needs refresh */
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright © 2009-2010 Oracle and/or its affiliates. All rights reserved.
|
* Copyright © 2009-2010 Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -5,7 +5,7 @@ includedir=${prefix}/include
|
|||||||
|
|
||||||
Name: netloc
|
Name: netloc
|
||||||
Description: Network locality detection and management library
|
Description: Network locality detection and management library
|
||||||
Version: master-201707200234-3db801d
|
Version: shmem-20170815.1857.git2478ce8
|
||||||
Cflags: -I${includedir}
|
Cflags: -I${includedir}
|
||||||
Libs: -L${libdir} -lnetloc -lhwloc
|
Libs: -L${libdir} -lnetloc -lhwloc
|
||||||
Libs.private:
|
Libs.private:
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user