int ompi_mtl_portals4_recv_short_link(int count) { int ret = OMPI_SUCCESS; int active = ompi_mtl_portals4.active_recv_short_blocks; int i; if (active < count) { for (i = 0 ; i < (count - active) ; ++i) { ompi_mtl_portals4_recv_short_block_t *block = ompi_mtl_portals4_recv_short_block_alloc(true); if (NULL == block) { return OMPI_ERR_OUT_OF_RESOURCE; } OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); opal_list_append(&ompi_mtl_portals4.recv_short_blocks, &block->base); OPAL_OUTPUT_VERBOSE((10, ompi_mtl_base_framework.framework_output, "recv_short_link: total=%d active=%d", (int) opal_list_get_size(&ompi_mtl_portals4.recv_short_blocks), ompi_mtl_portals4.active_recv_short_blocks)); OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_activate_block(block); } } return ret; }
static int ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, ompi_mtl_portals4_base_request_t* ptl_base_request) { ompi_mtl_portals4_recv_short_request_t *ptl_request = (ompi_mtl_portals4_recv_short_request_t*) ptl_base_request; ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block; if (PTL_EVENT_AUTO_FREE == ev->type) { if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base); ompi_mtl_portals4_recv_short_block_free(block); } else { ompi_mtl_portals4_activate_block(block); } } else if (PTL_EVENT_AUTO_UNLINK == ev->type) { opal_list_remove_item(&ompi_mtl_portals4.active_recv_short_blocks, &block->base); opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base); } else { OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, "OVERFLOW EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data)); } return OMPI_SUCCESS; }
int ompi_mtl_portals4_recv_short_link(int count) { int active = ompi_mtl_portals4.active_recv_short_blocks; int i; if (active < count) { for (i = 0 ; i < (count - active) ; ++i) { ompi_mtl_portals4_recv_short_block_t *block = ompi_mtl_portals4_recv_short_block_alloc(false); if (NULL == block) { return OMPI_ERR_OUT_OF_RESOURCE; } ompi_mtl_portals4_activate_block(block); } } return OMPI_SUCCESS; }
int ompi_mtl_portals4_recv_short_link(int count) { int active = opal_list_get_size(&ompi_mtl_portals4.active_recv_short_blocks); int i; if (active < count) { for (i = 0 ; i < (count - active) ; ++i) { ompi_mtl_portals4_recv_short_block_t *block = ompi_mtl_portals4_recv_short_block_alloc(false); if (NULL == block) { return OMPI_ERR_OUT_OF_RESOURCE; } opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base); ompi_mtl_portals4_activate_block(block); } } return OMPI_SUCCESS; }
int ompi_mtl_portals4_recv_short_init(void) { int i; OBJ_CONSTRUCT(&ompi_mtl_portals4.short_block_mutex, opal_mutex_t); OBJ_CONSTRUCT(&(ompi_mtl_portals4.recv_short_blocks), opal_list_t); /* create the recv blocks */ for (i = 0 ; i < ompi_mtl_portals4.recv_short_num ; ++i) { ompi_mtl_portals4_recv_short_block_t *block = ompi_mtl_portals4_recv_short_block_alloc(false); if (OPAL_UNLIKELY(NULL == block)) { return OMPI_ERR_OUT_OF_RESOURCE; } opal_list_append(&ompi_mtl_portals4.recv_short_blocks, &block->base); ompi_mtl_portals4_activate_block(block); } return OMPI_SUCCESS; }
static int ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, ompi_mtl_portals4_base_request_t* ptl_base_request) { int ret = OMPI_SUCCESS; ompi_mtl_portals4_recv_short_request_t *ptl_request = (ompi_mtl_portals4_recv_short_request_t*) ptl_base_request; ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block; switch (ev->type) { case PTL_EVENT_AUTO_FREE: #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* May be encountered with multi threading */ block->status = BLOCK_STATUS_WAITING_UNLINK; ompi_mtl_portals4.active_recv_short_blocks--; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); OPAL_OUTPUT_VERBOSE((10, ompi_mtl_base_framework.framework_output, "mtl:portals4 PTL_EVENT_AUTO_FREE received before PTL_EVENT_AUTO_UNLINK")); break; case BLOCK_STATUS_WAITING_FREE: /* Normal case */ if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_recv_short_block_free(block); } else { OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_activate_block(block); } break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_AUTO_FREE", __FILE__, __LINE__, block->status); break; } #else if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); ompi_mtl_portals4_recv_short_block_free(block); } else { ompi_mtl_portals4_activate_block(block); } #endif break; case PTL_EVENT_AUTO_UNLINK: block->me_h = PTL_INVALID_HANDLE; #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* Normal case */ block->status = BLOCK_STATUS_WAITING_FREE; ompi_mtl_portals4.active_recv_short_blocks--; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); break; case BLOCK_STATUS_WAITING_UNLINK: /* May be encountered with multi threading */ if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_recv_short_block_free(block); } else { OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); OPAL_OUTPUT_VERBOSE((10, ompi_mtl_base_framework.framework_output, "mtl:portals4 PTL_EVENT_AUTO_UNLINK received after PTL_EVENT_AUTO_FREE")); ret = ompi_mtl_portals4_activate_block(block); } break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_AUTO_UNLINK", __FILE__, __LINE__, block->status); break; } #else block->status = BLOCK_STATUS_WAITING_FREE; ompi_mtl_portals4.active_recv_short_blocks--; #endif break; case PTL_EVENT_LINK: #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_WAITING_LINK: block->status = BLOCK_STATUS_ACTIVATED; ompi_mtl_portals4.active_recv_short_blocks++; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_LINK", __FILE__, __LINE__, block->status); break; } #else block->status = BLOCK_STATUS_ACTIVATED; ompi_mtl_portals4.active_recv_short_blocks++; #endif break; default: OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, "Other EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data)); break; } return ret; }