@@ -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