@@ -41,23 +41,27 @@ OSHMEM_DECLSPEC int mca_memheap_base_select(void);
4141extern  int  mca_memheap_base_already_opened ;
4242extern  int  mca_memheap_base_key_exchange ;
4343
44- #define  MCA_MEMHEAP_MAX_SEGMENTS     4 
45- #define  HEAP_SEG_INDEX   0
46- #define  SYMB_SEG_INDEX   1
47- #define  MCA_MEMHEAP_SEG_COUNT   (SYMB_SEG_INDEX+1)
44+ #define  MCA_MEMHEAP_MAX_SEGMENTS     8
45+ #define  HEAP_SEG_INDEX               0
4846
4947#define  MEMHEAP_SEG_INVALID   0xFFFF
5048
5149
50+ typedef  struct  mca_memheap_base_config  {
51+     long             device_nic_mem_seg_size ; /* Used for SHMEM_HINT_DEVICE_NIC_MEM */ 
52+ } mca_memheap_base_config_t ;
53+ 
54+ 
5255typedef  struct  mca_memheap_map  {
5356    map_segment_t    mem_segs [MCA_MEMHEAP_MAX_SEGMENTS ]; /* TODO: change into pointer array */ 
5457    int              n_segments ;
5558    int              num_transports ;
5659} mca_memheap_map_t ;
5760
5861extern  mca_memheap_map_t  mca_memheap_base_map ;
62+ extern  mca_memheap_base_config_t  mca_memheap_base_config ;
5963
60- int  mca_memheap_base_alloc_init (mca_memheap_map_t  * , size_t );
64+ int  mca_memheap_base_alloc_init (mca_memheap_map_t  * , size_t ,  long );
6165void  mca_memheap_base_alloc_exit (mca_memheap_map_t  * );
6266int  mca_memheap_base_static_init (mca_memheap_map_t  * );
6367void  mca_memheap_base_static_exit (mca_memheap_map_t  * );
@@ -173,10 +177,12 @@ static inline int memheap_is_va_in_segment(void *va, int segno)
173177
174178static  inline  int  memheap_find_segnum (void  * va )
175179{
176-     if  (OPAL_LIKELY (memheap_is_va_in_segment (va , SYMB_SEG_INDEX ))) {
177-         return  SYMB_SEG_INDEX ;
178-     } else  if  (memheap_is_va_in_segment (va , HEAP_SEG_INDEX )) {
179-         return  HEAP_SEG_INDEX ;
180+     int  i ;
181+ 
182+     for  (i  =  0 ; i  <  mca_memheap_base_map .n_segments ; i ++ ) {
183+         if  (memheap_is_va_in_segment (va , i )) {
184+             return  i ;
185+         }
180186    }
181187    return  MEMHEAP_SEG_INVALID ;
182188}
@@ -193,18 +199,17 @@ static inline void *map_segment_va2rva(mkey_segment_t *seg, void *va)
193199    return  memheap_va2rva (va , seg -> super .va_base , seg -> rva_base );
194200}
195201
196- static  inline  map_base_segment_t  * map_segment_find_va (map_base_segment_t  * segs , size_t  elem_size , void  * va ) 
202+ static  inline  map_base_segment_t  * map_segment_find_va (map_base_segment_t  * segs ,
203+                                                       size_t  elem_size , void  * va )
197204{
198205    map_base_segment_t  * rseg ;
206+     int  i ;
199207
200-     rseg  =  (map_base_segment_t  * )((char  * )segs  +  elem_size  *  HEAP_SEG_INDEX );
201-     if  (OPAL_LIKELY (map_segment_is_va_in (rseg , va ))) {
202-         return  rseg ;
203-     } 
204- 
205-     rseg  =  (map_base_segment_t  * )((char  * )segs  +  elem_size  *  SYMB_SEG_INDEX );
206-     if  (OPAL_LIKELY (map_segment_is_va_in (rseg , va ))) {
207-         return  rseg ;
208+     for  (i  =  0 ; i  <  MCA_MEMHEAP_MAX_SEGMENTS ; i ++ ) {
209+         rseg  =  (map_base_segment_t  * )((char  * )segs  +  elem_size  *  i );
210+         if  (OPAL_LIKELY (map_segment_is_va_in (rseg , va ))) {
211+             return  rseg ;
212+         }
208213    }
209214
210215    return  NULL ;
@@ -214,21 +219,14 @@ void mkey_segment_init(mkey_segment_t *seg, sshmem_mkey_t *mkey, uint32_t segno)
214219
215220static  inline  map_segment_t  * memheap_find_va (void *  va )
216221{
217-     map_segment_t  * s ;
218- 
219-     /* most probably there will be only two segments: heap and global data */ 
220-     if  (OPAL_LIKELY (memheap_is_va_in_segment (va , SYMB_SEG_INDEX ))) {
221-         s  =  & memheap_map -> mem_segs [SYMB_SEG_INDEX ];
222-     } else  if  (memheap_is_va_in_segment (va , HEAP_SEG_INDEX )) {
223-         s  =  & memheap_map -> mem_segs [HEAP_SEG_INDEX ];
224-     } else  if  (memheap_map -> n_segments  -  2  >  0 ) {
225-         s  =  bsearch (va ,
226-                     & memheap_map -> mem_segs [SYMB_SEG_INDEX + 1 ],
227-                     memheap_map -> n_segments  -  2 ,
228-                     sizeof (* s ),
229-                     mca_memheap_seg_cmp );
230-     } else  {
231-         s  =  NULL ;
222+     map_segment_t  * s  =  NULL ;
223+     int  i ;
224+ 
225+     for  (i  =  0 ; i  <  memheap_map -> n_segments ; i ++ ) {
226+         if  (memheap_is_va_in_segment (va , i )) {
227+             s  =  & memheap_map -> mem_segs [i ];
228+             break ;
229+         }
232230    }
233231
234232#if  MEMHEAP_BASE_DEBUG  ==  1 
0 commit comments