static ssize_t psmx_eq_readfrom(struct fid_eq *eq, void *buf, size_t len, void *src_addr, size_t *addrlen) { struct psmx_fid_eq *fid_eq; struct psmx_event *event; fid_eq = container_of(eq, struct psmx_fid_eq, eq); assert(fid_eq->domain); psmx_eq_poll_mq(fid_eq, fid_eq->domain); if (fid_eq->pending_error) return -FI_EAVAIL; if (len < fid_eq->entry_size) return -FI_ETOOSMALL; if (!buf) return -EINVAL; event = psmx_eq_dequeue_event(fid_eq); if (event) { if (!event->error) { memcpy(buf, (void *)&event->eqe, fid_eq->entry_size); psmx_eq_get_event_src_addr(fid_eq, event, src_addr, addrlen); free(event); return fid_eq->entry_size; } else { fid_eq->pending_error = event; return -FI_EAVAIL; } } return 0; }
static inline int psmx_ep_progress(struct psmx_fid_ep *fid_ep) { return psmx_eq_poll_mq(NULL, fid_ep->domain); }