diff --git a/ompi/mca/mtl/ofi/mtl_ofi_component.c b/ompi/mca/mtl/ofi/mtl_ofi_component.c index 42abfff721..2c62e9ffec 100644 --- a/ompi/mca/mtl/ofi/mtl_ofi_component.c +++ b/ompi/mca/mtl/ofi/mtl_ofi_component.c @@ -306,26 +306,6 @@ ompi_mtl_ofi_progress_no_inline(void) return ompi_mtl_ofi_progress(); } -static int -is_in_list(char **list, char *item) -{ - int i = 0; - - if ((NULL == list) || (NULL == item)) { - return 0; - } - - while (NULL != list[i]) { - if (0 == strncasecmp(item, list[i], strlen(list[i]))) { - return 1; - } else { - i++; - } - } - - return 0; -} - static struct fi_info* select_ofi_provider(struct fi_info *providers, char **include_list, char **exclude_list) @@ -334,7 +314,7 @@ select_ofi_provider(struct fi_info *providers, if (NULL != include_list) { while ((NULL != prov) && - (!is_in_list(include_list, prov->fabric_attr->prov_name))) { + (!opal_common_ofi_is_in_list(include_list, prov->fabric_attr->prov_name))) { opal_output_verbose(1, opal_common_ofi.output, "%s:%d: mtl:ofi: \"%s\" not in include list\n", __FILE__, __LINE__, @@ -343,7 +323,7 @@ select_ofi_provider(struct fi_info *providers, } } else if (NULL != exclude_list) { while ((NULL != prov) && - (is_in_list(exclude_list, prov->fabric_attr->prov_name))) { + (opal_common_ofi_is_in_list(exclude_list, prov->fabric_attr->prov_name))) { opal_output_verbose(1, opal_common_ofi.output, "%s:%d: mtl:ofi: \"%s\" in exclude list\n", __FILE__, __LINE__, @@ -733,8 +713,8 @@ ompi_mtl_ofi_component_init(bool enable_progress_threads, * this logic if the user specifies an include list without EFA or adds EFA * to the exclude list. */ - if ((include_list && is_in_list(include_list, "efa")) || - (exclude_list && !is_in_list(exclude_list, "efa"))) { + if ((include_list && opal_common_ofi_is_in_list(include_list, "efa")) || + (exclude_list && !opal_common_ofi_is_in_list(exclude_list, "efa"))) { hints_dup = fi_dupinfo(hints); hints_dup->caps &= ~(FI_LOCAL_COMM | FI_REMOTE_COMM); hints_dup->fabric_attr->prov_name = strdup("efa"); diff --git a/opal/mca/btl/ofi/btl_ofi_component.c b/opal/mca/btl/ofi/btl_ofi_component.c index c4efa5e167..d7061be1f2 100644 --- a/opal/mca/btl/ofi/btl_ofi_component.c +++ b/opal/mca/btl/ofi/btl_ofi_component.c @@ -53,10 +53,25 @@ static int mca_btl_ofi_init_device(struct fi_info *info); /* validate information returned from fi_getinfo(). * return OPAL_ERROR if we dont have what we need. */ -static int validate_info(struct fi_info *info, uint64_t required_caps) +static int validate_info(struct fi_info *info, uint64_t required_caps, + char **include_list, char **exclude_list) { int mr_mode; + if (NULL != include_list && !opal_common_ofi_is_in_list(include_list, info->fabric_attr->prov_name)) { + opal_output_verbose(1, opal_common_ofi.output, + "%s:%d: btl:ofi: \"%s\" not in include list\n", + __FILE__, __LINE__, + info->fabric_attr->prov_name); + return OPAL_ERROR; + } else if (NULL != exclude_list && opal_common_ofi_is_in_list(exclude_list, info->fabric_attr->prov_name)) { + opal_output_verbose(1, opal_common_ofi.output, + "%s:%d: btl:ofi: \"%s\" in exclude list\n", + __FILE__, __LINE__, + info->fabric_attr->prov_name); + return OPAL_ERROR; + } + BTL_VERBOSE(("validating device: %s", info->domain_attr->name)); /* we need exactly all the required bits */ @@ -219,7 +234,7 @@ static mca_btl_base_module_t **mca_btl_ofi_component_init (int *num_btl_modules, uint64_t progress_mode; unsigned resource_count = 0; struct mca_btl_base_module_t **base_modules; - char **include_list = NULL; + char **include_list = NULL, **exclude_list = NULL; BTL_VERBOSE(("initializing ofi btl")); @@ -264,10 +279,18 @@ static mca_btl_base_module_t **mca_btl_ofi_component_init (int *num_btl_modules, } fabric_attr.prov_name = NULL; - /* Select the provider - sort of. we just take first element in list for now */ + + opal_output_verbose(1, opal_common_ofi.output, + "%s:%d: btl:ofi:provider_include = \"%s\"\n", + __FILE__, __LINE__, *opal_common_ofi.prov_include); + opal_output_verbose(1, opal_common_ofi.output, + "%s:%d: btl:ofi:provider_exclude = \"%s\"\n", + __FILE__, __LINE__, *opal_common_ofi.prov_exclude); + if (NULL != *opal_common_ofi.prov_include) { include_list = opal_argv_split(*opal_common_ofi.prov_include, ','); - fabric_attr.prov_name = include_list[0]; + } else if (NULL != *opal_common_ofi.prov_exclude) { + exclude_list = opal_argv_split(*opal_common_ofi.prov_exclude, ','); } domain_attr.mr_mode = MCA_BTL_OFI_REQUESTED_MR_MODE; @@ -331,7 +354,7 @@ static mca_btl_base_module_t **mca_btl_ofi_component_init (int *num_btl_modules, info = info_list; while(info) { - rc = validate_info(info, required_caps); + rc = validate_info(info, required_caps, include_list, exclude_list); if (OPAL_SUCCESS == rc) { /* Device passed sanity check, let's make a module. * diff --git a/opal/mca/common/ofi/common_ofi.c b/opal/mca/common/ofi/common_ofi.c index e0b5c04dd6..314e2b16af 100644 --- a/opal/mca/common/ofi/common_ofi.c +++ b/opal/mca/common/ofi/common_ofi.c @@ -33,6 +33,25 @@ OPAL_DECLSPEC opal_common_ofi_module_t opal_common_ofi = { static const char default_prov_exclude_list[] = "shm,sockets,tcp,udp,rstream"; +OPAL_DECLSPEC int opal_common_ofi_is_in_list(char **list, char *item) +{ + int i = 0; + + if ((NULL == list) || (NULL == item)) { + return 0; + } + + while (NULL != list[i]) { + if (0 == strncasecmp(item, list[i], strlen(list[i]))) { + return 1; + } else { + i++; + } + } + + return 0; +} + OPAL_DECLSPEC int opal_common_ofi_register_mca_variables(const mca_base_component_t *component) { static int registered = 0; diff --git a/opal/mca/common/ofi/common_ofi.h b/opal/mca/common/ofi/common_ofi.h index 2745515dc6..06ac691132 100644 --- a/opal/mca/common/ofi/common_ofi.h +++ b/opal/mca/common/ofi/common_ofi.h @@ -38,6 +38,21 @@ OPAL_DECLSPEC void opal_common_ofi_mca_register(void); OPAL_DECLSPEC void opal_common_ofi_mca_deregister(void); OPAL_DECLSPEC struct fi_info* opal_common_ofi_select_ofi_provider(struct fi_info *providers, char *framework_name); +/* + * @param list (IN) List of strings corresponding to lower providers. + * @param item (IN) Single string corresponding to a provider. + * + * @return 0 The lower provider of the item string is not in + * list or an input was NULL + * @return 1 The lower provider of the item string matches + * a string in the item list. + * + * This function will take a provider name string and a list of lower + * provider name strings as inputs. It will return true if the lower + * provider in the item string matches a lower provider in the list. + * + */ +OPAL_DECLSPEC int opal_common_ofi_is_in_list(char **list, char *item); END_C_DECLS