00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00041 #ifndef TOPOLOGY_H
00042 #define TOPOLOGY_H
00043
00044 #include <sys/types.h>
00045 #include <stdio.h>
00046
00047
00048
00049
00050
00051
00052 #include <topology/cpuset.h>
00053
00054
00055
00060 struct topo_topology;
00065 typedef struct topo_topology * topo_topology_t;
00066
00071 struct topo_topology_info {
00073 unsigned depth;
00074
00076 int is_fake;
00077 };
00078
00079
00092 typedef enum {
00093 TOPO_OBJ_SYSTEM,
00098 TOPO_OBJ_MACHINE,
00102 TOPO_OBJ_NODE,
00106 TOPO_OBJ_SOCKET,
00110 TOPO_OBJ_CACHE,
00113 TOPO_OBJ_CORE,
00117 TOPO_OBJ_PROC,
00123 TOPO_OBJ_MISC,
00130 } topo_obj_type_t;
00132 #define TOPO_OBJ_TYPE_MAX (TOPO_OBJ_MISC+1)
00133
00144 int topo_get_type_order(topo_obj_type_t type);
00145
00150 topo_obj_type_t topo_get_order_type(int order);
00151
00152
00159 union topo_obj_attr_u;
00160
00165 struct topo_obj {
00166
00167 topo_obj_type_t type;
00168 signed os_index;
00171 union topo_obj_attr_u *attr;
00172
00173
00174 unsigned depth;
00175 unsigned logical_index;
00177 struct topo_obj *next_cousin;
00178 struct topo_obj *prev_cousin;
00180
00181 struct topo_obj *father;
00182 unsigned sibling_rank;
00183 struct topo_obj *next_sibling;
00184 struct topo_obj *prev_sibling;
00186
00187 unsigned arity;
00188 struct topo_obj **children;
00189 struct topo_obj *first_child;
00190 struct topo_obj *last_child;
00192
00193 void *userdata;
00195
00196 topo_cpuset_t cpuset;
00197 };
00198 typedef struct topo_obj * topo_obj_t;
00199
00201 union topo_obj_attr_u {
00203 struct topo_cache_attr_u {
00204 unsigned long memory_kB;
00205 unsigned depth;
00206 } cache;
00208 struct topo_memory_attr_u {
00209 unsigned long memory_kB;
00210 unsigned long huge_page_free;
00211 } node;
00213 struct topo_machine_attr_u {
00214 char *dmi_board_vendor;
00215 char *dmi_board_name;
00216 unsigned long memory_kB;
00217 unsigned long huge_page_free;
00218 unsigned long huge_page_size_kB;
00219 } machine;
00221 struct topo_machine_attr_u system;
00223 struct topo_misc_attr_u {
00224 unsigned depth;
00225 } misc;
00226 };
00227
00240 extern int topo_topology_init (topo_topology_t *topologyp);
00253 extern int topo_topology_load(topo_topology_t topology);
00258 extern void topo_topology_destroy (topo_topology_t topology);
00263 extern void topo_topology_check(topo_topology_t topology);
00264
00285 extern int topo_topology_ignore_type(topo_topology_t topology, topo_obj_type_t type);
00293 extern int topo_topology_ignore_type_keep_structure(topo_topology_t topology, topo_obj_type_t type);
00299 extern int topo_topology_ignore_all_keep_structure(topo_topology_t topology);
00304 enum topo_flags_e {
00305
00306
00307
00308
00309
00310 TOPO_FLAGS_WHOLE_SYSTEM = (1<<1),
00311 };
00316 extern int topo_topology_set_flags (topo_topology_t topology, unsigned long flags);
00324 extern int topo_topology_set_fsys_root(topo_topology_t __topo_restrict topology, const char * __topo_restrict fsys_root_path);
00333 extern int topo_topology_set_synthetic(topo_topology_t __topo_restrict topology, const char * __topo_restrict description);
00339 extern int topo_topology_set_xml(topo_topology_t __topo_restrict topology, const char * __topo_restrict xmlpath);
00340
00341
00354 extern int topo_topology_get_info(topo_topology_t __topo_restrict topology, struct topo_topology_info * __topo_restrict info);
00355
00365 extern unsigned topo_get_type_depth (topo_topology_t topology, topo_obj_type_t type);
00366 #define TOPO_TYPE_DEPTH_UNKNOWN -1
00367 #define TOPO_TYPE_DEPTH_MULTIPLE -2
00370 extern topo_obj_type_t topo_get_depth_type (topo_topology_t topology, unsigned depth);
00371
00373 extern unsigned topo_get_depth_nbobjs (topo_topology_t topology, unsigned depth);
00374
00383 extern topo_obj_t topo_get_obj_by_depth (topo_topology_t topology, unsigned depth, unsigned index);
00384
00392 extern const char * topo_obj_type_string (topo_obj_type_t type);
00393
00395 extern topo_obj_type_t topo_obj_type_of_string (const char * string);
00396
00400 extern int topo_obj_snprintf(char * __topo_restrict string, size_t size,
00401 topo_topology_t topology, topo_obj_t obj,
00402 const char * __topo_restrict indexprefix, int verbose);
00403
00407 extern int topo_obj_cpuset_snprintf(char * __topo_restrict str, size_t size, size_t nobj, const topo_obj_t * __topo_restrict objs);
00408
00455 typedef enum {
00456 TOPO_CPUBIND_PROCESS = (1<<0),
00458 TOPO_CPUBIND_THREAD = (1<<1),
00459 TOPO_CPUBIND_STRICT = (1<<2),
00465 } topo_cpubind_policy_t;
00466
00469 extern int topo_set_cpubind(topo_topology_t topology, const topo_cpuset_t *set,
00470 int policy);
00471
00479 extern int topo_set_proc_cpubind(topo_topology_t topology, topo_pid_t pid, const topo_cpuset_t *set, int policy);
00480
00488 #ifdef topo_thread_t
00489 extern int topo_set_thread_cpubind(topo_topology_t topology, topo_thread_t tid, const topo_cpuset_t *set, int policy);
00490 #endif
00491
00495
00496 #include <topology/helper.h>
00497
00498
00499 #endif