Ejemplo n.º 1
0
static int rxm_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
{
	struct rxm_ep *rxm_ep;
	struct util_av *util_av;
	int ret = 0;

	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
	switch (bfid->fclass) {
	case FI_CLASS_AV:
		util_av = container_of(bfid, struct util_av, av_fid.fid);
		ret = ofi_ep_bind_av(&rxm_ep->util_ep, util_av);
		if (ret)
			return ret;
		rxm_ep->util_ep.cmap = ofi_cmap_alloc(util_av, rxm_conn_close);
		if (!rxm_ep->util_ep.cmap)
			return -FI_ENOMEM;
		break;
	case FI_CLASS_CQ:
		ret = rxm_ep_bind_cq(rxm_ep, container_of(bfid, struct util_cq,
					cq_fid.fid), flags);
		break;
	case FI_CLASS_EQ:
		break;
	default:
		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
			"invalid fid class\n");
		ret = -FI_EINVAL;
		break;
	}
	return ret;
}
Ejemplo n.º 2
0
int rxm_ep_bind_av(struct rxm_ep *rxm_ep, struct util_av *av)
{
	if (rxm_ep->util_ep.av) {
		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
			"duplicate AV binding\n");
		return -FI_EINVAL;
	}
	rxm_ep->cmap = ofi_cmap_alloc(av, rxm_conn_close);
	if (!rxm_ep->cmap)
		return -FI_ENOMEM;

	atomic_inc(&av->ref);
	rxm_ep->util_ep.av = av;
	return 0;
}