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; }
void rxm_cq_progress(struct util_cq *util_cq) { ssize_t ret = 0; struct rxm_cq *rxm_cq; struct fi_cq_tagged_entry *comp; rxm_cq = container_of(util_cq, struct rxm_cq, util_cq); fastlock_acquire(&util_cq->cq_lock); do { if (cirque_isfull(util_cq->cirq)) goto out; comp = cirque_tail(util_cq->cirq); ret = rxm_msg_cq_read(util_cq, rxm_cq->msg_cq, comp); if (ret < 0) goto out; cirque_commit(util_cq->cirq); } while (ret > 0); out: fastlock_release(&util_cq->cq_lock); }