in prov/psm2/src/psmx2_ep.c [269:384]
STATIC int psmx2_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
{
struct psmx2_fid_ep *ep;
struct psmx2_fid_av *av;
struct psmx2_fid_cq *cq;
struct psmx2_fid_cntr *cntr;
struct psmx2_fid_stx *stx;
int err;
ep = container_of(fid, struct psmx2_fid_ep, ep.fid);
err = ofi_ep_bind_valid(&psmx2_prov, bfid, flags);
if (err)
return err;
switch (bfid->fclass) {
case FI_CLASS_EQ:
return -FI_ENOSYS;
case FI_CLASS_CQ:
cq = container_of(bfid, struct psmx2_fid_cq, cq.fid);
if (ep->domain != cq->domain)
return -FI_EINVAL;
if (flags & FI_SEND) {
err = psmx2_add_poll_ctxt(&cq->poll_list, ep->tx);
if (err)
return err;
ep->send_cq = cq;
if (flags & FI_SELECTIVE_COMPLETION)
ep->send_selective_completion = 1;
}
if (flags & FI_RECV) {
err = psmx2_add_poll_ctxt(&cq->poll_list, ep->rx);
if (err)
return err;
ep->recv_cq = cq;
if (flags & FI_SELECTIVE_COMPLETION)
ep->recv_selective_completion = 1;
}
psmx2_ep_optimize_ops(ep);
break;
case FI_CLASS_CNTR:
cntr = container_of(bfid, struct psmx2_fid_cntr, cntr.fid);
if (ep->domain != cntr->domain)
return -FI_EINVAL;
if (flags & (FI_SEND | FI_WRITE | FI_READ)) {
err = psmx2_add_poll_ctxt(&cntr->poll_list, ep->tx);
if (err)
return err;
}
if (flags & (FI_RECV | FI_REMOTE_WRITE | FI_REMOTE_READ)) {
err = psmx2_add_poll_ctxt(&cntr->poll_list, ep->rx);
if (err)
return err;
}
if (flags & FI_SEND)
ep->send_cntr = cntr;
if (flags & FI_RECV)
ep->recv_cntr = cntr;
if (flags & FI_WRITE)
ep->write_cntr = cntr;
if (flags & FI_READ)
ep->read_cntr = cntr;
if (flags & FI_REMOTE_WRITE)
ep->remote_write_cntr = cntr;
if (flags & FI_REMOTE_READ)
ep->remote_read_cntr = cntr;
break;
case FI_CLASS_AV:
av = container_of(bfid,
struct psmx2_fid_av, av.fid);
if (ep->domain != av->domain)
return -FI_EINVAL;
ep->av = av;
psmx2_ep_optimize_ops(ep);
if (ep->tx)
psmx2_av_add_trx_ctxt(av, ep->tx);
if (ep->rx && ep->rx != ep->tx)
psmx2_av_add_trx_ctxt(av, ep->rx);
break;
case FI_CLASS_MR:
if (!bfid->ops || !bfid->ops->bind)
return -FI_EINVAL;
err = bfid->ops->bind(bfid, fid, flags);
if (err)
return err;
break;
case FI_CLASS_STX_CTX:
stx = container_of(bfid, struct psmx2_fid_stx, stx.fid);
if (ep->domain != stx->domain)
return -FI_EINVAL;
if (ep->tx || ep->stx)
return -FI_EINVAL;
ep->tx = stx->tx;
ep->stx = stx;
err = psmx2_domain_enable_ep(ep->domain, ep);
if (err)
return err;
#if HAVE_PSM2_MQ_FP_MSG
if (ep->caps & FI_TRIGGER)
#else
if (ep->caps & (FI_RMA | FI_TRIGGER))
#endif
stx->tx->am_progress = 1;
ofi_atomic_inc32(&stx->ref);
break;
default:
return -FI_ENOSYS;
}
return 0;
}