Hardware Locality (hwloc)
v2.0-20191027.0400.gite37e7d8
|
00001 /* 00002 * Copyright © 2013-2017 Inria. All rights reserved. 00003 * Copyright © 2016 Cisco Systems, Inc. All rights reserved. 00004 * See COPYING in top-level directory. 00005 */ 00006 00007 #ifndef HWLOC_PLUGINS_H 00008 #define HWLOC_PLUGINS_H 00009 00014 struct hwloc_backend; 00015 00016 #include <hwloc.h> 00017 #ifdef HWLOC_INSIDE_PLUGIN 00018 /* needed for hwloc_plugin_check_namespace() */ 00019 #include <ltdl.h> 00020 #endif 00021 00022 00023 00029 typedef enum hwloc_disc_component_type_e { 00032 HWLOC_DISC_COMPONENT_TYPE_CPU = (1<<0), 00033 00039 HWLOC_DISC_COMPONENT_TYPE_GLOBAL = (1<<1), 00040 00043 HWLOC_DISC_COMPONENT_TYPE_MISC = (1<<2) 00044 } hwloc_disc_component_type_t; 00045 00051 struct hwloc_disc_component { 00053 hwloc_disc_component_type_t type; 00054 00058 const char *name; 00059 00068 unsigned excludes; 00069 00073 struct hwloc_backend * (*instantiate)(struct hwloc_disc_component *component, const void *data1, const void *data2, const void *data3); 00074 00087 unsigned priority; 00088 00092 unsigned enabled_by_default; 00093 00098 struct hwloc_disc_component * next; 00099 }; 00100 00120 struct hwloc_backend { 00122 struct hwloc_disc_component * component; 00124 struct hwloc_topology * topology; 00126 int envvar_forced; 00128 struct hwloc_backend * next; 00129 00131 unsigned long flags; 00132 00136 int is_thissystem; 00137 00139 void * private_data; 00143 void (*disable)(struct hwloc_backend *backend); 00144 00150 int (*discover)(struct hwloc_backend *backend); 00151 00154 int (*get_pci_busid_cpuset)(struct hwloc_backend *backend, struct hwloc_pcidev_attr_s *busid, hwloc_bitmap_t cpuset); 00155 }; 00156 00160 HWLOC_DECLSPEC struct hwloc_backend * hwloc_backend_alloc(struct hwloc_disc_component *component); 00161 00163 HWLOC_DECLSPEC int hwloc_backend_enable(struct hwloc_topology *topology, struct hwloc_backend *backend); 00164 00175 typedef enum hwloc_component_type_e { 00177 HWLOC_COMPONENT_TYPE_DISC, 00178 00180 HWLOC_COMPONENT_TYPE_XML 00181 } hwloc_component_type_t; 00182 00188 struct hwloc_component { 00190 unsigned abi; 00191 00209 int (*init)(unsigned long flags); 00210 00222 void (*finalize)(unsigned long flags); 00223 00225 hwloc_component_type_t type; 00226 00228 unsigned long flags; 00229 00231 void * data; 00232 }; 00233 00267 HWLOC_DECLSPEC struct hwloc_obj *hwloc_insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj); 00268 00270 typedef void (*hwloc_report_error_t)(const char * msg, int line); 00272 HWLOC_DECLSPEC void hwloc_report_os_error(const char * msg, int line); 00274 HWLOC_DECLSPEC int hwloc_hide_errors(void); 00275 00282 HWLOC_DECLSPEC struct hwloc_obj *hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t root, hwloc_obj_t obj, hwloc_report_error_t report_error); 00283 00300 HWLOC_DECLSPEC void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj); 00301 00306 HWLOC_DECLSPEC hwloc_obj_t hwloc_alloc_setup_object(hwloc_topology_t topology, hwloc_obj_type_t type, unsigned os_index); 00307 00316 HWLOC_DECLSPEC int hwloc_obj_add_children_sets(hwloc_obj_t obj); 00317 00325 HWLOC_DECLSPEC int hwloc_topology_reconnect(hwloc_topology_t topology, unsigned long flags __hwloc_attribute_unused); 00326 00348 static __hwloc_inline int 00349 hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused) 00350 { 00351 #ifdef HWLOC_INSIDE_PLUGIN 00352 lt_dlhandle handle; 00353 void *sym; 00354 handle = lt_dlopen(NULL); 00355 if (!handle) 00356 /* cannot check, assume things will work */ 00357 return 0; 00358 sym = lt_dlsym(handle, symbol); 00359 lt_dlclose(handle); 00360 if (!sym) { 00361 static int verboseenv_checked = 0; 00362 static int verboseenv_value = 0; 00363 if (!verboseenv_checked) { 00364 const char *verboseenv = getenv("HWLOC_PLUGINS_VERBOSE"); 00365 verboseenv_value = verboseenv ? atoi(verboseenv) : 0; 00366 verboseenv_checked = 1; 00367 } 00368 if (verboseenv_value) 00369 fprintf(stderr, "Plugin `%s' disabling itself because it cannot find the `%s' core symbol.\n", 00370 pluginname, symbol); 00371 return -1; 00372 } 00373 #endif /* HWLOC_INSIDE_PLUGIN */ 00374 return 0; 00375 } 00376 00390 static __hwloc_inline int 00391 hwloc_filter_check_pcidev_subtype_important(unsigned classid) 00392 { 00393 unsigned baseclass = classid >> 8; 00394 return (baseclass == 0x03 /* PCI_BASE_CLASS_DISPLAY */ 00395 || baseclass == 0x02 /* PCI_BASE_CLASS_NETWORK */ 00396 || baseclass == 0x01 /* PCI_BASE_CLASS_STORAGE */ 00397 || baseclass == 0x0b /* PCI_BASE_CLASS_PROCESSOR */ 00398 || classid == 0x0c04 /* PCI_CLASS_SERIAL_FIBER */ 00399 || classid == 0x0c06 /* PCI_CLASS_SERIAL_INFINIBAND */ 00400 || baseclass == 0x12 /* Processing Accelerators */); 00401 } 00402 00407 static __hwloc_inline int 00408 hwloc_filter_check_osdev_subtype_important(hwloc_obj_osdev_type_t subtype) 00409 { 00410 return (subtype != HWLOC_OBJ_OSDEV_DMA); 00411 } 00412 00419 static __hwloc_inline int 00420 hwloc_filter_check_keep_object_type(hwloc_topology_t topology, hwloc_obj_type_t type) 00421 { 00422 enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; 00423 hwloc_topology_get_type_filter(topology, type, &filter); 00424 assert(filter != HWLOC_TYPE_FILTER_KEEP_IMPORTANT); /* IMPORTANT only used for I/O */ 00425 return filter == HWLOC_TYPE_FILTER_KEEP_NONE ? 0 : 1; 00426 } 00427 00432 static __hwloc_inline int 00433 hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj) 00434 { 00435 hwloc_obj_type_t type = obj->type; 00436 enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; 00437 hwloc_topology_get_type_filter(topology, type, &filter); 00438 if (filter == HWLOC_TYPE_FILTER_KEEP_NONE) 00439 return 0; 00440 if (filter == HWLOC_TYPE_FILTER_KEEP_IMPORTANT) { 00441 if (type == HWLOC_OBJ_PCI_DEVICE) 00442 return hwloc_filter_check_pcidev_subtype_important(obj->attr->pcidev.class_id); 00443 if (type == HWLOC_OBJ_OS_DEVICE) 00444 return hwloc_filter_check_osdev_subtype_important(obj->attr->osdev.type); 00445 } 00446 return 1; 00447 } 00448 00462 HWLOC_DECLSPEC unsigned hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap); 00463 00469 HWLOC_DECLSPEC int hwloc_pcidisc_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed); 00470 00475 HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config); 00476 00483 HWLOC_DECLSPEC int hwloc_pcidisc_setup_bridge_attr(hwloc_obj_t obj, const unsigned char *config); 00484 00489 HWLOC_DECLSPEC void hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj); 00490 00499 HWLOC_DECLSPEC int hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *tree); 00500 00523 HWLOC_DECLSPEC struct hwloc_obj * hwloc_pcidisc_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func); 00524 00535 HWLOC_DECLSPEC struct hwloc_obj * hwloc_pcidisc_find_busid_parent(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func); 00536 00542 #endif /* HWLOC_PLUGINS_H */