static int fi_ibv_check_hints(uint32_t version, const struct fi_info *hints, const struct fi_info *info) { int ret; uint64_t prov_mode; if (hints->caps & ~(info->caps)) { VERBS_INFO(FI_LOG_CORE, "Unsupported capabilities\n"); FI_INFO_CHECK(&fi_ibv_prov, info, hints, caps, FI_TYPE_CAPS); return -FI_ENODATA; } prov_mode = ofi_mr_get_prov_mode(version, hints, info); if ((hints->mode & prov_mode) != prov_mode) { VERBS_INFO(FI_LOG_CORE, "needed mode not set\n"); FI_INFO_MODE(&fi_ibv_prov, prov_mode, hints->mode); return -FI_ENODATA; } if (hints->fabric_attr) { ret = ofi_check_fabric_attr(&fi_ibv_prov, info->fabric_attr, hints->fabric_attr); if (ret) return ret; } if (hints->domain_attr) { ret = ofi_check_domain_attr(&fi_ibv_prov, version, info->domain_attr, hints->domain_attr); if (ret) return ret; } if (hints->ep_attr) { ret = fi_ibv_check_ep_attr(hints->ep_attr, info); if (ret) return ret; } if (hints->rx_attr) { ret = fi_ibv_check_rx_attr(hints->rx_attr, hints, info); if (ret) return ret; } if (hints->tx_attr) { ret = fi_ibv_check_tx_attr(hints->tx_attr, hints, info); if (ret) return ret; } return 0; }
static int efa_check_hints(uint32_t version, const struct fi_info *hints, const struct fi_info *info) { uint64_t prov_mode; size_t size; int ret; if (hints->caps & ~(info->caps)) { EFA_INFO(FI_LOG_CORE, "Unsupported capabilities\n"); FI_INFO_CHECK(&efa_prov, info, hints, caps, FI_TYPE_CAPS); return -FI_ENODATA; } prov_mode = ofi_mr_get_prov_mode(version, hints, info); if ((hints->mode & prov_mode) != prov_mode) { EFA_INFO(FI_LOG_CORE, "Required hints mode bits not set\n"); FI_INFO_MODE(&efa_prov, prov_mode, hints->mode); return -FI_ENODATA; } if (hints->fabric_attr) { ret = ofi_check_fabric_attr(&efa_prov, info->fabric_attr, hints->fabric_attr); if (ret) return ret; } switch (hints->addr_format) { case FI_FORMAT_UNSPEC: case FI_ADDR_EFA: size = EFA_EP_ADDR_LEN; break; default: EFA_INFO(FI_LOG_CORE, "Address format not supported: hints[%u], supported[%u,%u]\n", hints->addr_format, FI_FORMAT_UNSPEC, FI_ADDR_EFA); return -FI_ENODATA; } if (hints->src_addr && hints->src_addrlen < size) return -FI_ENODATA; if (hints->dest_addr && hints->dest_addrlen < size) return -FI_ENODATA; if (hints->domain_attr) { ret = ofi_check_domain_attr(&efa_prov, version, info->domain_attr, hints); if (ret) return ret; } if (hints->ep_attr) { ret = ofi_check_ep_attr(&efa_util_prov, info->fabric_attr->api_version, info, hints); if (ret) return ret; } if (hints->rx_attr) { ret = ofi_check_rx_attr(&efa_prov, info, hints->rx_attr, hints->mode); if (ret) return ret; } if (hints->tx_attr) { ret = ofi_check_tx_attr(&efa_prov, info->tx_attr, hints->tx_attr, hints->mode); if (ret) return ret; } return 0; }
/* if there is only single fi_info in the provider */ int ofi_check_info(const struct util_prov *util_prov, const struct fi_info *prov_info, uint32_t api_version, const struct fi_info *user_info) { const struct fi_provider *prov = util_prov->prov; uint64_t prov_mode; int ret; if (!user_info) return 0; /* Check oft-used endpoint type attribute first to avoid any other * unnecessary check */ if (user_info->ep_attr) { ret = ofi_check_ep_type(prov, prov_info->ep_attr, user_info->ep_attr); if (ret) return ret; } if (user_info->caps & ~(prov_info->caps)) { FI_INFO(prov, FI_LOG_CORE, "Unsupported capabilities\n"); FI_INFO_CHECK(prov, prov_info, user_info, caps, FI_TYPE_CAPS); return -FI_ENODATA; } prov_mode = ofi_mr_get_prov_mode(api_version, user_info, prov_info); if ((user_info->mode & prov_mode) != prov_mode) { FI_INFO(prov, FI_LOG_CORE, "needed mode not set\n"); FI_INFO_MODE(prov, prov_mode, user_info->mode); return -FI_ENODATA; } if (!fi_valid_addr_format(prov_info->addr_format, user_info->addr_format)) { FI_INFO(prov, FI_LOG_CORE, "address format not supported\n"); FI_INFO_CHECK(prov, prov_info, user_info, addr_format, FI_TYPE_ADDR_FORMAT); return -FI_ENODATA; } if (user_info->fabric_attr) { ret = ofi_check_fabric_attr(prov, prov_info->fabric_attr, user_info->fabric_attr); if (ret) return ret; } if (user_info->domain_attr) { ret = ofi_check_domain_attr(prov, api_version, prov_info->domain_attr, user_info); if (ret) return ret; } if (user_info->ep_attr) { ret = ofi_check_ep_attr(util_prov, api_version, prov_info, user_info); if (ret) return ret; } if (user_info->rx_attr) { ret = ofi_check_rx_attr(prov, prov_info, user_info->rx_attr, user_info->mode); if (ret) return ret; } if (user_info->tx_attr) { ret = ofi_check_tx_attr(prov, prov_info->tx_attr, user_info->tx_attr, user_info->mode); if (ret) return ret; } return 0; }