static int sock_ep_tx_ctx(struct fid_ep *ep, int index, struct fi_tx_attr *attr, struct fid_ep **tx_ep, void *context) { struct sock_ep *sock_ep; struct sock_tx_ctx *tx_ctx; sock_ep = container_of(ep, struct sock_ep, ep); if (sock_ep->attr->fclass != FI_CLASS_SEP || index >= (int)sock_ep->attr->ep_attr.tx_ctx_cnt) return -FI_EINVAL; if (attr) { if (ofi_check_tx_attr(&sock_prov, sock_ep->attr->info.tx_attr, attr, 0) || ofi_check_attr_subset(&sock_prov, sock_ep->attr->info.tx_attr->caps, attr->caps)) return -FI_ENODATA; tx_ctx = sock_tx_ctx_alloc(attr, context, 0); } else { tx_ctx = sock_tx_ctx_alloc(&sock_ep->tx_attr, context, 0); } if (!tx_ctx) return -FI_ENOMEM; tx_ctx->tx_id = index; tx_ctx->ep_attr = sock_ep->attr; tx_ctx->domain = sock_ep->attr->domain; if (tx_ctx->rx_ctrl_ctx && tx_ctx->rx_ctrl_ctx->is_ctrl_ctx) tx_ctx->rx_ctrl_ctx->domain = sock_ep->attr->domain; tx_ctx->av = sock_ep->attr->av; dlist_insert_tail(&sock_ep->attr->tx_ctx_entry, &tx_ctx->ep_list); tx_ctx->fid.ctx.fid.ops = &sock_ctx_ops; tx_ctx->fid.ctx.ops = &sock_ctx_ep_ops; tx_ctx->fid.ctx.msg = &sock_ep_msg_ops; tx_ctx->fid.ctx.tagged = &sock_ep_tagged; tx_ctx->fid.ctx.rma = &sock_ep_rma; tx_ctx->fid.ctx.atomic = &sock_ep_atomic; *tx_ep = &tx_ctx->fid.ctx; sock_ep->attr->tx_array[index] = tx_ctx; ofi_atomic_inc32(&sock_ep->attr->num_tx_ctx); ofi_atomic_inc32(&sock_ep->attr->domain->ref); 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; }
int ofi_check_info(const struct util_prov *util_prov, const struct fi_info *user_info, enum fi_match_type type) { const struct fi_info *prov_info = util_prov->info; const struct fi_provider *prov = util_prov->prov; int ret; if (!user_info) return 0; if (user_info->caps & ~(prov_info->caps)) { FI_INFO(prov, FI_LOG_CORE, "Unsupported capabilities\n"); FI_INFO_CAPS(prov, prov_info, user_info, caps, FI_TYPE_CAPS); return -FI_ENODATA; } if ((user_info->mode & prov_info->mode) != prov_info->mode) { FI_INFO(prov, FI_LOG_CORE, "needed mode not set\n"); FI_INFO_MODE(prov, prov_info, user_info); 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"); return -FI_ENODATA; } if (user_info->fabric_attr) { ret = ofi_check_fabric_attr(prov, prov_info->fabric_attr, user_info->fabric_attr, type); if (ret) return ret; } if (user_info->domain_attr) { ret = ofi_check_domain_attr(prov, prov_info->domain_attr, user_info->domain_attr, type); if (ret) return ret; } if (user_info->ep_attr) { ret = ofi_check_ep_attr(util_prov, user_info->ep_attr); if (ret) return ret; } if (user_info->rx_attr) { ret = ofi_check_rx_attr(prov, prov_info->rx_attr, user_info->rx_attr); if (ret) return ret; } if (user_info->tx_attr) { ret = ofi_check_tx_attr(prov, prov_info->tx_attr, user_info->tx_attr); 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; }