@@ -185,6 +185,7 @@ int ompi_osc_rdma_attach (struct ompi_win_t *win, void *base, size_t len)
185
185
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_TRACE , "attach: %s, %p, %lu" , win -> w_name , base , (unsigned long ) len );
186
186
187
187
OPAL_THREAD_LOCK (& module -> lock );
188
+ ompi_osc_rdma_lock_acquire_exclusive (module , my_peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
188
189
189
190
region_count = module -> state -> region_count & 0xffffffffL ;
190
191
region_id = module -> state -> region_count >> 32 ;
@@ -208,16 +209,11 @@ int ompi_osc_rdma_attach (struct ompi_win_t *win, void *base, size_t len)
208
209
/* validates that the region does not overlap with an existing region even if they are on the same page */
209
210
ret = ompi_osc_rdma_add_attachment (module -> dynamic_handles [region_index ], (intptr_t ) base , len );
210
211
OPAL_THREAD_UNLOCK (& module -> lock );
212
+ ompi_osc_rdma_lock_release_exclusive (module , my_peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
211
213
/* no need to invalidate remote caches */
212
214
return ret ;
213
215
}
214
216
215
- /* region is in flux */
216
- module -> state -> region_count = -1 ;
217
- opal_atomic_wmb ();
218
-
219
- ompi_osc_rdma_lock_acquire_exclusive (module , my_peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
220
-
221
217
/* do a binary seach for where the region should be inserted */
222
218
if (region_count ) {
223
219
region = find_insertion_point ((ompi_osc_rdma_region_t * ) module -> state -> regions , 0 , region_count - 1 ,
@@ -252,6 +248,7 @@ int ompi_osc_rdma_attach (struct ompi_win_t *win, void *base, size_t len)
252
248
if (OPAL_UNLIKELY (OMPI_SUCCESS != ret )) {
253
249
OPAL_THREAD_UNLOCK (& module -> lock );
254
250
OBJ_RELEASE (rdma_region_handle );
251
+ ompi_osc_rdma_lock_release_exclusive (module , my_peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
255
252
return OMPI_ERR_RMA_ATTACH ;
256
253
}
257
254
@@ -274,9 +271,9 @@ int ompi_osc_rdma_attach (struct ompi_win_t *win, void *base, size_t len)
274
271
}
275
272
#endif
276
273
277
- opal_atomic_mb ();
278
274
/* the region state has changed */
279
275
module -> state -> region_count = ((region_id + 1 ) << 32 ) | (region_count + 1 );
276
+ opal_atomic_wmb ();
280
277
281
278
ompi_osc_rdma_lock_release_exclusive (module , my_peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
282
279
OPAL_THREAD_UNLOCK (& module -> lock );
@@ -303,6 +300,9 @@ int ompi_osc_rdma_detach (struct ompi_win_t *win, const void *base)
303
300
304
301
OPAL_THREAD_LOCK (& module -> lock );
305
302
303
+ /* lock the region so it can't change while a peer is reading it */
304
+ ompi_osc_rdma_lock_acquire_exclusive (module , & my_peer -> super , offsetof (ompi_osc_rdma_state_t , regions_lock ));
305
+
306
306
/* the upper 4 bytes of the region count are an instance counter */
307
307
region_count = module -> state -> region_count & 0xffffffffL ;
308
308
region_id = module -> state -> region_count >> 32 ;
@@ -326,23 +326,22 @@ int ompi_osc_rdma_detach (struct ompi_win_t *win, const void *base)
326
326
if (region_index == region_count ) {
327
327
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_INFO , "could not find dynamic memory attachment for %p" , base );
328
328
OPAL_THREAD_UNLOCK (& module -> lock );
329
+ ompi_osc_rdma_lock_release_exclusive (module , & my_peer -> super , offsetof (ompi_osc_rdma_state_t , regions_lock ));
329
330
return OMPI_ERR_BASE ;
330
331
}
331
332
332
333
if (!opal_list_is_empty (& rdma_region_handle -> attachments )) {
333
334
/* another region is referencing this attachment */
335
+ OPAL_THREAD_UNLOCK (& module -> lock );
336
+ ompi_osc_rdma_lock_release_exclusive (module , & my_peer -> super , offsetof (ompi_osc_rdma_state_t , regions_lock ));
334
337
return OMPI_SUCCESS ;
335
338
}
336
339
337
- /* lock the region so it can't change while a peer is reading it */
338
- ompi_osc_rdma_lock_acquire_exclusive (module , & my_peer -> super , offsetof (ompi_osc_rdma_state_t , regions_lock ));
339
-
340
340
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_DEBUG , "detaching dynamic memory region {%p, %p} from index %d" ,
341
341
base , (void * )((intptr_t ) base + region -> len ), region_index );
342
342
343
343
if (module -> selected_btl -> btl_register_mem ) {
344
344
ompi_osc_rdma_deregister (module , rdma_region_handle -> btl_handle );
345
-
346
345
}
347
346
348
347
if (region_index < region_count - 1 ) {
@@ -357,6 +356,7 @@ int ompi_osc_rdma_detach (struct ompi_win_t *win, const void *base)
357
356
module -> dynamic_handles [region_count - 1 ] = NULL ;
358
357
359
358
module -> state -> region_count = ((region_id + 1 ) << 32 ) | (region_count - 1 );
359
+ opal_atomic_wmb ();
360
360
361
361
ompi_osc_rdma_lock_release_exclusive (module , & my_peer -> super , offsetof (ompi_osc_rdma_state_t , regions_lock ));
362
362
@@ -460,14 +460,18 @@ int ompi_osc_rdma_find_dynamic_region (ompi_osc_rdma_module_t *module, ompi_osc_
460
460
ompi_osc_rdma_peer_dynamic_t * dy_peer = (ompi_osc_rdma_peer_dynamic_t * ) peer ;
461
461
intptr_t bound = (intptr_t ) base + len ;
462
462
ompi_osc_rdma_region_t * regions ;
463
- int ret , region_count ;
463
+ int ret = OMPI_SUCCESS , region_count ;
464
464
465
465
OSC_RDMA_VERBOSE (MCA_BASE_VERBOSE_TRACE , "locating dynamic memory region matching: {%" PRIx64 ", %" PRIx64 "}"
466
466
" (len %lu)" , base , base + len , (unsigned long ) len );
467
467
468
+ OPAL_THREAD_LOCK (& module -> lock );
469
+ // Make sure region isn't being touched.
470
+ ompi_osc_rdma_lock_acquire_exclusive (module , peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
468
471
if (!ompi_osc_rdma_peer_local_state (peer )) {
469
472
ret = ompi_osc_rdma_refresh_dynamic_region (module , dy_peer );
470
473
if (OMPI_SUCCESS != ret ) {
474
+ ompi_osc_rdma_lock_release_exclusive (module , peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
471
475
return ret ;
472
476
}
473
477
@@ -481,9 +485,11 @@ int ompi_osc_rdma_find_dynamic_region (ompi_osc_rdma_module_t *module, ompi_osc_
481
485
482
486
* region = ompi_osc_rdma_find_region_containing (regions , 0 , region_count - 1 , (intptr_t ) base , bound , module -> region_size , NULL );
483
487
if (!* region ) {
484
- return OMPI_ERR_RMA_RANGE ;
488
+ ret = OMPI_ERR_RMA_RANGE ;
485
489
}
490
+ OPAL_THREAD_UNLOCK (& module -> lock );
491
+ ompi_osc_rdma_lock_release_exclusive (module , peer , offsetof (ompi_osc_rdma_state_t , regions_lock ));
486
492
487
493
/* round a matching region */
488
- return OMPI_SUCCESS ;
494
+ return ret ;
489
495
}
0 commit comments