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; }