Hardware Locality (hwloc)  v2.0-20191027.0400.gite37e7d8
linux-libnuma.h
00001 /*
00002  * Copyright © 2009 CNRS
00003  * Copyright © 2009-2017 Inria.  All rights reserved.
00004  * Copyright © 2009-2010, 2012 Université Bordeaux
00005  * See COPYING in top-level directory.
00006  */
00007 
00015 #ifndef HWLOC_LINUX_LIBNUMA_H
00016 #define HWLOC_LINUX_LIBNUMA_H
00017 
00018 #include <hwloc.h>
00019 #include <numa.h>
00020 
00021 
00022 #ifdef __cplusplus
00023 extern "C" {
00024 #endif
00025 
00026 
00053 static __hwloc_inline int
00054 hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
00055                                     unsigned long *mask, unsigned long *maxnode)
00056 {
00057   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00058   unsigned long outmaxnode = -1;
00059   hwloc_obj_t node = NULL;
00060 
00061   /* round-up to the next ulong and clear all bytes */
00062   *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
00063   memset(mask, 0, *maxnode/8);
00064 
00065   while ((node = hwloc_get_next_obj_covering_cpuset_by_depth(topology, cpuset, depth, node)) != NULL) {
00066     if (node->os_index >= *maxnode)
00067       continue;
00068     mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
00069     if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
00070       outmaxnode = node->os_index;
00071   }
00072 
00073   *maxnode = outmaxnode+1;
00074   return 0;
00075 }
00076 
00087 static __hwloc_inline int
00088 hwloc_nodeset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset,
00089                                       unsigned long *mask, unsigned long *maxnode)
00090 {
00091   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00092   unsigned long outmaxnode = -1;
00093   hwloc_obj_t node = NULL;
00094 
00095   /* round-up to the next ulong and clear all bytes */
00096   *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
00097   memset(mask, 0, *maxnode/8);
00098 
00099   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) {
00100     if (node->os_index >= *maxnode)
00101       continue;
00102     if (!hwloc_bitmap_isset(nodeset, node->os_index))
00103       continue;
00104     mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
00105     if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
00106       outmaxnode = node->os_index;
00107   }
00108 
00109   *maxnode = outmaxnode+1;
00110   return 0;
00111 }
00112 
00122 static __hwloc_inline int
00123 hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00124                                       const unsigned long *mask, unsigned long maxnode)
00125 {
00126   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00127   hwloc_obj_t node = NULL;
00128   hwloc_bitmap_zero(cpuset);
00129   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00130     if (node->os_index < maxnode
00131         && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8)))))
00132       hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
00133   return 0;
00134 }
00135 
00145 static __hwloc_inline int
00146 hwloc_nodeset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
00147                                         const unsigned long *mask, unsigned long maxnode)
00148 {
00149   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00150   hwloc_obj_t node = NULL;
00151   hwloc_bitmap_zero(nodeset);
00152   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00153     if (node->os_index < maxnode
00154         && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8)))))
00155       hwloc_bitmap_set(nodeset, node->os_index);
00156   return 0;
00157 }
00158 
00188 static __hwloc_inline struct bitmask *
00189 hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset) __hwloc_attribute_malloc;
00190 static __hwloc_inline struct bitmask *
00191 hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset)
00192 {
00193   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00194   hwloc_obj_t node = NULL;
00195   struct bitmask *bitmask = numa_allocate_cpumask();
00196   if (!bitmask)
00197     return NULL;
00198   while ((node = hwloc_get_next_obj_covering_cpuset_by_depth(topology, cpuset, depth, node)) != NULL)
00199     if (node->attr->numanode.local_memory)
00200       numa_bitmask_setbit(bitmask, node->os_index);
00201   return bitmask;
00202 }
00203 
00213 static __hwloc_inline struct bitmask *
00214 hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset) __hwloc_attribute_malloc;
00215 static __hwloc_inline struct bitmask *
00216 hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset)
00217 {
00218   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00219   hwloc_obj_t node = NULL;
00220   struct bitmask *bitmask = numa_allocate_cpumask();
00221   if (!bitmask)
00222     return NULL;
00223   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00224     if (hwloc_bitmap_isset(nodeset, node->os_index) && node->attr->numanode.local_memory)
00225       numa_bitmask_setbit(bitmask, node->os_index);
00226   return bitmask;
00227 }
00228 
00234 static __hwloc_inline int
00235 hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00236                                         const struct bitmask *bitmask)
00237 {
00238   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00239   hwloc_obj_t node = NULL;
00240   hwloc_bitmap_zero(cpuset);
00241   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00242     if (numa_bitmask_isbitset(bitmask, node->os_index))
00243       hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
00244   return 0;
00245 }
00246 
00252 static __hwloc_inline int
00253 hwloc_nodeset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
00254                                          const struct bitmask *bitmask)
00255 {
00256   int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE);
00257   hwloc_obj_t node = NULL;
00258   hwloc_bitmap_zero(nodeset);
00259   while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00260     if (numa_bitmask_isbitset(bitmask, node->os_index))
00261       hwloc_bitmap_set(nodeset, node->os_index);
00262   return 0;
00263 }
00264 
00268 #ifdef __cplusplus
00269 } /* extern "C" */
00270 #endif
00271 
00272 
00273 #endif /* HWLOC_LINUX_NUMA_H */