static int rxd_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct fi_info **info) { return ofix_getinfo(version, node, service, flags, &rxd_util_prov, hints, rxd_info_to_core, rxd_info_to_rxd, info); }
static int rxm_ep_msg_res_open(struct fi_info *rxm_info, struct util_domain *util_domain, struct rxm_ep *rxm_ep) { struct rxm_fabric *rxm_fabric; struct rxm_domain *rxm_domain; struct fi_cq_attr cq_attr; int ret; ret = ofix_getinfo(rxm_prov.version, NULL, NULL, 0, &rxm_util_prov, rxm_info, rxm_alter_layer_info, rxm_alter_base_info, 1, &rxm_ep->msg_info); if (ret) return ret; rxm_domain = container_of(util_domain, struct rxm_domain, util_domain); rxm_fabric = container_of(util_domain->fabric, struct rxm_fabric, util_fabric); ret = fi_passive_ep(rxm_fabric->msg_fabric, rxm_ep->msg_info, &rxm_ep->msg_pep, rxm_ep); if (ret) { FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open msg PEP\n"); goto err1; } memset(&cq_attr, 0, sizeof(cq_attr)); cq_attr.size = rxm_info->tx_attr->size + rxm_info->rx_attr->size; cq_attr.format = FI_CQ_FORMAT_MSG; ret = fi_cq_open(rxm_domain->msg_domain, &cq_attr, &rxm_ep->msg_cq, NULL); if (ret) { FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to open MSG CQ\n"); goto err1; } ret = fi_srx_context(rxm_domain->msg_domain, rxm_ep->msg_info->rx_attr, &rxm_ep->srx_ctx, NULL); if (ret) { FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open shared receive context\n"); goto err2; } /* We don't care what's in the dest_addr at this point. We go by AV. */ if (rxm_ep->msg_info->dest_addr) { free(rxm_ep->msg_info->dest_addr); rxm_ep->msg_info->dest_addr = NULL; rxm_ep->msg_info->dest_addrlen = 0; } /* Zero out the port as we would be creating multiple MSG EPs for a single * RXM EP and we don't want address conflicts. */ if (rxm_ep->msg_info->src_addr) ((struct sockaddr_in *)(rxm_ep->msg_info->src_addr))->sin_port = 0; return 0; err2: fi_close(&rxm_ep->msg_pep->fid); err1: fi_freeinfo(rxm_ep->msg_info); return ret; }
static int rxm_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct fi_info **info) { struct fi_info *cur; struct addrinfo *ai; uint16_t port_save = 0; int ret; /* Avoid getting wild card address from MSG provider */ if (ofi_is_wildcard_listen_addr(node, service, flags, hints)) { if (service) { ret = getaddrinfo(NULL, service, NULL, &ai); if (ret) { FI_WARN(&rxm_prov, FI_LOG_CORE, "Unable to getaddrinfo\n"); return ret; } port_save = ofi_addr_get_port(ai->ai_addr); freeaddrinfo(ai); service = NULL; } else { port_save = ofi_addr_get_port(hints->src_addr); ofi_addr_set_port(hints->src_addr, 0); } } ret = rxm_validate_atomic_hints(hints); if (ret) return ret; ret = ofix_getinfo(version, node, service, flags, &rxm_util_prov, hints, rxm_info_to_core, rxm_info_to_rxm, info); if (ret) return ret; if (port_save) { for (cur = *info; cur; cur = cur->next) { assert(cur->src_addr); ofi_addr_set_port(cur->src_addr, port_save); } } rxm_alter_info(hints, *info); return 0; }
static int rxm_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { struct fi_info *cur, *dup; int ret; ret = ofix_getinfo(version, node, service, flags, &rxm_util_prov, hints, rxm_info_to_core, rxm_info_to_rxm, info); if (ret) return ret; /* If app supports FI_MR_LOCAL, prioritize requiring it for * better performance. */ if (hints && hints->domain_attr && (RXM_MR_LOCAL(hints))) { for (cur = *info; cur; cur = cur->next) { if (!RXM_MR_LOCAL(cur)) continue; if (!(dup = fi_dupinfo(cur))) { fi_freeinfo(*info); return -FI_ENOMEM; } if (FI_VERSION_LT(version, FI_VERSION(1, 5))) dup->mode &= ~FI_LOCAL_MR; else dup->domain_attr->mr_mode &= ~FI_MR_LOCAL; dup->next = cur->next; cur->next = dup; cur = dup; } } else { for (cur = *info; cur; cur = cur->next) { if (FI_VERSION_LT(version, FI_VERSION(1, 5))) cur->mode &= ~FI_LOCAL_MR; else cur->domain_attr->mr_mode &= ~FI_MR_LOCAL; } } return 0; }
static int rxm_getinfo(uint32_t version, const char *node, const char *service, uint64_t flags, struct fi_info *hints, struct fi_info **info) { return ofix_getinfo(version, node, service, flags, &rxm_util_prov, hints, rxm_alter_layer_info, rxm_alter_base_info, 0, info); }