Exemplo n.º 1
0
static void smr_format_inline_atomic(struct smr_cmd *cmd, fi_addr_t peer_id,
				     const struct iovec *iov, size_t count,
				     const struct iovec *compv,
				     size_t comp_count,  uint32_t op,
				     enum fi_datatype datatype,
				     enum fi_op atomic_op)
{
	size_t comp_size;

	smr_generic_format(cmd, peer_id, op, 0, datatype,
			   atomic_op, 0, 0);
	cmd->msg.hdr.op_src = smr_src_inline;
	switch (op) {
	case ofi_op_atomic:
	case ofi_op_atomic_fetch:
		cmd->msg.hdr.size = ofi_copy_from_iov(cmd->msg.data.msg,
						SMR_MSG_DATA_LEN, iov, count, 0);
		break;
	case ofi_op_atomic_compare:
		cmd->msg.hdr.size = ofi_copy_from_iov(cmd->msg.data.buf,
						SMR_MSG_DATA_LEN, iov, count, 0);
		comp_size = ofi_copy_from_iov(cmd->msg.data.comp,
					      SMR_MSG_DATA_LEN, compv,
					      comp_count, 0);
		if (comp_size != cmd->msg.hdr.size)
			FI_WARN(&smr_prov, FI_LOG_EP_CTRL,
				"atomic and compare buffer size mimatch\n");
		break;
	default:
		break;
	}
}
Exemplo n.º 2
0
void smr_format_inline(struct smr_cmd *cmd, fi_addr_t peer_id,
		       const struct iovec *iov, size_t count,
		       uint32_t op, uint64_t tag, uint64_t data,
		       uint64_t op_flags)
{
	smr_generic_format(cmd, peer_id, op, tag, 0, 0, data, op_flags);
	cmd->msg.hdr.op_src = smr_src_inline;
	cmd->msg.hdr.size = ofi_copy_from_iov(cmd->msg.data.msg,
					      SMR_MSG_DATA_LEN, iov, count, 0);
}
Exemplo n.º 3
0
void smr_format_inject(struct smr_cmd *cmd, fi_addr_t peer_id,
		       const struct iovec *iov, size_t count,
		       uint32_t op, uint64_t tag, uint64_t data,
		       uint64_t op_flags, struct smr_region *smr,
		       struct smr_inject_buf *tx_buf)
{
	smr_generic_format(cmd, peer_id, op, tag, 0, 0, data, op_flags);
	cmd->msg.hdr.op_src = smr_src_inject;
	cmd->msg.hdr.src_data = (char **) tx_buf - (char **) smr;
	cmd->msg.hdr.size = ofi_copy_from_iov(tx_buf->data, SMR_INJECT_SIZE,
					      iov, count, 0);
}
Exemplo n.º 4
0
void smr_format_iov(struct smr_cmd *cmd, fi_addr_t peer_id,
		    const struct iovec *iov, size_t count, size_t total_len,
		    uint32_t op, uint64_t tag, uint64_t data, uint64_t op_flags,
		    void *context, struct smr_region *smr,
		    struct smr_resp *resp, struct smr_cmd *pend_cmd)
{
	smr_generic_format(cmd, peer_id, op, tag, 0, 0, data, op_flags);
	cmd->msg.hdr.op_src = smr_src_iov;
	cmd->msg.hdr.src_data = (uint64_t) ((char **) resp - (char **) smr);
	cmd->msg.data.iov_count = count;
	cmd->msg.hdr.size = total_len;
	cmd->msg.hdr.msg_id = (uint64_t) (uintptr_t) context;
	memcpy(cmd->msg.data.iov, iov, sizeof(*iov) * count);

	*pend_cmd = *cmd;

	resp->msg_id = (uint64_t) (uintptr_t) pend_cmd;
	resp->status = FI_EBUSY;

}
Exemplo n.º 5
0
static void smr_format_inject_atomic(struct smr_cmd *cmd, fi_addr_t peer_id,
				     const struct iovec *iov, size_t count,
				     const struct iovec *resultv,
				     size_t result_count,
				     const struct iovec *compv,
				     size_t comp_count,
				     uint32_t op, enum fi_datatype datatype,
				     enum fi_op atomic_op,
				     struct smr_region *smr,
				     struct smr_inject_buf *tx_buf)
{
	size_t comp_size;

	smr_generic_format(cmd, peer_id, op, 0, datatype,
			   atomic_op, 0, 0);
	cmd->msg.hdr.op_src = smr_src_inject;
	cmd->msg.hdr.src_data = (char **) tx_buf - (char **) smr;

	switch (op) {
	case ofi_op_atomic:
	case ofi_op_atomic_fetch:
		if (atomic_op == FI_ATOMIC_READ)
			cmd->msg.hdr.size = ofi_total_iov_len(resultv, result_count);
		else
			cmd->msg.hdr.size = ofi_copy_from_iov(tx_buf->data,
						SMR_INJECT_SIZE, iov, count, 0);
		break;
	case ofi_op_atomic_compare:
		cmd->msg.hdr.size = ofi_copy_from_iov(tx_buf->buf,
						SMR_COMP_INJECT_SIZE, iov, count, 0);
		comp_size = ofi_copy_from_iov(tx_buf->comp, SMR_COMP_INJECT_SIZE,
					      compv, comp_count, 0);
		if (comp_size != cmd->msg.hdr.size)
			FI_WARN(&smr_prov, FI_LOG_EP_CTRL,
				"atomic and compare buffer size mimatch\n");
		break;
	default:
		break;
	}
}