Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}