@@ -51,10 +51,10 @@ static void mca_btl_tcp_proc_destruct(mca_btl_tcp_proc_t* proc);
51
51
52
52
struct mca_btl_tcp_proc_data_t {
53
53
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 ;
55
55
size_t num_local_interfaces , max_local_interfaces ;
56
56
size_t num_peer_interfaces ;
57
- int peer_kindex_to_index [ MAX_KERNEL_INTERFACE_INDEX ] ;
57
+ opal_hash_table_t peer_kindex_to_index ;
58
58
unsigned int * best_assignment ;
59
59
int max_assignment_weight ;
60
60
int max_assignment_cardinality ;
@@ -280,8 +280,6 @@ static mca_btl_tcp_interface_t** mca_btl_tcp_retrieve_local_interfaces(mca_btl_t
280
280
if ( NULL == proc_data -> local_interfaces )
281
281
return NULL ;
282
282
283
- memset (proc_data -> local_kindex_to_index , -1 , sizeof (int )* MAX_KERNEL_INTERFACE_INDEX );
284
-
285
283
/* Collect up the list of included and excluded interfaces, if any */
286
284
include = opal_argv_split (mca_btl_tcp_component .tcp_if_include ,',' );
287
285
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
291
289
* the local node
292
290
*/
293
291
for ( idx = opal_ifbegin (); idx >= 0 ; idx = opal_ifnext (idx ) ) {
294
- int kindex , index ;
292
+ int kindex ;
293
+ uint64_t index ;
295
294
bool skip = false;
296
295
297
296
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
340
339
}
341
340
342
341
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 ) ;
344
343
345
344
/* create entry for this kernel index previously not seen */
346
- if ( -1 == index ) {
345
+ if ( OPAL_SUCCESS != rc ) {
347
346
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 , ( void * )( uintptr_t ) index ) ;
349
348
350
349
if ( proc_data -> num_local_interfaces == proc_data -> max_local_interfaces ) {
351
350
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
359
358
mca_btl_tcp_initialise_interface (proc_data -> local_interfaces [index ], kindex , index );
360
359
}
361
360
362
- local_interface = proc_data -> local_interfaces [proc_data -> local_kindex_to_index [ kindex ] ];
361
+ local_interface = proc_data -> local_interfaces [index ];
363
362
switch (local_addr .ss_family ) {
364
363
case AF_INET :
365
364
/* if AF is disabled, skip it completely */
@@ -420,12 +419,17 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
420
419
mca_btl_tcp_interface_t * * peer_interfaces ;
421
420
mca_btl_tcp_proc_data_t _proc_data , * proc_data = & _proc_data ;
422
421
size_t max_peer_interfaces ;
423
- memset (proc_data , 0 , sizeof (mca_btl_tcp_proc_data_t ));
424
422
425
423
if (NULL == (proc_hostname = opal_get_proc_hostname (btl_proc -> proc_opal ))) {
426
424
return OPAL_ERR_UNREACH ;
427
425
}
428
426
427
+ memset (proc_data , 0 , sizeof (mca_btl_tcp_proc_data_t ));
428
+ OBJ_CONSTRUCT (& _proc_data .local_kindex_to_index , opal_hash_table_t );
429
+ opal_hash_table_init (& _proc_data .local_kindex_to_index , 8 );
430
+ OBJ_CONSTRUCT (& _proc_data .peer_kindex_to_index , opal_hash_table_t );
431
+ opal_hash_table_init (& _proc_data .peer_kindex_to_index , 8 );
432
+
429
433
#ifndef WORDS_BIGENDIAN
430
434
/* if we are little endian and our peer is not so lucky, then we
431
435
need to put all information sent to him in big endian (aka
@@ -452,7 +456,6 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
452
456
peer_interfaces = (mca_btl_tcp_interface_t * * )calloc ( max_peer_interfaces , sizeof (mca_btl_tcp_interface_t * ) );
453
457
assert (NULL != peer_interfaces );
454
458
proc_data -> num_peer_interfaces = 0 ;
455
- memset (proc_data -> peer_kindex_to_index , -1 , sizeof (int )* MAX_KERNEL_INTERFACE_INDEX );
456
459
457
460
/*
458
461
* identify all kernel interfaces and the associated addresses of
@@ -461,17 +464,17 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
461
464
462
465
for ( i = 0 ; i < btl_proc -> proc_addr_count ; i ++ ) {
463
466
464
- int index ;
467
+ uint64_t index ;
465
468
466
469
mca_btl_tcp_addr_t * endpoint_addr = btl_proc -> proc_addrs + i ;
467
470
468
471
mca_btl_tcp_proc_tosocks (endpoint_addr , & endpoint_addr_ss );
469
472
470
- index = proc_data -> peer_kindex_to_index [ endpoint_addr -> addr_ifkindex ] ;
473
+ rc = opal_hash_table_get_value_uint32 ( & proc_data -> peer_kindex_to_index , endpoint_addr -> addr_ifkindex , ( void * * ) & index ) ;
471
474
472
- if ( -1 == index ) {
475
+ if ( OPAL_SUCCESS != rc ) {
473
476
index = proc_data -> num_peer_interfaces ++ ;
474
- proc_data -> peer_kindex_to_index [ endpoint_addr -> addr_ifkindex ] = index ;
477
+ opal_hash_table_set_value_uint32 ( & proc_data -> peer_kindex_to_index , endpoint_addr -> addr_ifkindex , ( void * )( uintptr_t ) index ) ;
475
478
if ( proc_data -> num_peer_interfaces == max_peer_interfaces ) {
476
479
max_peer_interfaces <<= 1 ;
477
480
peer_interfaces = (mca_btl_tcp_interface_t * * )realloc ( peer_interfaces ,
@@ -692,6 +695,10 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
692
695
free (proc_data -> weights );
693
696
free (proc_data -> best_addr );
694
697
free (proc_data -> best_assignment );
698
+
699
+ OBJ_DESTRUCT (& _proc_data .local_kindex_to_index );
700
+ OBJ_DESTRUCT (& _proc_data .peer_kindex_to_index );
701
+
695
702
free (a );
696
703
697
704
return rc ;
0 commit comments