static int psmx2_domain_close(fid_t fid) { struct psmx2_fid_domain *domain; domain = container_of(fid, struct psmx2_fid_domain, util_domain.domain_fid.fid); FI_INFO(&psmx2_prov, FI_LOG_DOMAIN, "refcnt=%d\n", ofi_atomic_get32(&domain->util_domain.ref)); psmx2_domain_release(domain); if (ofi_domain_close(&domain->util_domain)) return 0; if (domain->progress_thread_enabled) psmx2_domain_stop_progress(domain); fastlock_destroy(&domain->sep_lock); fastlock_destroy(&domain->vl_lock); rbtDelete(domain->mr_map); fastlock_destroy(&domain->mr_lock); psmx2_trx_ctxt_free(domain->base_trx_ctxt); domain->fabric->active_domain = NULL; free(domain); psmx2_atomic_global_fini(); psmx2_am_global_fini(); return 0; }
static int psmx2_ep_close(fid_t fid) { struct psmx2_fid_ep *ep; struct slist_entry *entry; struct psmx2_context *item; ep = container_of(fid, struct psmx2_fid_ep, ep.fid); if (ep->base_ep) { atomic_dec(&ep->base_ep->ref); return 0; } if (atomic_get(&ep->ref)) return -FI_EBUSY; ep->domain->eps[ep->vlane] = NULL; psmx2_free_vlane(ep->domain, ep->vlane); psmx2_domain_release(ep->domain); while (!slist_empty(&ep->free_context_list)) { entry = slist_remove_head(&ep->free_context_list); item = container_of(entry, struct psmx2_context, list_entry); free(item); } fastlock_destroy(&ep->context_lock); free(ep); return 0; }
static int psmx2_stx_close(fid_t fid) { struct psmx2_fid_stx *stx; stx = container_of(fid, struct psmx2_fid_stx, stx.fid); psmx2_domain_release(stx->domain); free(stx); return 0; }
static int psmx2_mr_close(fid_t fid) { struct psmx2_fid_mr *mr; mr = container_of(fid, struct psmx2_fid_mr, mr.fid); psmx2_mr_release_key(mr->domain, mr->mr.key); psmx2_domain_release(mr->domain); free(mr); return 0; }
static int psmx2_domain_close(fid_t fid) { struct psmx2_fid_domain *domain; FI_INFO(&psmx2_prov, FI_LOG_DOMAIN, "\n"); domain = container_of(fid, struct psmx2_fid_domain, domain.fid); psmx2_domain_release(domain); return 0; }
static int psmx2_av_close(fid_t fid) { struct psmx2_fid_av *av; av = container_of(fid, struct psmx2_fid_av, av.fid); psmx2_domain_release(av->domain); free(av->epids); free(av->epaddrs); free(av->vlanes); free(av); return 0; }
static int psmx2_ep_close(fid_t fid) { struct psmx2_fid_ep *ep; ep = container_of(fid, struct psmx2_fid_ep, ep.fid); ep->domain->eps[ep->vlane] = NULL; psmx2_free_vlane(ep->domain, ep->vlane); psmx2_domain_release(ep->domain); free(ep); return 0; }
static int psmx2_cntr_close(fid_t fid) { struct psmx2_fid_cntr *cntr; cntr = container_of(fid, struct psmx2_fid_cntr, cntr.fid); psmx2_domain_release(cntr->domain); if (cntr->wait && cntr->wait_is_local) fi_close((fid_t)cntr->wait); pthread_mutex_destroy(&cntr->trigger_lock); free(cntr); return 0; }
static int psmx2_stx_close(fid_t fid) { struct psmx2_fid_stx *stx; stx = container_of(fid, struct psmx2_fid_stx, stx.fid); if (ofi_atomic_get32(&stx->ref)) return -FI_EBUSY; psmx2_lock(&stx->domain->trx_ctxt_lock, 1); dlist_remove(&stx->tx->entry); psmx2_unlock(&stx->domain->trx_ctxt_lock, 1); psmx2_trx_ctxt_free(stx->tx); psmx2_domain_release(stx->domain); free(stx); return 0; }
static int psmx2_sep_close(fid_t fid) { struct psmx2_fid_sep *sep; struct psmx2_ep_name ep_name; int i; sep = container_of(fid, struct psmx2_fid_sep, ep.fid); if (ofi_atomic_get32(&sep->ref)) return -FI_EBUSY; for (i = 0; i < sep->ctxt_cnt; i++) { if (sep->ctxts[i].ep && ofi_atomic_get32(&sep->ctxts[i].ep->ref)) return -FI_EBUSY; } ep_name.epid = sep->ctxts[0].trx_ctxt->psm2_epid; ep_name.sep_id = sep->id; ep_name.type = sep->type; ofi_ns_del_local_name(&sep->domain->fabric->name_server, &sep->service, &ep_name); for (i = 0; i < sep->ctxt_cnt; i++) { psmx2_lock(&sep->domain->trx_ctxt_lock, 1); dlist_remove(&sep->ctxts[i].trx_ctxt->entry); psmx2_unlock(&sep->domain->trx_ctxt_lock, 1); if (sep->ctxts[i].ep) psmx2_ep_close_internal(sep->ctxts[i].ep); psmx2_trx_ctxt_free(sep->ctxts[i].trx_ctxt); } psmx2_lock(&sep->domain->sep_lock, 1); dlist_remove(&sep->entry); psmx2_unlock(&sep->domain->sep_lock, 1); psmx2_domain_release(sep->domain); free(sep); return 0; }
static void psmx2_ep_close_internal(struct psmx2_fid_ep *ep) { psmx2_domain_release(ep->domain); PSMX2_EP_FINI_OP_CONTEXT(ep); free(ep); }