static int fi_ibv_domain(struct fid_fabric *fabric, struct fi_info *info, struct fid_domain **domain, void *context) { struct fi_ibv_domain *_domain; struct fi_info *fi; int ret; fi = fi_ibv_get_verbs_info(info->domain_attr->name); if (!fi) return -FI_EINVAL; ret = fi_ibv_check_domain_attr(info->domain_attr, fi); if (ret) return ret; _domain = calloc(1, sizeof *_domain); if (!_domain) return -FI_ENOMEM; _domain->info = fi_dupinfo(info); if (!_domain->info) goto err1; _domain->rdm = FI_IBV_EP_TYPE_IS_RDM(info); ret = fi_ibv_open_device_by_name(_domain, info->domain_attr->name); if (ret) goto err2; _domain->pd = ibv_alloc_pd(_domain->verbs); if (!_domain->pd) { ret = -errno; goto err2; } _domain->domain_fid.fid.fclass = FI_CLASS_DOMAIN; _domain->domain_fid.fid.context = context; _domain->domain_fid.fid.ops = &fi_ibv_fid_ops; _domain->domain_fid.ops = _domain->rdm ? &fi_ibv_rdm_domain_ops : &fi_ibv_domain_ops; _domain->domain_fid.mr = &fi_ibv_domain_mr_ops; _domain->fab = container_of(fabric, struct fi_ibv_fabric, fabric_fid); *domain = &_domain->domain_fid; return 0; err2: fi_freeinfo(_domain->info); err1: free(_domain); return ret; }
static int fi_ibv_check_hints(const struct fi_info *hints, const struct fi_info *info) { int ret; if (hints->caps & ~(info->caps)) { FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unsupported capabilities\n"); return -FI_ENODATA; } if ((hints->mode & info->mode) != info->mode) { FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Required hints mode bits not set. Expected:0x%llx" " Given:0x%llx\n", info->mode, hints->mode); return -FI_ENODATA; } if (hints->fabric_attr) { ret = fi_ibv_check_fabric_attr(hints->fabric_attr, info); if (ret) return ret; } if (hints->domain_attr) { ret = fi_ibv_check_domain_attr(hints->domain_attr, info); 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; }