00001
00002
00003
00004
00005
00013 #ifndef HWLOC_LINUX_LIBNUMA_H
00014 #define HWLOC_LINUX_LIBNUMA_H
00015
00016 #include <hwloc.h>
00017 #include <numa.h>
00018 #include <assert.h>
00019
00020
00036 static inline void
00037 hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00038 unsigned long *mask, unsigned long *maxnode)
00039 {
00040 unsigned long outmaxnode = -1;
00041 hwloc_obj_t node = NULL;
00042 unsigned nbnodes = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE);
00043 int i;
00044
00045 for(i=0; i<*maxnode/HWLOC_BITS_PER_LONG; i++)
00046 mask[i] = 0;
00047
00048 if (nbnodes) {
00049 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL) {
00050 if (node->os_index >= *maxnode)
00051 break;
00052 mask[node->os_index/HWLOC_BITS_PER_LONG] |= 1 << (node->os_index % HWLOC_BITS_PER_LONG);
00053 outmaxnode = node->os_index;
00054 }
00055
00056 } else {
00057
00058 if (!hwloc_cpuset_iszero(cpuset)) {
00059 mask[0] = 1;
00060 outmaxnode = 0;
00061 }
00062 }
00063
00064 *maxnode = outmaxnode+1;
00065 }
00066
00076 static inline hwloc_cpuset_t
00077 hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology,
00078 const unsigned long *mask, unsigned long maxnode)
00079 {
00080 hwloc_cpuset_t cpuset;
00081 hwloc_obj_t node;
00082 int depth;
00083 int i;
00084
00085 depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00086 assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
00087
00088 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
00089
00090 if (mask[0] & 1)
00091 cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
00092 else
00093 cpuset = hwloc_cpuset_alloc();
00094
00095 } else {
00096 cpuset = hwloc_cpuset_alloc();
00097 for(i=0; i<maxnode; i++)
00098 if (mask[i/HWLOC_BITS_PER_LONG] & (1 << (i% HWLOC_BITS_PER_LONG))) {
00099 node = hwloc_get_obj_by_depth(topology, depth, i);
00100 if (node)
00101 hwloc_cpuset_orset(cpuset, node->cpuset);
00102 }
00103 }
00104
00105 return cpuset;
00106 }
00107
00124 static inline struct bitmask *
00125 hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset)
00126 {
00127 struct bitmask *bitmask;
00128 hwloc_obj_t node = NULL;
00129 unsigned nbnodes = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE);
00130
00131 if (nbnodes) {
00132 bitmask = numa_bitmask_alloc(nbnodes);
00133 if (!bitmask)
00134 return NULL;
00135 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
00136 numa_bitmask_setbit(bitmask, node->os_index);
00137
00138 } else {
00139
00140 bitmask = numa_bitmask_alloc(1);
00141 if (!bitmask)
00142 return NULL;
00143 if (!hwloc_cpuset_iszero(cpuset))
00144 numa_bitmask_setbit(bitmask, 0);
00145 }
00146
00147 return bitmask;
00148 }
00149
00155 static inline hwloc_cpuset_t
00156 hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology,
00157 const struct bitmask *bitmask)
00158 {
00159 hwloc_cpuset_t cpuset;
00160 hwloc_obj_t node;
00161 int depth;
00162 int i;
00163
00164 depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00165 assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
00166
00167 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
00168
00169 if (numa_bitmask_isbitset(bitmask, 0))
00170 cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
00171 else
00172 cpuset = hwloc_cpuset_alloc();
00173
00174 } else {
00175 cpuset = hwloc_cpuset_alloc();
00176 for(i=0; i<NUMA_NUM_NODES; i++)
00177 if (numa_bitmask_isbitset(bitmask, i)) {
00178 node = hwloc_get_obj_by_depth(topology, depth, i);
00179 if (node)
00180 hwloc_cpuset_orset(cpuset, node->cpuset);
00181 }
00182 }
00183
00184 return cpuset;
00185 }
00186
00191 #ifdef NUMA_VERSION1_COMPATIBILITY
00192
00202 static inline void
00203 hwloc_cpuset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
00204 nodemask_t *nodemask)
00205 {
00206 hwloc_obj_t node = NULL;
00207 unsigned nbnodes = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE);
00208
00209 nodemask_zero(nodemask);
00210 if (nbnodes) {
00211 while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
00212 nodemask_set(nodemask, node->os_index);
00213
00214 } else {
00215
00216 if (!hwloc_cpuset_iszero(cpuset))
00217 nodemask_set(nodemask, 0);
00218 }
00219 }
00220
00226 static inline hwloc_cpuset_t
00227 hwloc_cpuset_from_linux_libnuma_nodemask(hwloc_topology_t topology,
00228 const nodemask_t *nodemask)
00229 {
00230 hwloc_cpuset_t cpuset;
00231 hwloc_obj_t node;
00232 int depth;
00233 int i;
00234
00235 depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
00236 assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
00237
00238 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
00239
00240 if (nodemask_isset(nodemask, 0))
00241 cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
00242 else
00243 cpuset = hwloc_cpuset_alloc();
00244
00245 } else {
00246 cpuset = hwloc_cpuset_alloc();
00247 for(i=0; i<NUMA_NUM_NODES; i++)
00248 if (nodemask_isset(nodemask, i)) {
00249 node = hwloc_get_obj_by_depth(topology, depth, i);
00250 if (node)
00251 hwloc_cpuset_orset(cpuset, node->cpuset);
00252 }
00253 }
00254
00255 return cpuset;
00256 }
00257
00259 #endif
00260
00261
00262 #endif