int psmx_am_progress(struct psmx_fid_domain *domain) { struct slist_entry *item; struct psmx_am_request *req; struct psmx_trigger *trigger; #if PSMX_AM_USE_SEND_QUEUE pthread_mutex_lock(&domain->send_queue.lock); while (!slist_empty(&domain->send_queue.list)) { item = slist_remove_head(&domain->send_queue.list); req = container_of(item, struct psmx_am_request, list_entry); if (req->state == PSMX_AM_STATE_DONE) { free(req); } else { pthread_mutex_unlock(&domain->send_queue.lock); psmx_am_process_send(domain, req); pthread_mutex_lock(&domain->send_queue.lock); } } pthread_mutex_unlock(&domain->send_queue.lock); #endif if (psmx_env.tagged_rma) { pthread_mutex_lock(&domain->rma_queue.lock); while (!slist_empty(&domain->rma_queue.list)) { item = slist_remove_head(&domain->rma_queue.list); req = container_of(item, struct psmx_am_request, list_entry); pthread_mutex_unlock(&domain->rma_queue.lock); psmx_am_process_rma(domain, req); pthread_mutex_lock(&domain->rma_queue.lock); } pthread_mutex_unlock(&domain->rma_queue.lock); }
int psmx_am_progress(struct psmx_fid_domain *domain) { struct slist_entry *item; struct psmx_am_request *req; struct psmx_trigger *trigger; if (psmx_env.am_msg) { fastlock_acquire(&domain->send_queue.lock); while (!slist_empty(&domain->send_queue.list)) { item = slist_remove_head(&domain->send_queue.list); req = container_of(item, struct psmx_am_request, list_entry); fastlock_release(&domain->send_queue.lock); psmx_am_process_send(domain, req); fastlock_acquire(&domain->send_queue.lock); } fastlock_release(&domain->send_queue.lock); }
static ssize_t _psmx_sendto2(struct fid_ep *ep, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, void *context, uint64_t flags) { struct psmx_fid_ep *ep_priv; struct psmx_fid_av *av; struct psmx_am_request *req; psm_amarg_t args[8]; int am_flags = PSM_AM_FLAG_ASYNC; int err; int chunk_size, msg_size; size_t idx; ep_priv = container_of(ep, struct psmx_fid_ep, ep); assert(ep_priv->domain); if (!buf) return -EINVAL; av = ep_priv->av; if (av && av->type == FI_AV_TABLE) { idx = dest_addr; if (idx >= av->last) return -EINVAL; dest_addr = (fi_addr_t) av->psm_epaddrs[idx]; } else if (!dest_addr) { return -EINVAL; } chunk_size = MIN(PSMX_AM_CHUNK_SIZE, psmx_am_param.max_request_short); msg_size = MIN(len, chunk_size); req = calloc(1, sizeof(*req)); if (!req) return -ENOMEM; req->op = PSMX_AM_REQ_SEND; req->send.buf = (void *)buf; req->send.len = len; req->send.context = context; req->send.len_sent = msg_size; req->send.dest_addr = (void *)dest_addr; req->ep = ep_priv; if ((ep_priv->send_cq_event_flag && !(flags & FI_EVENT)) || (context == &ep_priv->sendimm_context)) req->no_event = 1; args[0].u32w0 = PSMX_AM_REQ_SEND | (msg_size == len ? PSMX_AM_EOM : 0); args[0].u32w1 = msg_size; args[1].u64 = (uint64_t)(uintptr_t)req; args[2].u64 = 0; args[3].u64 = 0; err = psm_am_request_short((psm_epaddr_t) dest_addr, PSMX_AM_MSG_HANDLER, args, 4, (void *)buf, msg_size, am_flags, NULL, NULL); #if ! PSMX_AM_USE_SEND_QUEUE if (len > msg_size) { while (!req->send.peer_ready) psm_poll(ep_priv->domain->psm_ep); psmx_am_process_send(ep_priv->domain, req); } #endif return psmx_errno(err); }