static int psmx_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr, uint64_t flags, struct fid_mr **mr) { struct fid_domain *domain; struct psmx_fid_domain *domain_priv; struct psmx_fid_mr *mr_priv; int i, err; uint64_t key; if (fid->fclass != FI_CLASS_DOMAIN) { return -FI_EINVAL; } domain = container_of(fid, struct fid_domain, fid); domain_priv = container_of(domain, struct psmx_fid_domain, domain); if (!attr) return -FI_EINVAL; if (attr->iov_count == 0 || attr->mr_iov == NULL) return -FI_EINVAL; mr_priv = (struct psmx_fid_mr *) calloc(1, sizeof(*mr_priv) + sizeof(struct iovec) * attr->iov_count); if (!mr_priv) return -FI_ENOMEM; err = psmx_mr_reserve_key(domain_priv, attr->requested_key, &key, mr_priv); if (err) { free(mr_priv); return err; } psmx_domain_acquire(domain_priv); mr_priv->mr.fid.fclass = FI_CLASS_MR; mr_priv->mr.fid.context = attr->context; mr_priv->mr.fid.ops = &psmx_fi_ops; mr_priv->mr.mem_desc = mr_priv; mr_priv->mr.key = key; mr_priv->domain = domain_priv; mr_priv->access = attr->access; mr_priv->flags = flags; mr_priv->iov_count = attr->iov_count; for (i=0; i<attr->iov_count; i++) mr_priv->iov[i] = attr->mr_iov[i]; psmx_mr_normalize_iov(mr_priv->iov, &mr_priv->iov_count); mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ? ((uint64_t)mr_priv->iov[0].iov_base - attr->offset) : 0; *mr = &mr_priv->mr; return 0; }
static int psmx_mr_regv(struct fid_domain *domain, const struct iovec *iov, size_t count, uint64_t access, uint64_t offset, uint64_t requested_key, uint64_t flags, struct fid_mr **mr, void *context) { struct psmx_fid_domain *fid_domain; struct psmx_fid_mr *fid_mr; int i; uint64_t key; if (requested_key != PSMX_MR_AUTO_KEY && psmx_mr_hash_get(requested_key)) return -EEXIST; fid_domain = container_of(domain, struct psmx_fid_domain, domain); if (count == 0 || iov == NULL) return -EINVAL; fid_mr = (struct psmx_fid_mr *) calloc(1, sizeof(*fid_mr) + sizeof(struct iovec) * count); if (!fid_mr) return -ENOMEM; fid_mr->mr.fid.fclass = FID_CLASS_MR; fid_mr->mr.fid.context = context; fid_mr->mr.fid.ops = &psmx_fi_ops; fid_mr->mr.mem_desc = fid_mr; if (requested_key != PSMX_MR_AUTO_KEY) { key = requested_key; } else { key = (uint64_t)(uintptr_t)fid_mr; while (psmx_mr_hash_get(key)) key++; } fid_mr->mr.key = key; fid_mr->domain = fid_domain; fid_mr->access = access; fid_mr->flags = flags; fid_mr->iov_count = count; for (i=0; i<count; i++) fid_mr->iov[i] = iov[i]; psmx_mr_normalize_iov(fid_mr->iov, &fid_mr->iov_count); psmx_mr_hash_add(fid_mr); *mr = &fid_mr->mr; return 0; }
static int psmx_mr_regattr(struct fid_domain *domain, const struct fi_mr_attr *attr, uint64_t flags, struct fid_mr **mr) { struct psmx_fid_domain *fid_domain; struct psmx_fid_mr *fid_mr; int i; uint64_t key; if (attr->requested_key != PSMX_MR_AUTO_KEY && psmx_mr_hash_get(attr->requested_key)) return -EEXIST; fid_domain = container_of(domain, struct psmx_fid_domain, domain); if (!attr) return -EINVAL; if (!(attr->mask & FI_MR_ATTR_IOV)) return -EINVAL; if (attr->iov_count == 0 || attr->mr_iov == NULL) return -EINVAL; fid_mr = (struct psmx_fid_mr *) calloc(1, sizeof(*fid_mr) + sizeof(struct iovec) * attr->iov_count); if (!fid_mr) return -ENOMEM; fid_mr->mr.fid.fclass = FID_CLASS_MR; fid_mr->mr.fid.ops = &psmx_fi_ops; fid_mr->mr.mem_desc = fid_mr; if (attr->requested_key != PSMX_MR_AUTO_KEY) { key = attr->requested_key; } else { key = (uint64_t)(uintptr_t)fid_mr; while (psmx_mr_hash_get(key)) key++; } fid_mr->mr.key = key; fid_mr->domain = fid_domain; fid_mr->access = FI_READ | FI_WRITE | FI_REMOTE_READ | FI_REMOTE_WRITE; fid_mr->flags = flags; fid_mr->iov_count = attr->iov_count; for (i=0; i<attr->iov_count; i++) fid_mr->iov[i] = attr->mr_iov[i]; if (attr->mask & FI_MR_ATTR_CONTEXT) fid_mr->mr.fid.context = attr->context; if (attr->mask & FI_MR_ATTR_ACCESS) fid_mr->access = attr->access; if (attr->mask & FI_MR_ATTR_KEY) ; /* requested_key is ignored */ psmx_mr_normalize_iov(fid_mr->iov, &fid_mr->iov_count); psmx_mr_hash_add(fid_mr); *mr = &fid_mr->mr; return 0; }