/*
 * 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;
}
示例#2
0
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;
}