osc/rdma: tighten semantics a bit more
It is not valid to call flush outside a passive target epoch nor is it valid to call lock/lock_all when no_locks is set. In the former we were just semantically incorrect and the later would crash and burn. cmr=v1.7.5:ticket=trac:4382 This commit was SVN r31046. The following Trac tickets were found above: Ticket 4382 --> https://svn.open-mpi.org/trac/ompi/ticket/4382
Этот коммит содержится в:
родитель
1fc9a55d08
Коммит
d0009938a6
@ -187,6 +187,12 @@ int ompi_osc_rdma_lock(int lock_type, int target, int assert, ompi_win_t *win)
|
|||||||
ompi_osc_rdma_outstanding_lock_t *lock;
|
ompi_osc_rdma_outstanding_lock_t *lock;
|
||||||
int ret = OMPI_SUCCESS;
|
int ret = OMPI_SUCCESS;
|
||||||
|
|
||||||
|
/* Check if no_locks is set. TODO: we also need to track whether we are in an
|
||||||
|
* active target epoch. Fence can make this tricky to track. */
|
||||||
|
if (NULL == module->passive_eager_send_active) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
assert(module->epoch_outgoing_frag_count[target] == 0);
|
assert(module->epoch_outgoing_frag_count[target] == 0);
|
||||||
|
|
||||||
OPAL_OUTPUT_VERBOSE((25, ompi_osc_base_framework.framework_output,
|
OPAL_OUTPUT_VERBOSE((25, ompi_osc_base_framework.framework_output,
|
||||||
@ -310,6 +316,12 @@ int ompi_osc_rdma_lock_all(int assert, struct ompi_win_t *win)
|
|||||||
int ret, my_rank = ompi_comm_rank (module->comm);
|
int ret, my_rank = ompi_comm_rank (module->comm);
|
||||||
ompi_osc_rdma_outstanding_lock_t *lock;
|
ompi_osc_rdma_outstanding_lock_t *lock;
|
||||||
|
|
||||||
|
/* Check if no_locks is set. TODO: we also need to track whether we are in an active
|
||||||
|
* target epoch. Fence can make this tricky to track. */
|
||||||
|
if (NULL == module->passive_eager_send_active) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
/* delay all eager sends until we've heard back.. */
|
/* delay all eager sends until we've heard back.. */
|
||||||
OPAL_THREAD_LOCK(&module->lock);
|
OPAL_THREAD_LOCK(&module->lock);
|
||||||
for (int i = 0 ; i < ompi_comm_size(module->comm) ; ++i) {
|
for (int i = 0 ; i < ompi_comm_size(module->comm) ; ++i) {
|
||||||
@ -523,6 +535,11 @@ int ompi_osc_rdma_flush (int target, struct ompi_win_t *win)
|
|||||||
|
|
||||||
assert (0 <= target);
|
assert (0 <= target);
|
||||||
|
|
||||||
|
/* flush is only allowed from within a passive target epoch */
|
||||||
|
if (!module->passive_target_access_epoch) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
OPAL_OUTPUT_VERBOSE((50, ompi_osc_base_framework.framework_output,
|
OPAL_OUTPUT_VERBOSE((50, ompi_osc_base_framework.framework_output,
|
||||||
"ompi_osc_rdma_flush starting..."));
|
"ompi_osc_rdma_flush starting..."));
|
||||||
|
|
||||||
@ -560,6 +577,11 @@ int ompi_osc_rdma_flush_all (struct ompi_win_t *win)
|
|||||||
ompi_osc_rdma_outstanding_lock_t *lock;
|
ompi_osc_rdma_outstanding_lock_t *lock;
|
||||||
int ret = OMPI_SUCCESS;
|
int ret = OMPI_SUCCESS;
|
||||||
|
|
||||||
|
/* flush is only allowed from within a passive target epoch */
|
||||||
|
if (!module->passive_target_access_epoch) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
if (OPAL_UNLIKELY(0 == opal_list_get_size (&module->outstanding_locks))) {
|
if (OPAL_UNLIKELY(0 == opal_list_get_size (&module->outstanding_locks))) {
|
||||||
OPAL_OUTPUT_VERBOSE((25, ompi_osc_base_framework.framework_output,
|
OPAL_OUTPUT_VERBOSE((25, ompi_osc_base_framework.framework_output,
|
||||||
"ompi_osc_rdma_flush_all: no targets are locked in window %s",
|
"ompi_osc_rdma_flush_all: no targets are locked in window %s",
|
||||||
@ -594,6 +616,11 @@ int ompi_osc_rdma_flush_local (int target, struct ompi_win_t *win)
|
|||||||
ompi_osc_rdma_module_t *module = GET_MODULE(win);
|
ompi_osc_rdma_module_t *module = GET_MODULE(win);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* flush is only allowed from within a passive target epoch */
|
||||||
|
if (!module->passive_target_access_epoch) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
OPAL_THREAD_LOCK(&module->lock);
|
OPAL_THREAD_LOCK(&module->lock);
|
||||||
|
|
||||||
ret = ompi_osc_rdma_frag_flush_target(module, target);
|
ret = ompi_osc_rdma_frag_flush_target(module, target);
|
||||||
@ -616,6 +643,11 @@ int ompi_osc_rdma_flush_local_all (struct ompi_win_t *win)
|
|||||||
ompi_osc_rdma_module_t *module = GET_MODULE(win);
|
ompi_osc_rdma_module_t *module = GET_MODULE(win);
|
||||||
int ret = OMPI_SUCCESS;
|
int ret = OMPI_SUCCESS;
|
||||||
|
|
||||||
|
/* flush is only allowed from within a passive target epoch */
|
||||||
|
if (!module->passive_target_access_epoch) {
|
||||||
|
return OMPI_ERR_RMA_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
OPAL_THREAD_LOCK(&module->lock);
|
OPAL_THREAD_LOCK(&module->lock);
|
||||||
|
|
||||||
ret = ompi_osc_rdma_frag_flush_all(module);
|
ret = ompi_osc_rdma_frag_flush_all(module);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user