static ssize_t sock_ep_atomic_readwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, struct fi_ioc *resultv, void **result_desc, size_t result_count, uint64_t flags) { switch (msg->op) { case FI_MIN: case FI_MAX: case FI_SUM: case FI_PROD: case FI_LOR: case FI_LAND: case FI_BOR: case FI_BAND: case FI_LXOR: case FI_BXOR: case FI_ATOMIC_READ: case FI_ATOMIC_WRITE: break; default: SOCK_LOG_ERROR("Invalid operation type\n"); return -FI_EINVAL; } return sock_ep_tx_atomic(ep, msg, NULL, NULL, 0, resultv, result_desc, result_count, flags); }
static ssize_t sock_ep_atomic_writemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, uint64_t flags) { #if ENABLE_DEBUG switch (msg->op) { case FI_MIN: case FI_MAX: case FI_SUM: case FI_PROD: case FI_LOR: case FI_LAND: case FI_BOR: case FI_BAND: case FI_LXOR: case FI_BXOR: case FI_ATOMIC_WRITE: break; default: SOCK_LOG_ERROR("Invalid operation type\n"); return -FI_EINVAL; } #endif return sock_ep_tx_atomic(ep, msg, NULL, NULL, 0, NULL, NULL, 0, flags); }
static ssize_t sock_ep_atomic_readwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, struct fi_ioc *resultv, void **result_desc, size_t result_count, uint64_t flags) { return sock_ep_tx_atomic(ep, msg, NULL, NULL, 0, resultv, result_desc, result_count, flags); }
static ssize_t sock_ep_atomic_compwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, const struct fi_ioc *comparev, void **compare_desc, size_t compare_count, struct fi_ioc *resultv, void **result_desc, size_t result_count, uint64_t flags) { return sock_ep_tx_atomic(ep, msg, comparev, compare_desc, compare_count, resultv, result_desc, result_count, flags); }
static ssize_t sock_ep_atomic_compwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, const struct fi_ioc *comparev, void **compare_desc, size_t compare_count, struct fi_ioc *resultv, void **result_desc, size_t result_count, uint64_t flags) { switch (msg->op) { case FI_CSWAP: case FI_CSWAP_NE: case FI_CSWAP_LE: case FI_CSWAP_LT: case FI_CSWAP_GE: case FI_CSWAP_GT: case FI_MSWAP: break; default: SOCK_LOG_ERROR("Invalid operation type\n"); return -FI_EINVAL; } return sock_ep_tx_atomic(ep, msg, comparev, compare_desc, compare_count, resultv, result_desc, result_count, flags); }
void sock_cntr_check_trigger_list(struct sock_cntr *cntr) { struct sock_trigger *trigger; struct dlist_entry *entry; int ret = 0; fastlock_acquire(&cntr->trigger_lock); for (entry = cntr->trigger_list.next; entry != &cntr->trigger_list;) { trigger = container_of(entry, struct sock_trigger, entry); entry = entry->next; if (atomic_get(&cntr->value) < trigger->threshold) continue; switch (trigger->op_type) { case SOCK_OP_SEND: ret = sock_ep_sendmsg(trigger->ep, &trigger->op.msg.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_RECV: ret = sock_ep_recvmsg(trigger->ep, &trigger->op.msg.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_TSEND: ret = sock_ep_tsendmsg(trigger->ep, &trigger->op.tmsg.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_TRECV: ret = sock_ep_trecvmsg(trigger->ep, &trigger->op.tmsg.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_WRITE: ret = sock_ep_rma_writemsg(trigger->ep, &trigger->op.rma.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_READ: ret = sock_ep_rma_readmsg(trigger->ep, &trigger->op.rma.msg, trigger->flags & ~FI_TRIGGER); break; case SOCK_OP_ATOMIC: ret = sock_ep_tx_atomic(trigger->ep, &trigger->op.atomic.msg, trigger->op.atomic.comparev, NULL, trigger->op.atomic.compare_count, trigger->op.atomic.resultv, NULL, trigger->op.atomic.result_count, trigger->flags & ~FI_TRIGGER); break; default: SOCK_LOG_ERROR("unsupported op\n"); ret = 0; break; } if (ret != -FI_EAGAIN) { dlist_remove(&trigger->entry); free(trigger); } else { break; } } fastlock_release(&cntr->trigger_lock); }
static ssize_t sock_ep_atomic_writemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg, uint64_t flags) { return sock_ep_tx_atomic(ep, msg, NULL, NULL, 0, NULL, NULL, 0, flags); }