Пример #1
0
static int __udreg_init(struct gnix_fid_domain *domain)
{
	udreg_return_t urc;

	udreg_cache_attr_t udreg_cache_attr = {
		.cache_name =           {"gnix_app_cache"},
		.max_entries =          domain->udreg_reg_limit,
		.modes =                UDREG_CC_MODE_USE_LARGE_PAGES,
		.debug_mode =           0,
		.debug_rank =           0,
		.reg_context =          (void *) domain,
		.dreg_context =         (void *) domain,
		.destructor_context =   (void *) domain,
		.device_reg_func =      __udreg_register,
		.device_dereg_func =    __udreg_deregister,
		.destructor_callback =  __udreg_cache_destructor,
	};

	if (domain->mr_cache_attr.lazy_deregistration)
		udreg_cache_attr.modes |= UDREG_CC_MODE_USE_LAZY_DEREG;

	/*
	 * Create a udreg cache for application memory registrations.
	 */
	urc = UDREG_CacheCreate(&udreg_cache_attr);
	if (urc != UDREG_RC_SUCCESS) {
		GNIX_FATAL(FI_LOG_MR,
				"Could not initialize udreg application cache, urc=%d\n",
				urc);
	}

	urc = UDREG_CacheAccess(udreg_cache_attr.cache_name, &domain->udreg_cache);
	if (urc != UDREG_RC_SUCCESS) {
		GNIX_FATAL(FI_LOG_MR,
				"Could not access udreg application cache, urc=%d",
				urc);
	}

	domain->mr_is_init = 1;

	return FI_SUCCESS;
}
/*
 *  Initializes the mpool module.
 */
int mca_mpool_udreg_module_init(mca_mpool_udreg_module_t* mpool)
{
    struct udreg_cache_attr cache_attr;
    int urc;

    mpool->super.mpool_component = &mca_mpool_udreg_component.super;
    mpool->super.mpool_base = NULL; /* no base .. */
    mpool->super.mpool_alloc = mca_mpool_udreg_alloc;
    mpool->super.mpool_realloc = mca_mpool_udreg_realloc;
    mpool->super.mpool_free = mca_mpool_udreg_free;
    mpool->super.mpool_register = mca_mpool_udreg_register;
    mpool->super.mpool_find = mca_mpool_udreg_find;
    mpool->super.mpool_deregister = mca_mpool_udreg_deregister;
    /* This module relies on udreg for notification of memory release */
    mpool->super.mpool_release_memory = NULL;
    mpool->super.mpool_finalize = mca_mpool_udreg_finalize;
    mpool->super.mpool_ft_event = mca_mpool_udreg_ft_event;
    mpool->super.flags = MCA_MPOOL_FLAGS_MPI_ALLOC_MEM | MCA_MPOOL_FLAGS_NO_HOOKS;

    if (4096 < mpool->resources.page_size) {
        mpool->huge_page = udreg_find_matching_pagesize (mpool->resources.page_size);
    } else {
        mpool->huge_page = NULL;
    }

    cache_attr.modes = 0;

    /* Create udreg cache */
    if (mpool->resources.use_kernel_cache) {
        cache_attr.modes |= UDREG_CC_MODE_USE_KERNEL_CACHE;
    }

    if (mpool->resources.use_evict_w_unreg) {
        cache_attr.modes |= UDREG_CC_MODE_USE_EVICT_W_UNREG;
    }

    if (mca_mpool_udreg_component.leave_pinned) {
        cache_attr.modes |= UDREG_CC_MODE_USE_LAZY_DEREG;
    }

    strncpy (cache_attr.cache_name, mpool->resources.pool_name, UDREG_MAX_CACHENAME_LEN);
    cache_attr.max_entries         = mpool->resources.max_entries;
    cache_attr.debug_mode          = 0;
    cache_attr.debug_rank          = 0;
    cache_attr.reg_context         = mpool;
    cache_attr.dreg_context        = mpool;
    cache_attr.destructor_context  = mpool;
    cache_attr.device_reg_func     = mca_mpool_udreg_reg_func;
    cache_attr.device_dereg_func   = mca_mpool_udreg_dereg_func;
    cache_attr.destructor_callback = NULL;

    /* attempt to create the udreg cache. this will fail if one already exists */
    (void) UDREG_CacheCreate (&cache_attr);

    urc = UDREG_CacheAccess (mpool->resources.pool_name, (udreg_cache_handle_t *) &mpool->udreg_handle);
    if (UDREG_RC_SUCCESS != urc) {
        return OMPI_ERROR;
    }

    OBJ_CONSTRUCT(&mpool->reg_list, ompi_free_list_t);
    ompi_free_list_init_new(&mpool->reg_list, mpool->resources.sizeof_reg,
                            opal_cache_line_size,
                            OBJ_CLASS(mca_mpool_base_registration_t),
                            0, opal_cache_line_size, 0, -1, 32, NULL);

    return OMPI_SUCCESS;
}