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; } }
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); }
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); }
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; }
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; } }