@@ -51,10 +51,10 @@ static void mca_btl_tcp_proc_destruct(mca_btl_tcp_proc_t* proc);
5151
5252struct mca_btl_tcp_proc_data_t {
5353 mca_btl_tcp_interface_t * * local_interfaces ;
54- int local_kindex_to_index [ MAX_KERNEL_INTERFACE_INDEX ] ;
54+ opal_hash_table_t local_kindex_to_index ;
5555 size_t num_local_interfaces , max_local_interfaces ;
5656 size_t num_peer_interfaces ;
57- int peer_kindex_to_index [ MAX_KERNEL_INTERFACE_INDEX ] ;
57+ opal_hash_table_t peer_kindex_to_index ;
5858 unsigned int * best_assignment ;
5959 int max_assignment_weight ;
6060 int max_assignment_cardinality ;
@@ -280,8 +280,6 @@ static mca_btl_tcp_interface_t** mca_btl_tcp_retrieve_local_interfaces(mca_btl_t
280280 if ( NULL == proc_data -> local_interfaces )
281281 return NULL ;
282282
283- memset (proc_data -> local_kindex_to_index , -1 , sizeof (int )* MAX_KERNEL_INTERFACE_INDEX );
284-
285283 /* Collect up the list of included and excluded interfaces, if any */
286284 include = opal_argv_split (mca_btl_tcp_component .tcp_if_include ,',' );
287285 exclude = opal_argv_split (mca_btl_tcp_component .tcp_if_exclude ,',' );
@@ -291,7 +289,8 @@ static mca_btl_tcp_interface_t** mca_btl_tcp_retrieve_local_interfaces(mca_btl_t
291289 * the local node
292290 */
293291 for ( idx = opal_ifbegin (); idx >= 0 ; idx = opal_ifnext (idx ) ) {
294- int kindex , index ;
292+ int kindex ;
293+ uint32_t index ;
295294 bool skip = false;
296295
297296 opal_ifindextoaddr (idx , (struct sockaddr * ) & local_addr , sizeof (local_addr ));
@@ -340,12 +339,12 @@ static mca_btl_tcp_interface_t** mca_btl_tcp_retrieve_local_interfaces(mca_btl_t
340339 }
341340
342341 kindex = opal_ifindextokindex (idx );
343- index = proc_data -> local_kindex_to_index [ kindex ] ;
342+ int rc = opal_hash_table_get_value_uint32 ( & proc_data -> local_kindex_to_index , kindex , ( void * * ) & index ) ;
344343
345344 /* create entry for this kernel index previously not seen */
346- if ( -1 == index ) {
345+ if ( OPAL_SUCCESS != rc ) {
347346 index = proc_data -> num_local_interfaces ++ ;
348- proc_data -> local_kindex_to_index [ kindex ] = index ;
347+ opal_hash_table_set_value_uint32 ( & proc_data -> local_kindex_to_index , kindex , & index ) ;
349348
350349 if ( proc_data -> num_local_interfaces == proc_data -> max_local_interfaces ) {
351350 proc_data -> max_local_interfaces <<= 1 ;
@@ -359,7 +358,7 @@ static mca_btl_tcp_interface_t** mca_btl_tcp_retrieve_local_interfaces(mca_btl_t
359358 mca_btl_tcp_initialise_interface (proc_data -> local_interfaces [index ], kindex , index );
360359 }
361360
362- local_interface = proc_data -> local_interfaces [proc_data -> local_kindex_to_index [ kindex ] ];
361+ local_interface = proc_data -> local_interfaces [index ];
363362 switch (local_addr .ss_family ) {
364363 case AF_INET :
365364 /* if AF is disabled, skip it completely */
@@ -420,13 +419,18 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
420419 mca_btl_tcp_interface_t * * peer_interfaces ;
421420 mca_btl_tcp_proc_data_t _proc_data , * proc_data = & _proc_data ;
422421 size_t max_peer_interfaces ;
423- memset (proc_data , 0 , sizeof (mca_btl_tcp_proc_data_t ));
424422 char str_local [128 ], str_remote [128 ];
425423
426424 if (NULL == (proc_hostname = opal_get_proc_hostname (btl_proc -> proc_opal ))) {
427425 return OPAL_ERR_UNREACH ;
428426 }
429427
428+ memset (proc_data , 0 , sizeof (mca_btl_tcp_proc_data_t ));
429+ OBJ_CONSTRUCT (& _proc_data .local_kindex_to_index , opal_hash_table_t );
430+ opal_hash_table_init (& _proc_data .local_kindex_to_index , 8 );
431+ OBJ_CONSTRUCT (& _proc_data .peer_kindex_to_index , opal_hash_table_t );
432+ opal_hash_table_init (& _proc_data .peer_kindex_to_index , 8 );
433+
430434#ifndef WORDS_BIGENDIAN
431435 /* if we are little endian and our peer is not so lucky, then we
432436 need to put all information sent to him in big endian (aka
@@ -453,7 +457,6 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
453457 peer_interfaces = (mca_btl_tcp_interface_t * * )calloc ( max_peer_interfaces , sizeof (mca_btl_tcp_interface_t * ) );
454458 assert (NULL != peer_interfaces );
455459 proc_data -> num_peer_interfaces = 0 ;
456- memset (proc_data -> peer_kindex_to_index , -1 , sizeof (int )* MAX_KERNEL_INTERFACE_INDEX );
457460
458461 /*
459462 * identify all kernel interfaces and the associated addresses of
@@ -462,17 +465,17 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
462465
463466 for ( i = 0 ; i < btl_proc -> proc_addr_count ; i ++ ) {
464467
465- int index ;
468+ uint32_t index ;
466469
467470 mca_btl_tcp_addr_t * endpoint_addr = btl_proc -> proc_addrs + i ;
468471
469472 mca_btl_tcp_proc_tosocks (endpoint_addr , & endpoint_addr_ss );
470473
471- index = proc_data -> peer_kindex_to_index [ endpoint_addr -> addr_ifkindex ] ;
474+ rc = opal_hash_table_get_value_uint32 ( & proc_data -> peer_kindex_to_index , endpoint_addr -> addr_ifkindex , ( void * * ) & index ) ;
472475
473- if ( -1 == index ) {
476+ if ( OPAL_SUCCESS != rc ) {
474477 index = proc_data -> num_peer_interfaces ++ ;
475- proc_data -> peer_kindex_to_index [ endpoint_addr -> addr_ifkindex ] = index ;
478+ opal_hash_table_set_value_uint32 ( & proc_data -> peer_kindex_to_index , endpoint_addr -> addr_ifkindex , & index ) ;
476479 if ( proc_data -> num_peer_interfaces == max_peer_interfaces ) {
477480 max_peer_interfaces <<= 1 ;
478481 peer_interfaces = (mca_btl_tcp_interface_t * * )realloc ( peer_interfaces ,
@@ -726,6 +729,10 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
726729 free (proc_data -> weights );
727730 free (proc_data -> best_addr );
728731 free (proc_data -> best_assignment );
732+
733+ OBJ_DESTRUCT (& _proc_data .local_kindex_to_index );
734+ OBJ_DESTRUCT (& _proc_data .peer_kindex_to_index );
735+
729736 free (a );
730737
731738 return rc ;
0 commit comments