コード例 #1
0
ファイル: psmx_mr.c プロジェクト: agontarek/libfabric
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;
}
コード例 #2
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;
}
コード例 #3
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;
}