static ssize_t fi_ibv_msg_ep_send(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr = { 0 }; wr.opcode = IBV_WR_SEND; ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); wr.send_flags = VERBS_INJECT(ep, len) | VERBS_COMP(ep); return fi_ibv_send_buf(ep, &wr, buf, len, desc, context); }
static ssize_t fi_ibv_msg_ep_senddata(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc, uint64_t data, fi_addr_t dest_addr, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr = { 0 }; wr.opcode = IBV_WR_SEND_WITH_IMM; wr.imm_data = htonl((uint32_t)data); ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); wr.send_flags = VERBS_INJECT(ep, len) | VERBS_COMP(ep); return fi_ibv_send_buf(ep, &wr, buf, len, desc, context); }
static ssize_t fi_ibv_msg_ep_atomic_readwrite(struct fid_ep *ep_fid, const void *buf, size_t count, void *desc, void *result, void *result_desc, fi_addr_t dest_addr, uint64_t addr, uint64_t key, enum fi_datatype datatype, enum fi_op op, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr; size_t count_copy; int ret; if (count != 1) return -FI_E2BIG; count_copy = count; ret = fi_ibv_msg_ep_atomic_readwritevalid(ep_fid, datatype, op, &count_copy); if (ret) return ret; ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); memset(&wr, 0, sizeof(wr)); switch (op) { case FI_ATOMIC_READ: wr.opcode = IBV_WR_RDMA_READ; wr.wr.rdma.remote_addr = addr; wr.wr.rdma.rkey = (uint32_t) (uintptr_t) key; break; case FI_SUM: wr.opcode = IBV_WR_ATOMIC_FETCH_AND_ADD; wr.wr.atomic.remote_addr = addr; wr.wr.atomic.compare_add = (uintptr_t) buf; wr.wr.atomic.swap = 0; wr.wr.atomic.rkey = (uint32_t) (uintptr_t) key; break; default: return -ENOSYS; } wr.send_flags = VERBS_COMP(ep) | IBV_SEND_FENCE; return fi_ibv_send_buf(ep, &wr, result, sizeof(uint64_t), result_desc, context); }
static ssize_t fi_ibv_msg_ep_rma_write(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, uint64_t addr, uint64_t key, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr; memset(&wr, 0, sizeof(wr)); wr.opcode = IBV_WR_RDMA_WRITE; wr.wr.rdma.remote_addr = addr; wr.wr.rdma.rkey = (uint32_t) key; ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); wr.send_flags = VERBS_INJECT(ep, len) | VERBS_COMP(ep); return fi_ibv_send_buf(ep, &wr, buf, len, desc, context); }
static ssize_t fi_ibv_msg_ep_atomic_write(struct fid_ep *ep_fid, const void *buf, size_t count, void *desc, fi_addr_t dest_addr, uint64_t addr, uint64_t key, enum fi_datatype datatype, enum fi_op op, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr; size_t count_copy; int ret; if (count != 1) return -FI_E2BIG; count_copy = count; ret = fi_ibv_msg_ep_atomic_writevalid(ep_fid, datatype, op, &count_copy); if (ret) return ret; memset(&wr, 0, sizeof(wr)); switch(op) { case FI_ATOMIC_WRITE: wr.opcode = IBV_WR_RDMA_WRITE; wr.wr.rdma.remote_addr = addr; wr.wr.rdma.rkey = (uint32_t) (uintptr_t) key; break; default: return -ENOSYS; } ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); wr.send_flags = VERBS_INJECT(ep, sizeof(uint64_t)) | VERBS_COMP(ep) | IBV_SEND_FENCE; return fi_ibv_send_buf(ep, &wr, buf, sizeof(uint64_t), desc, context); }
static ssize_t fi_ibv_msg_ep_atomic_compwrite(struct fid_ep *ep_fid, const void *buf, size_t count, void *desc, const void *compare, void *compare_desc, void *result, void *result_desc, fi_addr_t dest_addr, uint64_t addr, uint64_t key, enum fi_datatype datatype, enum fi_op op, void *context) { struct fi_ibv_msg_ep *ep; struct ibv_send_wr wr; size_t count_copy; int ret; if (count != 1) return -FI_E2BIG; count_copy = count; ret = fi_ibv_msg_ep_atomic_compwritevalid(ep_fid, datatype, op, &count_copy); if (ret) return ret; memset(&wr, 0, sizeof(wr)); wr.opcode = IBV_WR_ATOMIC_CMP_AND_SWP; wr.wr.atomic.remote_addr = addr; wr.wr.atomic.compare_add = (uintptr_t) compare; wr.wr.atomic.swap = (uintptr_t) buf; wr.wr.atomic.rkey = (uint32_t) (uintptr_t) key; ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid); wr.send_flags = VERBS_COMP(ep) | IBV_SEND_FENCE; return fi_ibv_send_buf(ep, &wr, result, sizeof(uint64_t), result_desc, context); }