static int rxd_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen) { struct rxd_av *rxd_av; fi_addr_t dg_addr; rxd_av = container_of(av, struct rxd_av, util_av.av_fid); dg_addr = rxd_av_dg_addr(rxd_av, fi_addr); return fi_av_lookup(rxd_av->dg_av, dg_addr, addr, addrlen); }
static int rxd_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen) { struct rxd_av *rxd_av; fi_addr_t dg_fiaddr; rxd_av = container_of(av, struct rxd_av, util_av.av_fid); dg_fiaddr = rxd_av_dg_addr(rxd_av, fi_addr); if (dg_fiaddr == FI_ADDR_UNSPEC) return -FI_ENODATA; return fi_av_lookup(rxd_av->dg_av, dg_fiaddr, addr, addrlen); }
ssize_t rxd_ep_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg, uint64_t flags) { struct rxd_ep *rxd_ep; struct rxd_peer *peer; struct rxd_tx_entry *tx_entry; uint64_t peer_addr; ssize_t ret; rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid); peer_addr = rxd_av_dg_addr(rxd_ep_av(rxd_ep), msg->addr); peer = rxd_ep_getpeer_info(rxd_ep, peer_addr); fastlock_acquire(&rxd_ep->lock); if (peer->state != CMAP_CONNECTED) { ret = rxd_ep_connect(rxd_ep, peer, peer_addr); fastlock_release(&rxd_ep->lock); if (ret == -FI_EALREADY) { rxd_ep->util_ep.progress(&rxd_ep->util_ep); ret = -FI_EAGAIN; } return ret ? ret : -FI_EAGAIN; } tx_entry = rxd_tx_entry_alloc(rxd_ep, peer, peer_addr, flags, RXD_TX_READ_REQ); if (!tx_entry) { ret = -FI_EAGAIN; goto out; } tx_entry->read_req.msg = *msg; memcpy(&tx_entry->read_req.dst_iov[0], msg->msg_iov, sizeof(*msg->msg_iov)* msg->iov_count); memcpy(&tx_entry->read_req.src_iov[0], msg->rma_iov, sizeof(*msg->rma_iov) * msg->rma_iov_count); ret = rxd_ep_start_xfer(rxd_ep, peer, ofi_op_read_req, tx_entry); if (ret) rxd_tx_entry_free(rxd_ep, tx_entry); out: fastlock_release(&rxd_ep->lock); return ret; }
static int rxd_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr, size_t count, uint64_t flags) { int ret = 0; size_t i; fi_addr_t dg_fiaddr; struct rxd_av *av; av = container_of(av_fid, struct rxd_av, util_av.av_fid); fastlock_acquire(&av->util_av.lock); for (i = 0; i < count; i++) { dg_fiaddr = rxd_av_dg_addr(av, fi_addr[i]); ret = fi_av_remove(av->dg_av, &dg_fiaddr, 1, flags); if (ret) break; av->dg_av_used--; } fastlock_release(&av->util_av.lock); return ret; }