static int rxm_check_unexp_msg_list(struct util_cq *util_cq, struct rxm_recv_queue *recv_queue, struct rxm_recv_entry *recv_entry, dlist_func_t *match) { struct dlist_entry *entry; struct rxm_unexp_msg *unexp_msg; struct rxm_recv_match_attr match_attr; struct rxm_rx_buf *rx_buf; int ret = 0; fastlock_acquire(&util_cq->cq_lock); if (cirque_isfull(util_cq->cirq)) { ret = -FI_EAGAIN; goto out; } match_attr.addr = recv_entry->addr; match_attr.tag = recv_entry->tag; match_attr.ignore = recv_entry->ignore; entry = dlist_remove_first_match(&recv_queue->unexp_msg_list, match, &match_attr); if (!entry) goto out; FI_DBG(&rxm_prov, FI_LOG_EP_DATA, "Match for posted recv found in unexp msg list\n"); unexp_msg = container_of(entry, struct rxm_unexp_msg, entry); rx_buf = container_of(unexp_msg, struct rxm_rx_buf, unexp_msg); rx_buf->recv_entry = recv_entry; ret = rxm_cq_handle_data(rx_buf); free(unexp_msg); out: fastlock_release(&util_cq->cq_lock); return ret; }
static void sock_ep_clear_eq_list(struct dlistfd_head *list, struct fid_ep *ep_fid) { struct dlist_entry *entry; while (!dlistfd_empty(list)) { entry = dlist_remove_first_match(&list->list, sock_eq_fid_match, ep_fid); if (!entry) break; dlistfd_reset(list); free(container_of(entry, struct sock_eq_entry, entry)); } }
void fid_list_remove(struct dlist_entry *fid_list, fastlock_t *lock, struct fid *fid) { struct fid_list_entry *item; struct dlist_entry *entry; fastlock_acquire(lock); entry = dlist_remove_first_match(fid_list, fi_fid_match, fid); fastlock_release(lock); if (entry) { item = container_of(entry, struct fid_list_entry, entry); free(item); } }
struct mrail_recv * mrail_match_recv_handle_unexp(struct mrail_recv_queue *recv_queue, uint64_t tag, uint64_t addr, char *data, size_t len, void *context) { struct dlist_entry *entry; struct mrail_unexp_msg_entry *unexp_msg_entry; struct mrail_match_attr match_attr = { .tag = tag, .addr = addr, }; entry = dlist_remove_first_match(&recv_queue->recv_list, recv_queue->match_recv, &match_attr); if (OFI_UNLIKELY(!entry)) { unexp_msg_entry = recv_queue->get_unexp_msg_entry(recv_queue, context); if (!unexp_msg_entry) { FI_WARN(recv_queue->prov, FI_LOG_CQ, "Unable to get unexp_msg_entry!"); assert(0); return NULL; } unexp_msg_entry->addr = addr; unexp_msg_entry->tag = tag; unexp_msg_entry->context = context; memcpy(unexp_msg_entry->data, data, len); FI_DBG(recv_queue->prov, FI_LOG_CQ, "No matching recv found for" " incoming msg with addr: 0x%" PRIx64 " tag: 0x%" PRIx64 "\n", unexp_msg_entry->addr, unexp_msg_entry->tag); FI_DBG(recv_queue->prov, FI_LOG_CQ, "Enqueueing unexp_msg_entry to " "unexpected msg list\n"); dlist_insert_tail(&unexp_msg_entry->entry, &recv_queue->unexp_msg_list); return NULL; } return container_of(entry, struct mrail_recv, entry); }
static int smr_ep_cancel_recv(struct smr_ep *ep, struct smr_queue *queue, void *context) { struct smr_ep_entry *recv_entry; struct dlist_entry *entry; int ret = 0; fastlock_acquire(&ep->util_ep.rx_cq->cq_lock); entry = dlist_remove_first_match(&queue->list, smr_match_recv_ctx, context); if (entry) { recv_entry = container_of(entry, struct smr_ep_entry, entry); ret = ep->rx_comp(ep, (void *) recv_entry->context, recv_entry->flags | FI_RECV, 0, NULL, (void *) recv_entry->addr, recv_entry->tag, 0, FI_ECANCELED); freestack_push(ep->recv_fs, recv_entry); ret = ret ? ret : 1; } fastlock_release(&ep->util_ep.rx_cq->cq_lock); return ret; }
void rxd_ep_check_unexp_msg_list(struct rxd_ep *ep, struct rxd_recv_entry *recv_entry) { struct dlist_entry *match; struct rxd_rx_entry *rx_entry; struct rxd_pkt_data_start *pkt_start; FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "ep->num_unexp_msg: %d\n", ep->num_unexp_msg); match = dlist_remove_first_match(&ep->unexp_msg_list, &rxd_match_unexp_msg, (void *) recv_entry); if (match) { FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "progressing unexp msg entry\n"); dlist_remove(&recv_entry->entry); ep->num_unexp_msg--; rx_entry = container_of(match, struct rxd_rx_entry, unexp_entry); rx_entry->recv = recv_entry; pkt_start = (struct rxd_pkt_data_start *) rx_entry->unexp_buf->buf; rxd_ep_handle_data_msg(ep, rx_entry->peer_info, rx_entry, rx_entry->recv->iov, rx_entry->recv->msg.iov_count, &pkt_start->ctrl, pkt_start->data, rx_entry->unexp_buf); rxd_ep_repost_buff(rx_entry->unexp_buf); } }