@@ -692,6 +692,14 @@ static inline int coll_acoll_init(mca_coll_base_module_t *module, ompi_communica
692
692
ret = OMPI_ERR_OUT_OF_RESOURCE ;
693
693
goto error_hndl ;
694
694
}
695
+ data -> xpmem_reg_tracker_ht = NULL ;
696
+ data -> xpmem_reg_tracker_ht = (opal_hash_table_t * * ) malloc (sizeof (opal_hash_table_t * ) * size );
697
+ if (NULL == data -> xpmem_reg_tracker_ht ) {
698
+ line = __LINE__ ;
699
+ ret = OMPI_ERR_OUT_OF_RESOURCE ;
700
+ goto error_hndl ;
701
+ }
702
+
695
703
seg_id = xpmem_make (0 , XPMEM_MAXADDR_SIZE , XPMEM_PERMIT_MODE , (void * ) 0666 );
696
704
if (-1 == seg_id ) {
697
705
line = __LINE__ ;
@@ -733,6 +741,8 @@ static inline int coll_acoll_init(mca_coll_base_module_t *module, ompi_communica
733
741
line = __LINE__ ;
734
742
goto error_hndl ;
735
743
}
744
+ data -> xpmem_reg_tracker_ht [i ] = OBJ_NEW (opal_hash_table_t );
745
+ opal_hash_table_init (data -> xpmem_reg_tracker_ht [i ], 2048 );
736
746
}
737
747
}
738
748
#endif
@@ -831,6 +841,8 @@ static inline int coll_acoll_init(mca_coll_base_module_t *module, ompi_communica
831
841
data -> xpmem_saddr = NULL ;
832
842
free (data -> xpmem_raddr );
833
843
data -> xpmem_raddr = NULL ;
844
+ free (data -> xpmem_reg_tracker_ht );
845
+ data -> xpmem_reg_tracker_ht = NULL ;
834
846
free (data -> rcache );
835
847
data -> rcache = NULL ;
836
848
free (data -> scratch );
@@ -851,6 +863,25 @@ static inline int coll_acoll_init(mca_coll_base_module_t *module, ompi_communica
851
863
}
852
864
853
865
#ifdef HAVE_XPMEM_H
866
+ static inline void update_rcache_reg_hashtable_entry
867
+ (struct acoll_xpmem_rcache_reg_t * reg ,
868
+ opal_hash_table_t * ht )
869
+ {
870
+ // Converting pointer to uint64 to use as key.
871
+ uint64_t key = (uint64_t )reg ;
872
+ // Converting uint64_t to pointer type to use for value.
873
+ uint64_t value = 1 ;
874
+ int ht_ret = opal_hash_table_get_value_uint64 (ht , key , (void * * )(& value ));
875
+
876
+ if (OPAL_ERR_NOT_FOUND == ht_ret ) {
877
+ value = 1 ;
878
+ opal_hash_table_set_value_uint64 (ht , key , (void * )(value ));
879
+ } else if (OPAL_SUCCESS == ht_ret ) {
880
+ value += 1 ;
881
+ opal_hash_table_set_value_uint64 (ht , key , (void * )(value ));
882
+ }
883
+ }
884
+
854
885
static inline void register_and_cache (int size , size_t total_dsize , int rank ,
855
886
coll_acoll_data_t * data )
856
887
{
@@ -870,6 +901,8 @@ static inline void register_and_cache(int size, size_t total_dsize, int rank,
870
901
sbuf_reg = NULL ;
871
902
return ;
872
903
}
904
+ update_rcache_reg_hashtable_entry (sbuf_reg , data -> xpmem_reg_tracker_ht [i ]);
905
+
873
906
data -> xpmem_saddr [i ] = (void * ) ((uintptr_t ) sbuf_reg -> xpmem_vaddr
874
907
+ ((uintptr_t ) data -> allshm_sbuf [i ]
875
908
- (uintptr_t ) sbuf_reg -> base .base ));
@@ -884,6 +917,8 @@ static inline void register_and_cache(int size, size_t total_dsize, int rank,
884
917
rbuf_reg = NULL ;
885
918
return ;
886
919
}
920
+ update_rcache_reg_hashtable_entry (rbuf_reg , data -> xpmem_reg_tracker_ht [i ]);
921
+
887
922
data -> xpmem_raddr [i ] = (void * ) ((uintptr_t ) rbuf_reg -> xpmem_vaddr
888
923
+ ((uintptr_t ) data -> allshm_rbuf [i ]
889
924
- (uintptr_t ) rbuf_reg -> base .base ));
0 commit comments