-- Fix bugs related to ELAN_CAPABILITY
-- Make code compatiable with expanded libelan interface to free cmdq. -- Put the pure device_open() related code into a static routine, to be replaced with provided elan_int(). This commit was SVN r2533.
Этот коммит содержится в:
родитель
252f57d673
Коммит
8230d39f77
@ -135,6 +135,7 @@ ompi_elan_attach_network (mca_ptl_elan_state_t * ems)
|
|||||||
elan4_block_inputter (rail->r_ctx, 1);
|
elan4_block_inputter (rail->r_ctx, 1);
|
||||||
|
|
||||||
if (elan4_attach (rail->r_ctx, cap)) {
|
if (elan4_attach (rail->r_ctx, cap)) {
|
||||||
|
perror("can not attach to elan network");
|
||||||
ompi_output (0,
|
ompi_output (0,
|
||||||
"[%s:%d] error in attaching to the network \n",
|
"[%s:%d] error in attaching to the network \n",
|
||||||
__FILE__, __LINE__);
|
__FILE__, __LINE__);
|
||||||
@ -259,57 +260,9 @@ ompi_module_elan_close_procs (mca_ptl_elan_component_t * emp,
|
|||||||
/* FIXME: find the ones that are still there and free them */
|
/* FIXME: find the ones that are still there and free them */
|
||||||
}
|
}
|
||||||
|
|
||||||
ELAN_SLEEP *
|
static int
|
||||||
ompi_init_elan_sleepdesc (mca_ptl_elan_state_t * ems,
|
ompi_elan_device_init (mca_ptl_elan_component_t * emp,
|
||||||
RAIL * rail)
|
mca_ptl_elan_state_t *ems)
|
||||||
{
|
|
||||||
ELAN_SLEEP *es;
|
|
||||||
|
|
||||||
/* XXX: asking the caller to hold the lock */
|
|
||||||
es = MALLOC (sizeof (ELAN_SLEEP));
|
|
||||||
OMPI_PTL_ELAN_CHECK_UNEX (es, NULL, NULL, 0);
|
|
||||||
memset (es, 0, sizeof (ELAN_SLEEP));
|
|
||||||
|
|
||||||
/* Assign next interrupt cookie value */
|
|
||||||
es->es_cookie = ems->intcookie++;
|
|
||||||
|
|
||||||
/* XXX, rail[0] is choosen instead this rail */
|
|
||||||
if (elan4_alloc_intcookie (ems->elan_rail[0]->rail_ctx,
|
|
||||||
es->es_cookie) < 0) {
|
|
||||||
ompi_output (0,
|
|
||||||
"[%s:%d] Failed to allocate IRQ cookie \n",
|
|
||||||
__FILE__, __LINE__);
|
|
||||||
}
|
|
||||||
|
|
||||||
es->es_cmdBlk = ALLOC_ELAN (rail, E4_EVENTBLOCK_SIZE,
|
|
||||||
E4_EVENTBLOCK_SIZE);
|
|
||||||
OMPI_PTL_ELAN_CHECK_UNEX (es->es_cmdBlk, 0, NULL, 0);
|
|
||||||
|
|
||||||
/*Allocate a pair of command queues for blocking waits with */
|
|
||||||
es->es_cmdq = OMPI_PTL_ELAN_ALLOC_CMDQ(rail->r_ctx,
|
|
||||||
rail->r_alloc,
|
|
||||||
CQ_Size1K,
|
|
||||||
(CQ_WriteEnableBit |
|
|
||||||
CQ_WaitEventEnableBit), NULL);
|
|
||||||
OMPI_PTL_ELAN_CHECK_UNEX (es->es_cmdq, NULL, NULL, 0);
|
|
||||||
|
|
||||||
/* This command queue used to fire the IRQ via
|
|
||||||
a cmd port copy event */
|
|
||||||
es->es_ecmdq = OMPI_PTL_ELAN_ALLOC_CMDQ (rail->r_ctx,
|
|
||||||
rail->r_alloc,
|
|
||||||
CQ_Size1K, /* CQ_EnableAllBits, */
|
|
||||||
(CQ_WriteEnableBit
|
|
||||||
| CQ_InterruptEnableBit),
|
|
||||||
NULL);
|
|
||||||
OMPI_PTL_ELAN_CHECK_UNEX (es->es_ecmdq, NULL, NULL, 0);
|
|
||||||
es->es_next = NULL;
|
|
||||||
|
|
||||||
/* XXX: asking the caller to release the lock */
|
|
||||||
return es;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int *rails;
|
int *rails;
|
||||||
@ -357,8 +310,6 @@ mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
|||||||
ELAN_VERSION);
|
ELAN_VERSION);
|
||||||
return OMPI_ERROR;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
ompi_output (0, "Elan version is %s \n", ELAN_VERSION);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocate elan capability from the heap */
|
/* Allocate elan capability from the heap */
|
||||||
@ -375,6 +326,12 @@ mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
|||||||
__FILE__, __LINE__);
|
__FILE__, __LINE__);
|
||||||
return OMPI_ERROR;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
} else if ( elan_getenvCap (ems->elan_cap, 0) < 0 ) {
|
||||||
|
/* Grab the capability from the user environment */
|
||||||
|
ompi_output (0,
|
||||||
|
"[%s:%d] Can't get capability from environment \n",
|
||||||
|
__FILE__, __LINE__);
|
||||||
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((num_rails = ems->elan_nrails = elan_nrails (ems->elan_cap)) <= 0) {
|
if ((num_rails = ems->elan_nrails = elan_nrails (ems->elan_cap)) <= 0) {
|
||||||
@ -413,7 +370,7 @@ mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
|||||||
ems->rail_intcookie = (int *) malloc (sizeof (int) * (num_rails + 1));
|
ems->rail_intcookie = (int *) malloc (sizeof (int) * (num_rails + 1));
|
||||||
OMPI_PTL_ELAN_CHECK_UNEX (ems->rail_intcookie, NULL,
|
OMPI_PTL_ELAN_CHECK_UNEX (ems->rail_intcookie, NULL,
|
||||||
OMPI_ERR_OUT_OF_RESOURCE, 0);
|
OMPI_ERR_OUT_OF_RESOURCE, 0);
|
||||||
memset ((void*)ems->elan_cap, 0, (num_rails + 1) * sizeof (int));
|
memset ((void*)ems->rail_intcookie, 0, (num_rails + 1) * sizeof (int));
|
||||||
ems->rail_intcookie[num_rails] = 0;
|
ems->rail_intcookie[num_rails] = 0;
|
||||||
|
|
||||||
for (i = 0; i < num_rails; i++) {
|
for (i = 0; i < num_rails; i++) {
|
||||||
@ -515,6 +472,78 @@ mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
|||||||
/* Free the local variable */
|
/* Free the local variable */
|
||||||
free (rails);
|
free (rails);
|
||||||
|
|
||||||
|
END_FUNC(PTL_ELAN_DEBUG_INIT);
|
||||||
|
return OMPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ELAN_SLEEP *
|
||||||
|
ompi_init_elan_sleepdesc (mca_ptl_elan_state_t * ems,
|
||||||
|
RAIL * rail)
|
||||||
|
{
|
||||||
|
ELAN_SLEEP *es;
|
||||||
|
|
||||||
|
/* XXX: asking the caller to hold the lock */
|
||||||
|
es = MALLOC (sizeof (ELAN_SLEEP));
|
||||||
|
OMPI_PTL_ELAN_CHECK_UNEX (es, NULL, NULL, 0);
|
||||||
|
memset (es, 0, sizeof (ELAN_SLEEP));
|
||||||
|
|
||||||
|
/* Assign next interrupt cookie value */
|
||||||
|
es->es_cookie = ems->intcookie++;
|
||||||
|
|
||||||
|
/* XXX, rail[0] is choosen instead this rail */
|
||||||
|
if (elan4_alloc_intcookie (ems->elan_rail[0]->rail_ctx,
|
||||||
|
es->es_cookie) < 0) {
|
||||||
|
ompi_output (0,
|
||||||
|
"[%s:%d] Failed to allocate IRQ cookie \n",
|
||||||
|
__FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
es->es_cmdBlk = ALLOC_ELAN (rail, E4_EVENTBLOCK_SIZE,
|
||||||
|
E4_EVENTBLOCK_SIZE);
|
||||||
|
OMPI_PTL_ELAN_CHECK_UNEX (es->es_cmdBlk, 0, NULL, 0);
|
||||||
|
|
||||||
|
/*Allocate a pair of command queues for blocking waits with */
|
||||||
|
es->es_cmdq = OMPI_PTL_ELAN_ALLOC_CMDQ(rail->r_ctx,
|
||||||
|
rail->r_alloc,
|
||||||
|
CQ_Size1K,
|
||||||
|
(CQ_WriteEnableBit |
|
||||||
|
CQ_WaitEventEnableBit), NULL);
|
||||||
|
OMPI_PTL_ELAN_CHECK_UNEX (es->es_cmdq, NULL, NULL, 0);
|
||||||
|
|
||||||
|
/* This command queue used to fire the IRQ via
|
||||||
|
a cmd port copy event */
|
||||||
|
es->es_ecmdq = OMPI_PTL_ELAN_ALLOC_CMDQ (rail->r_ctx,
|
||||||
|
rail->r_alloc,
|
||||||
|
CQ_Size1K, /* CQ_EnableAllBits, */
|
||||||
|
(CQ_WriteEnableBit
|
||||||
|
| CQ_InterruptEnableBit),
|
||||||
|
NULL);
|
||||||
|
OMPI_PTL_ELAN_CHECK_UNEX (es->es_ecmdq, NULL, NULL, 0);
|
||||||
|
es->es_next = NULL;
|
||||||
|
|
||||||
|
/* XXX: asking the caller to release the lock */
|
||||||
|
return es;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mca_ptl_elan_state_init (mca_ptl_elan_component_t * emp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
mca_ptl_elan_state_t * ems = &mca_ptl_elan_global_state;
|
||||||
|
|
||||||
|
#if 1 || defined(PTL_ELAN_DEV_INIT)
|
||||||
|
if (OMPI_SUCCESS != ompi_elan_device_init (emp, ems))
|
||||||
|
return OMPI_ERROR;
|
||||||
|
#else
|
||||||
|
#error Not implemented yet
|
||||||
|
/* Consider using elan_int() later */
|
||||||
|
ELAN_STATE *elan_state;
|
||||||
|
elan_state = elan_init(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
START_FUNC (PTL_ELAN_DEBUG_INIT);
|
||||||
|
|
||||||
ems->elan_ctx = ems->elan_rail[0]->rail_ctx;
|
ems->elan_ctx = ems->elan_rail[0]->rail_ctx;
|
||||||
ems->elan_estate = (void *) ems->all_estates[0];
|
ems->elan_estate = (void *) ems->all_estates[0];
|
||||||
|
|
||||||
@ -567,8 +596,14 @@ mca_ptl_elan_state_finalize (mca_ptl_elan_component_t * emp)
|
|||||||
free (rail->r_railTable);
|
free (rail->r_railTable);
|
||||||
|
|
||||||
/* Free the memory from the rail allocator */
|
/* Free the memory from the rail allocator */
|
||||||
|
#if (QSNETLIBS_VERSION_CODE <= QSNETLIBS_VERSION(1,6,6))
|
||||||
elan4_freeMain (rail->r_alloc, rail->r_ecmdq);
|
elan4_freeMain (rail->r_alloc, rail->r_ecmdq);
|
||||||
elan4_freeMain (rail->r_alloc, rail->r_cmdq);
|
elan4_freeMain (rail->r_alloc, rail->r_cmdq);
|
||||||
|
#else
|
||||||
|
elan4_free_cmdq (rail->r_ctx, rail->r_ecmdq);
|
||||||
|
elan4_free_cmdq (rail->r_ctx, rail->r_cmdq);
|
||||||
|
#endif
|
||||||
|
|
||||||
elan4_freeElan (rail->r_alloc, ems->all_estates[i]);
|
elan4_freeElan (rail->r_alloc, ems->all_estates[i]);
|
||||||
|
|
||||||
/* Since the cookie allocated from rail[0], be consistent here */
|
/* Since the cookie allocated from rail[0], be consistent here */
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user