예제 #1
0
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;
}
예제 #2
0
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;
}