1
1

Protect openib_btl->device data with explicit opal_mitex locks.

Этот коммит содержится в:
Artem Polyakov 2015-12-22 17:21:42 +06:00
родитель e06bffe213
Коммит 3c2f6d5560

Просмотреть файл

@ -210,7 +210,6 @@ static int adjust_cq(mca_btl_openib_device_t *device, const int cq)
return OPAL_ERROR; return OPAL_ERROR;
} }
OPAL_THREAD_LOCK(&device->device_lock);
if (!device->progress) { if (!device->progress) {
int rc; int rc;
device->progress = true; device->progress = true;
@ -219,7 +218,6 @@ static int adjust_cq(mca_btl_openib_device_t *device, const int cq)
return rc; return rc;
} }
} }
OPAL_THREAD_UNLOCK(&device->device_lock);
#endif #endif
} }
#ifdef HAVE_IBV_RESIZE_CQ #ifdef HAVE_IBV_RESIZE_CQ
@ -406,7 +404,7 @@ static int create_srq(mca_btl_openib_module_t *openib_btl)
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
static int mca_btl_openib_size_queues(struct mca_btl_openib_module_t* openib_btl, size_t nprocs) static int mca_btl_openib_size_queues_nolock(struct mca_btl_openib_module_t* openib_btl, size_t nprocs)
{ {
uint32_t send_cqes, recv_cqes; uint32_t send_cqes, recv_cqes;
int rc = OPAL_SUCCESS, qp; int rc = OPAL_SUCCESS, qp;
@ -603,7 +601,7 @@ static int mca_btl_openib_tune_endpoint(mca_btl_openib_module_t* openib_btl,
return OPAL_SUCCESS; return OPAL_SUCCESS;
} }
static int prepare_device_for_use (mca_btl_openib_device_t *device) static int prepare_device_for_use_nolock (mca_btl_openib_device_t *device)
{ {
mca_btl_openib_frag_init_data_t *init_data; mca_btl_openib_frag_init_data_t *init_data;
int rc, length; int rc, length;
@ -920,7 +918,12 @@ static int init_ib_proc_nolock(mca_btl_openib_module_t* openib_btl, mca_btl_open
return OPAL_ERROR; return OPAL_ERROR;
} }
/* protect device because several endpoints for different ib_proc's
* may be simultaneously initialized */
opal_mutex_lock(&openib_btl->device->device_lock);
endpoint->index = opal_pointer_array_add(openib_btl->device->endpoints, (void*)endpoint); endpoint->index = opal_pointer_array_add(openib_btl->device->endpoints, (void*)endpoint);
opal_mutex_unlock(&openib_btl->device->device_lock);
if( 0 > endpoint->index ) { if( 0 > endpoint->index ) {
OBJ_RELEASE(endpoint); OBJ_RELEASE(endpoint);
return OPAL_ERROR; return OPAL_ERROR;
@ -981,21 +984,21 @@ int mca_btl_openib_add_procs(
#endif #endif
/* protect the device */ /* protect the device */
opal_mutex_lock(&mca_btl_openib_component.ib_lock); opal_mutex_lock(&openib_btl->device->device_lock);
rc = prepare_device_for_use (openib_btl->device); rc = prepare_device_for_use_nolock (openib_btl->device);
if (OPAL_SUCCESS != rc) { if (OPAL_SUCCESS != rc) {
BTL_ERROR(("could not prepare openib device for use")); BTL_ERROR(("could not prepare openib device for use"));
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
return rc; return rc;
} }
rc = mca_btl_openib_size_queues(openib_btl, nprocs); rc = mca_btl_openib_size_queues_nolock(openib_btl, nprocs);
if (OPAL_SUCCESS != rc) { if (OPAL_SUCCESS != rc) {
BTL_ERROR(("error creating cqs")); BTL_ERROR(("error creating cqs"));
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
return rc; return rc;
} }
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
for (i = 0, local_procs = 0 ; i < (int) nprocs; i++) { for (i = 0, local_procs = 0 ; i < (int) nprocs; i++) {
struct opal_proc_t* proc = procs[i]; struct opal_proc_t* proc = procs[i];
@ -1075,21 +1078,21 @@ struct mca_btl_base_endpoint_t *mca_btl_openib_get_ep (struct mca_btl_base_modul
// TODO: shift to the separate function // TODO: shift to the separate function
/* protect the device */ /* protect the device */
opal_mutex_lock(&mca_btl_openib_component.ib_lock); opal_mutex_lock(&openib_btl->device->device_lock);
rc = prepare_device_for_use (openib_btl->device); rc = prepare_device_for_use_nolock (openib_btl->device);
if (OPAL_SUCCESS != rc) { if (OPAL_SUCCESS != rc) {
BTL_ERROR(("could not prepare openib device for use")); BTL_ERROR(("could not prepare openib device for use"));
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
return NULL; return NULL;
} }
rc = mca_btl_openib_size_queues(openib_btl, 1); rc = mca_btl_openib_size_queues_nolock(openib_btl, 1);
if (OPAL_SUCCESS != rc) { if (OPAL_SUCCESS != rc) {
BTL_ERROR(("error creating cqs")); BTL_ERROR(("error creating cqs"));
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
return NULL; return NULL;
} }
opal_mutex_unlock(&mca_btl_openib_component.ib_lock); opal_mutex_unlock(&openib_btl->device->device_lock);
if (NULL == (ib_proc = mca_btl_openib_proc_get_locked(proc, &is_new))) { if (NULL == (ib_proc = mca_btl_openib_proc_get_locked(proc, &is_new))) {