/* * register memory */ int mca_mpool_udreg_register(mca_mpool_base_module_t *mpool, void *addr, size_t size, uint32_t flags, mca_mpool_base_registration_t **reg) { mca_mpool_udreg_module_t *mpool_udreg = (mca_mpool_udreg_module_t *) mpool; mca_mpool_base_registration_t *udreg_reg; bool bypass_cache = !!(flags & MCA_MPOOL_FLAGS_CACHE_BYPASS); udreg_entry_t *udreg_entry; udreg_return_t urc; if (false == bypass_cache) { /* Get a udreg entry for this region */ while (UDREG_RC_ERROR_RESOURCE == (urc = UDREG_Register (mpool_udreg->udreg_handle, addr, size, &udreg_entry))) { /* try to remove one unused reg and retry */ if (!mca_mpool_udreg_evict (mpool)) { break; } } udreg_reg = (mca_mpool_base_registration_t *) udreg_entry->device_data; udreg_reg->mpool_context = udreg_entry; } else { /* if cache bypass is requested don't use the udreg cache */ while (NULL == (udreg_reg = mca_mpool_udreg_reg_func (addr, size, mpool))) { /* try to remove one unused reg and retry */ if (!mca_mpool_udreg_evict (mpool)) { break; } } udreg_reg->mpool_context = NULL; } if (NULL == udreg_reg) { return OMPI_ERR_OUT_OF_RESOURCE; } udreg_reg->flags = flags; *reg = udreg_reg; (*reg)->ref_count++; return OMPI_SUCCESS; }
static int __udreg_reg_mr( struct gnix_fid_domain *domain, uint64_t address, uint64_t length, struct _gnix_fi_reg_context *fi_reg_context, void **handle) { udreg_return_t urc; udreg_entry_t *udreg_entry; struct gnix_fid_mem_desc *md; urc = UDREG_Register(domain->udreg_cache, (void *) address, length, &udreg_entry); if (unlikely(urc != UDREG_RC_SUCCESS)) return -FI_EIO; md = udreg_entry->device_data; md->entry = udreg_entry; *handle = md; return FI_SUCCESS; }