int usdf_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr, struct fid_cq **cq_o, void *context) { struct usdf_cq *cq; int ret; if (attr->wait_obj != FI_WAIT_NONE) { return -FI_ENOSYS; } cq = calloc(1, sizeof(*cq)); if (cq == NULL) { return -FI_ENOMEM; } cq->cq_domain = container_of(domain, struct usdf_domain, dom_fid); ret = usd_create_cq(cq->cq_domain->dom_dev, attr->size, USD_CQ_NO_GROUP, -1, &cq->cq_cq); if (ret != 0) { goto fail; } cq->cq_fid.fid.fclass = FI_CLASS_CQ; cq->cq_fid.fid.context = context; cq->cq_fid.fid.ops = &usdf_cq_fi_ops; switch (attr->format) { case FI_CQ_FORMAT_CONTEXT: cq->cq_fid.ops = &usdf_cq_context_ops; break; case FI_CQ_FORMAT_MSG: cq->cq_fid.ops = &usdf_cq_msg_ops; break; case FI_CQ_FORMAT_DATA: cq->cq_fid.ops = &usdf_cq_data_ops; break; default: ret = -FI_ENOSYS; goto fail; } *cq_o = &cq->cq_fid; return 0; fail: if (cq != NULL) { if (cq->cq_cq != NULL) { usd_destroy_cq(cq->cq_cq); } free(cq); } return ret; }
int usdf_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr, struct fid_cq **cq_o, void *context) { struct usdf_cq *cq; struct usdf_domain *udp; int ret; USDF_TRACE_SYS(CQ, "\n"); udp = dom_ftou(domain); ret = usdf_cq_process_attr(attr, udp); if (ret != 0) { return ret; } cq = calloc(1, sizeof(*cq)); if (cq == NULL) { return -FI_ENOMEM; } cq->cq_domain = udp; cq->cq_fid.fid.fclass = FI_CLASS_CQ; cq->cq_fid.fid.context = context; cq->cq_fid.fid.ops = &usdf_cq_fi_ops; atomic_initialize(&cq->cq_refcnt, 0); switch (attr->format) { case FI_CQ_FORMAT_CONTEXT: cq->cq_fid.ops = &usdf_cq_context_ops; break; case FI_CQ_FORMAT_MSG: cq->cq_fid.ops = &usdf_cq_msg_ops; break; case FI_CQ_FORMAT_DATA: cq->cq_fid.ops = &usdf_cq_data_ops; break; default: ret = -FI_ENOSYS; goto fail; } cq->cq_attr = *attr; *cq_o = &cq->cq_fid; return 0; fail: if (cq != NULL) { if (cq->c.hard.cq_cq != NULL) { usd_destroy_cq(cq->c.hard.cq_cq); } free(cq); } return ret; }
static int usdf_cq_close(fid_t fid) { struct usdf_cq *cq; struct usdf_cq_hard *hcq; int ret; USDF_TRACE_SYS(CQ, "\n"); cq = container_of(fid, struct usdf_cq, cq_fid.fid); if (atomic_get(&cq->cq_refcnt) > 0) { return -FI_EBUSY; } if (usdf_cq_is_soft(cq)) { while (!TAILQ_EMPTY(&cq->c.soft.cq_list)) { hcq = TAILQ_FIRST(&cq->c.soft.cq_list); if (atomic_get(&hcq->cqh_refcnt) > 0) { return -FI_EBUSY; } TAILQ_REMOVE(&cq->c.soft.cq_list, hcq, cqh_link); if (hcq->cqh_ucq != NULL) { ret = usd_destroy_cq(hcq->cqh_ucq); if (ret != 0) { return ret; } } free(hcq); } } else { if (cq->c.hard.cq_cq) { ret = usd_destroy_cq(cq->c.hard.cq_cq); if (ret != 0) { return ret; } } } free(cq); return 0; }
static int usdf_cq_close(fid_t fid) { struct usdf_cq *cq; int ret; cq = container_of(fid, struct usdf_cq, cq_fid.fid); if (cq->cq_cq) { ret = usd_destroy_cq(cq->cq_cq); if (ret != 0) { return ret; } } free(cq); return 0; }