/** * Destroy a slab. * * @param[in] handle Handle to the allocator being used. * @param[in] slab Slab to be destroyed. * * @return FI_SUCCESS On successful slab destruction. * * @return -FI_EINVAL On invalid handle or slab being given as parameters. */ static int __destroy_slab(struct gnix_mbox_alloc_handle *handle, struct gnix_slab *slab) { size_t total_size; GNIX_TRACE(FI_LOG_EP_CTRL, "\n"); if (!handle || !slab) { GNIX_WARN(FI_LOG_EP_CTRL, "Invalid argument handle or slab.\n"); return -FI_EINVAL; } total_size = handle->page_size * __page_count(handle); _gnix_free_bitmap(slab->used); free(slab->used); COND_ACQUIRE(handle->nic_handle->requires_lock, &handle->nic_handle->lock); GNI_MemDeregister(handle->nic_handle->gni_nic_hndl, &slab->memory_handle); COND_RELEASE(handle->nic_handle->requires_lock, &handle->nic_handle->lock); munmap(slab->base, total_size); free(slab); return FI_SUCCESS; }
static int __gnix_deregister_region( void *handle, void *context) { struct gnix_fid_mem_desc *mr = (struct gnix_fid_mem_desc *) handle; gni_return_t ret; struct gnix_fid_domain *domain; struct gnix_nic *nic; domain = mr->domain; nic = mr->nic; COND_ACQUIRE(nic->requires_lock, &nic->lock); ret = GNI_MemDeregister(nic->gni_nic_hndl, &mr->mem_hndl); COND_RELEASE(nic->requires_lock, &nic->lock); if (ret == GNI_RC_SUCCESS) { /* release reference to domain */ _gnix_ref_put(domain); /* release reference to nic */ _gnix_ref_put(nic); } else { GNIX_INFO(FI_LOG_MR, "failed to deregister memory" " region, entry=%p ret=%i\n", handle, ret); } return ret; }
static ucs_status_t uct_ugni_smsg_mbox_dereg(uct_ugni_smsg_iface_t *iface, uct_ugni_smsg_mbox_t *mbox){ gni_return_t ugni_rc; uct_ugni_cdm_lock(&iface->super.cdm); ugni_rc = GNI_MemDeregister(uct_ugni_iface_nic_handle(&iface->super), &mbox->gni_mem); uct_ugni_cdm_unlock(&iface->super.cdm); if (GNI_RC_SUCCESS != ugni_rc) { ucs_error("GNI_MemDeregister failed Error status: %s %d", gni_err_str[ugni_rc], ugni_rc); return UCS_ERR_IO_ERROR; } return UCS_OK; }
static ucs_status_t uct_ugni_smsg_mbox_dereg(uct_ugni_smsg_iface_t *iface, uct_ugni_smsg_mbox_t *mbox){ gni_return_t ugni_rc; pthread_mutex_lock(&uct_ugni_global_lock); ugni_rc = GNI_MemDeregister(iface->super.nic_handle, &mbox->gni_mem); pthread_mutex_unlock(&uct_ugni_global_lock); if (GNI_RC_SUCCESS != ugni_rc) { ucs_error("GNI_MemDeegister failed Error status: %s %d", gni_err_str[ugni_rc], ugni_rc); return UCS_ERR_IO_ERROR; } return UCS_OK; }
static ucs_status_t uct_ugni_mem_dereg(uct_md_h md, uct_mem_h memh) { uct_ugni_md_t *ugni_md = ucs_derived_of(md, uct_ugni_md_t); gni_mem_handle_t *mem_hndl = (gni_mem_handle_t *) memh; gni_return_t ugni_rc; ucs_status_t status = UCS_OK; pthread_mutex_lock(&uct_ugni_global_lock); ugni_rc = GNI_MemDeregister(ugni_md->nic_handle, mem_hndl); if (GNI_RC_SUCCESS != ugni_rc) { ucs_error("GNI_MemDeregister failed, Error status: %s %d", gni_err_str[ugni_rc], ugni_rc); status = UCS_ERR_IO_ERROR; } ucs_free(mem_hndl); pthread_mutex_unlock(&uct_ugni_global_lock); return status; }
/* * release resources previously set up for remote * GNI_PostCqWrite's to target */ static int __nic_teardown_irq_cq(struct gnix_nic *nic) { int ret = FI_SUCCESS; gni_return_t status; if (nic == NULL) return ret; if (nic->irq_mmap_addr == NULL) return ret; status = GNI_MemDeregister(nic->gni_nic_hndl, &nic->irq_mem_hndl); if (status != GNI_RC_SUCCESS) { ret = gnixu_to_fi_errno(status); GNIX_WARN(FI_LOG_EP_CTRL, "GNI_MemDeregister returned %s\n", gni_err_str[status]); } munmap(nic->irq_mmap_addr, nic->irq_mmap_len); return ret; }