示例#1
0
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;
}
示例#2
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;
}
示例#3
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;
}
示例#4
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;
}
示例#5
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;
}
示例#6
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;
}
示例#7
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;
}
示例#8
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;
}
示例#9
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;
}
示例#10
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;
}
示例#11
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);
}