static inline ssize_t rxm_ep_rma_reg_iov(struct rxm_ep *rxm_ep, const struct iovec *msg_iov, void **desc, void **desc_storage, size_t iov_count, uint64_t comp_flags, struct rxm_rma_buf *rma_buf) { size_t i; if (rxm_ep->msg_mr_local) { if (!rxm_ep->rxm_mr_local) { ssize_t ret = rxm_ep_msg_mr_regv(rxm_ep, msg_iov, iov_count, comp_flags & (FI_WRITE | FI_READ), rma_buf->mr.mr); if (OFI_UNLIKELY(ret)) return ret; for (i = 0; i < iov_count; i++) desc_storage[i] = fi_mr_desc(rma_buf->mr.mr[i]); rma_buf->mr.count = iov_count; } else { for (i = 0; i < iov_count; i++) desc_storage[i] = fi_mr_desc(desc[i]); } } return FI_SUCCESS; }
static ssize_t rxm_ep_rma_common(struct fid_ep *msg_ep, struct rxm_ep *rxm_ep, const struct fi_msg_rma *msg, uint64_t flags, rxm_rma_msg_fn rma_msg, uint64_t comp_flags) { struct rxm_tx_entry *tx_entry; struct fi_msg_rma msg_rma; size_t i; int ret; tx_entry = rxm_tx_entry_get(&rxm_ep->send_queue); if (!tx_entry) return -FI_EAGAIN; tx_entry->state = RXM_TX_NOBUF; tx_entry->context = msg->context; tx_entry->flags = flags; tx_entry->comp_flags = FI_RMA | comp_flags; msg_rma = *msg; msg_rma.context = tx_entry; if (rxm_ep->msg_mr_local) { if (!rxm_ep->rxm_mr_local) { ret = rxm_ep_msg_mr_regv(rxm_ep, msg->msg_iov, msg->iov_count, comp_flags & (FI_WRITE | FI_READ), tx_entry->mr); if (ret) goto err; msg_rma.desc = (void **)tx_entry->mr; } for (i = 0; i < msg_rma.iov_count; i++) msg_rma.desc[i] = fi_mr_desc(msg_rma.desc[i]); } return rma_msg(msg_ep, &msg_rma, flags); err: rxm_tx_entry_release(&rxm_ep->send_queue, tx_entry); return ret; }