00001
00002
00003
00004
00005
00006
00007
00024 #ifndef HWLOC_LINUX_LIBNUMA_H
00025 #define HWLOC_LINUX_LIBNUMA_H
00026
00027 #include <hwloc.h>
00028 #include <numa.h>
00029
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00035
00051 static __hwloc_inline int
00052 hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
00053 unsigned long *mask, unsigned long *maxnode)
00054 {
00055 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00056 unsigned long outmaxnode = -1;
00057
00058
00059 *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
00060 memset(mask, 0, *maxnode/8);
00061
00062 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00063 hwloc_obj_t node = NULL;
00064 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL) {
00065 if (node->os_index >= *maxnode)
00066 continue;
00067 mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
00068 if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
00069 outmaxnode = node->os_index;
00070 }
00071
00072 } else {
00073
00074 if (!hwloc_bitmap_iszero(cpuset)) {
00075 mask[0] = 1;
00076 outmaxnode = 0;
00077 }
00078 }
00079
00080 *maxnode = outmaxnode+1;
00081 return 0;
00082 }
00083
00094 static __hwloc_inline int
00095 hwloc_nodeset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset,
00096 unsigned long *mask, unsigned long *maxnode)
00097 {
00098 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00099 unsigned long outmaxnode = -1;
00100
00101
00102 *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
00103 memset(mask, 0, *maxnode/8);
00104
00105 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00106 hwloc_obj_t node = NULL;
00107 while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL) {
00108 if (node->os_index >= *maxnode)
00109 continue;
00110 if (!hwloc_bitmap_isset(nodeset, node->os_index))
00111 continue;
00112 mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
00113 if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
00114 outmaxnode = node->os_index;
00115 }
00116
00117 } else {
00118
00119 if (!hwloc_bitmap_iszero(nodeset)) {
00120 mask[0] = 1;
00121 outmaxnode = 0;
00122 }
00123 }
00124
00125 *maxnode = outmaxnode+1;
00126 return 0;
00127 }
00128
00138 static __hwloc_inline int
00139 hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00140 const unsigned long *mask, unsigned long maxnode)
00141 {
00142 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00143
00144 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00145 hwloc_obj_t node = NULL;
00146 hwloc_bitmap_zero(cpuset);
00147 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00148 if (node->os_index < maxnode
00149 && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8)))))
00150 hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
00151 } else {
00152
00153 if (mask[0] & 1)
00154 hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
00155 else
00156 hwloc_bitmap_zero(cpuset);
00157 }
00158
00159 return 0;
00160 }
00161
00171 static __hwloc_inline int
00172 hwloc_nodeset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
00173 const unsigned long *mask, unsigned long maxnode)
00174 {
00175 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00176
00177 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00178 hwloc_obj_t node = NULL;
00179 hwloc_bitmap_zero(nodeset);
00180 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00181 if (node->os_index < maxnode
00182 && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8)))))
00183 hwloc_bitmap_set(nodeset, node->os_index);
00184 } else {
00185
00186 if (mask[0] & 1)
00187 hwloc_bitmap_fill(nodeset);
00188 else
00189 hwloc_bitmap_zero(nodeset);
00190 }
00191
00192 return 0;
00193 }
00194
00213 static __hwloc_inline struct bitmask *
00214 hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset) __hwloc_attribute_malloc;
00215 static __hwloc_inline struct bitmask *
00216 hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset)
00217 {
00218 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00219 struct bitmask *bitmask = numa_allocate_cpumask();
00220 if (!bitmask)
00221 return NULL;
00222
00223 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00224 hwloc_obj_t node = NULL;
00225 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
00226 if (node->memory.local_memory)
00227 numa_bitmask_setbit(bitmask, node->os_index);
00228 } else {
00229
00230 if (!hwloc_bitmap_iszero(cpuset))
00231 numa_bitmask_setbit(bitmask, 0);
00232 }
00233
00234 return bitmask;
00235 }
00236
00246 static __hwloc_inline struct bitmask *
00247 hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset) __hwloc_attribute_malloc;
00248 static __hwloc_inline struct bitmask *
00249 hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset)
00250 {
00251 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00252 struct bitmask *bitmask = numa_allocate_cpumask();
00253 if (!bitmask)
00254 return NULL;
00255
00256 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00257 hwloc_obj_t node = NULL;
00258 while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL)
00259 if (hwloc_bitmap_isset(nodeset, node->os_index) && node->memory.local_memory)
00260 numa_bitmask_setbit(bitmask, node->os_index);
00261 } else {
00262
00263 if (!hwloc_bitmap_iszero(nodeset))
00264 numa_bitmask_setbit(bitmask, 0);
00265 }
00266
00267 return bitmask;
00268 }
00269
00275 static __hwloc_inline int
00276 hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00277 const struct bitmask *bitmask)
00278 {
00279 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00280
00281 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00282 hwloc_obj_t node = NULL;
00283 hwloc_bitmap_zero(cpuset);
00284 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00285 if (numa_bitmask_isbitset(bitmask, node->os_index))
00286 hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
00287 } else {
00288
00289 if (numa_bitmask_isbitset(bitmask, 0))
00290 hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
00291 else
00292 hwloc_bitmap_zero(cpuset);
00293 }
00294
00295 return 0;
00296 }
00297
00303 static __hwloc_inline int
00304 hwloc_nodeset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
00305 const struct bitmask *bitmask)
00306 {
00307 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00308
00309 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00310 hwloc_obj_t node = NULL;
00311 hwloc_bitmap_zero(nodeset);
00312 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00313 if (numa_bitmask_isbitset(bitmask, node->os_index))
00314 hwloc_bitmap_set(nodeset, node->os_index);
00315 } else {
00316
00317 if (numa_bitmask_isbitset(bitmask, 0))
00318 hwloc_bitmap_fill(nodeset);
00319 else
00320 hwloc_bitmap_zero(nodeset);
00321 }
00322
00323 return 0;
00324 }
00325
00330 #ifdef NUMA_VERSION1_COMPATIBILITY
00331
00347 static __hwloc_inline int
00348 hwloc_cpuset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
00349 nodemask_t *nodemask)
00350 {
00351 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00352
00353 nodemask_zero(nodemask);
00354
00355 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00356 hwloc_obj_t node = NULL;
00357 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
00358 nodemask_set(nodemask, node->os_index);
00359 } else {
00360
00361 if (!hwloc_bitmap_iszero(cpuset))
00362 nodemask_set(nodemask, 0);
00363 }
00364
00365 return 0;
00366 }
00367
00373 static __hwloc_inline int
00374 hwloc_nodeset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset,
00375 nodemask_t *nodemask)
00376 {
00377 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00378
00379 nodemask_zero(nodemask);
00380
00381 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00382 hwloc_obj_t node = NULL;
00383 while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL)
00384 if (hwloc_bitmap_isset(nodeset, node->os_index))
00385 nodemask_set(nodemask, node->os_index);
00386 } else {
00387
00388 if (!hwloc_bitmap_iszero(nodeset))
00389 nodemask_set(nodemask, 0);
00390 }
00391
00392 return 0;
00393 }
00394
00400 static __hwloc_inline int
00401 hwloc_cpuset_from_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00402 const nodemask_t *nodemask)
00403 {
00404 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00405
00406 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00407 hwloc_obj_t node = NULL;
00408 hwloc_bitmap_zero(cpuset);
00409 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00410 if (nodemask_isset(nodemask, node->os_index))
00411 hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
00412 } else {
00413
00414 if (nodemask_isset(nodemask, 0))
00415 hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
00416 else
00417 hwloc_bitmap_zero(cpuset);
00418 }
00419
00420 return 0;
00421 }
00422
00428 static __hwloc_inline int
00429 hwloc_nodeset_from_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
00430 const nodemask_t *nodemask)
00431 {
00432 int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00433
00434 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
00435 hwloc_obj_t node = NULL;
00436 hwloc_bitmap_zero(nodeset);
00437 while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL)
00438 if (nodemask_isset(nodemask, node->os_index))
00439 hwloc_bitmap_set(nodeset, node->os_index);
00440 } else {
00441
00442 if (nodemask_isset(nodemask, 0))
00443 hwloc_bitmap_fill(nodeset);
00444 else
00445 hwloc_bitmap_zero(nodeset);
00446 }
00447
00448 return 0;
00449 }
00450
00452 #endif
00453
00454
00455 #ifdef __cplusplus
00456 }
00457 #endif
00458
00459
00460 #endif