Hardware Locality (hwloc)
v2.2-20200401.0300.gitd2f52ab
|
00001 /* 00002 * Copyright © 2013-2020 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 00018 #ifdef HWLOC_INSIDE_PLUGIN 00019 /* needed for hwloc_plugin_check_namespace() */ 00020 #ifdef HWLOC_HAVE_LTDL 00021 #include <ltdl.h> 00022 #else 00023 #include <dlfcn.h> 00024 #endif 00025 #endif 00026 00027 00028 00038 struct hwloc_disc_component { 00042 const char *name; 00043 00047 unsigned phases; 00048 00057 unsigned excluded_phases; 00058 00062 struct hwloc_backend * (*instantiate)(struct hwloc_topology *topology, struct hwloc_disc_component *component, unsigned excluded_phases, const void *data1, const void *data2, const void *data3); 00063 00076 unsigned priority; 00077 00081 unsigned enabled_by_default; 00082 00087 struct hwloc_disc_component * next; 00088 }; 00089 00100 typedef enum hwloc_disc_phase_e { 00105 HWLOC_DISC_PHASE_GLOBAL = (1U<<0), 00106 00109 HWLOC_DISC_PHASE_CPU = (1U<<1), 00110 00113 HWLOC_DISC_PHASE_MEMORY = (1U<<2), 00114 00117 HWLOC_DISC_PHASE_PCI = (1U<<3), 00118 00121 HWLOC_DISC_PHASE_IO = (1U<<4), 00122 00125 HWLOC_DISC_PHASE_MISC = (1U<<5), 00126 00129 HWLOC_DISC_PHASE_ANNOTATE = (1U<<6), 00130 00136 HWLOC_DISC_PHASE_TWEAK = (1U<<7) 00137 } hwloc_disc_phase_t; 00138 00140 enum hwloc_disc_status_flag_e { 00142 HWLOC_DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES = (1UL<<1) 00143 }; 00144 00150 struct hwloc_disc_status { 00154 hwloc_disc_phase_t phase; 00155 00159 unsigned excluded_phases; 00160 00162 unsigned long flags; 00163 }; 00164 00183 struct hwloc_backend { 00185 struct hwloc_disc_component * component; 00187 struct hwloc_topology * topology; 00189 int envvar_forced; 00191 struct hwloc_backend * next; 00192 00196 unsigned phases; 00197 00199 unsigned long flags; 00200 00207 int is_thissystem; 00208 00210 void * private_data; 00214 void (*disable)(struct hwloc_backend *backend); 00215 00221 int (*discover)(struct hwloc_backend *backend, struct hwloc_disc_status *status); 00222 00227 int (*get_pci_busid_cpuset)(struct hwloc_backend *backend, struct hwloc_pcidev_attr_s *busid, hwloc_bitmap_t cpuset); 00228 }; 00229 00233 HWLOC_DECLSPEC struct hwloc_backend * hwloc_backend_alloc(struct hwloc_topology *topology, struct hwloc_disc_component *component); 00234 00236 HWLOC_DECLSPEC int hwloc_backend_enable(struct hwloc_backend *backend); 00237 00248 typedef enum hwloc_component_type_e { 00250 HWLOC_COMPONENT_TYPE_DISC, 00251 00253 HWLOC_COMPONENT_TYPE_XML 00254 } hwloc_component_type_t; 00255 00261 struct hwloc_component { 00263 unsigned abi; 00264 00282 int (*init)(unsigned long flags); 00283 00295 void (*finalize)(unsigned long flags); 00296 00298 hwloc_component_type_t type; 00299 00301 unsigned long flags; 00302 00304 void * data; 00305 }; 00306 00340 HWLOC_DECLSPEC struct hwloc_obj *hwloc_insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj); 00341 00343 typedef void (*hwloc_report_error_t)(const char * msg, int line); 00345 HWLOC_DECLSPEC void hwloc_report_os_error(const char * msg, int line); 00347 HWLOC_DECLSPEC int hwloc_hide_errors(void); 00348 00355 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); 00356 00373 HWLOC_DECLSPEC void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj); 00374 00379 HWLOC_DECLSPEC hwloc_obj_t hwloc_alloc_setup_object(hwloc_topology_t topology, hwloc_obj_type_t type, unsigned os_index); 00380 00389 HWLOC_DECLSPEC int hwloc_obj_add_children_sets(hwloc_obj_t obj); 00390 00398 HWLOC_DECLSPEC int hwloc_topology_reconnect(hwloc_topology_t topology, unsigned long flags __hwloc_attribute_unused); 00399 00421 static __hwloc_inline int 00422 hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused) 00423 { 00424 #ifdef HWLOC_INSIDE_PLUGIN 00425 void *sym; 00426 #ifdef HWLOC_HAVE_LTDL 00427 lt_dlhandle handle = lt_dlopen(NULL); 00428 #else 00429 void *handle = dlopen(NULL, RTLD_NOW|RTLD_LOCAL); 00430 #endif 00431 if (!handle) 00432 /* cannot check, assume things will work */ 00433 return 0; 00434 #ifdef HWLOC_HAVE_LTDL 00435 sym = lt_dlsym(handle, symbol); 00436 lt_dlclose(handle); 00437 #else 00438 sym = dlsym(handle, symbol); 00439 dlclose(handle); 00440 #endif 00441 if (!sym) { 00442 static int verboseenv_checked = 0; 00443 static int verboseenv_value = 0; 00444 if (!verboseenv_checked) { 00445 const char *verboseenv = getenv("HWLOC_PLUGINS_VERBOSE"); 00446 verboseenv_value = verboseenv ? atoi(verboseenv) : 0; 00447 verboseenv_checked = 1; 00448 } 00449 if (verboseenv_value) 00450 fprintf(stderr, "Plugin `%s' disabling itself because it cannot find the `%s' core symbol.\n", 00451 pluginname, symbol); 00452 return -1; 00453 } 00454 #endif /* HWLOC_INSIDE_PLUGIN */ 00455 return 0; 00456 } 00457 00471 static __hwloc_inline int 00472 hwloc_filter_check_pcidev_subtype_important(unsigned classid) 00473 { 00474 unsigned baseclass = classid >> 8; 00475 return (baseclass == 0x03 /* PCI_BASE_CLASS_DISPLAY */ 00476 || baseclass == 0x02 /* PCI_BASE_CLASS_NETWORK */ 00477 || baseclass == 0x01 /* PCI_BASE_CLASS_STORAGE */ 00478 || baseclass == 0x0b /* PCI_BASE_CLASS_PROCESSOR */ 00479 || classid == 0x0c04 /* PCI_CLASS_SERIAL_FIBER */ 00480 || classid == 0x0c06 /* PCI_CLASS_SERIAL_INFINIBAND */ 00481 || baseclass == 0x12 /* Processing Accelerators */); 00482 } 00483 00488 static __hwloc_inline int 00489 hwloc_filter_check_osdev_subtype_important(hwloc_obj_osdev_type_t subtype) 00490 { 00491 return (subtype != HWLOC_OBJ_OSDEV_DMA); 00492 } 00493 00500 static __hwloc_inline int 00501 hwloc_filter_check_keep_object_type(hwloc_topology_t topology, hwloc_obj_type_t type) 00502 { 00503 enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; 00504 hwloc_topology_get_type_filter(topology, type, &filter); 00505 assert(filter != HWLOC_TYPE_FILTER_KEEP_IMPORTANT); /* IMPORTANT only used for I/O */ 00506 return filter == HWLOC_TYPE_FILTER_KEEP_NONE ? 0 : 1; 00507 } 00508 00513 static __hwloc_inline int 00514 hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj) 00515 { 00516 hwloc_obj_type_t type = obj->type; 00517 enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; 00518 hwloc_topology_get_type_filter(topology, type, &filter); 00519 if (filter == HWLOC_TYPE_FILTER_KEEP_NONE) 00520 return 0; 00521 if (filter == HWLOC_TYPE_FILTER_KEEP_IMPORTANT) { 00522 if (type == HWLOC_OBJ_PCI_DEVICE) 00523 return hwloc_filter_check_pcidev_subtype_important(obj->attr->pcidev.class_id); 00524 if (type == HWLOC_OBJ_OS_DEVICE) 00525 return hwloc_filter_check_osdev_subtype_important(obj->attr->osdev.type); 00526 } 00527 return 1; 00528 } 00529 00543 HWLOC_DECLSPEC unsigned hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap); 00544 00550 HWLOC_DECLSPEC int hwloc_pcidisc_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed); 00551 00556 HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config); 00557 00564 HWLOC_DECLSPEC int hwloc_pcidisc_find_bridge_buses(unsigned domain, unsigned bus, unsigned dev, unsigned func, 00565 unsigned *secondary_busp, unsigned *subordinate_busp, 00566 const unsigned char *config); 00567 00572 HWLOC_DECLSPEC void hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj); 00573 00579 HWLOC_DECLSPEC int hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *tree); 00580 00597 HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_parent_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func); 00598 00604 #endif /* HWLOC_PLUGINS_H */