X-Git-Url: http://git.etherboot.org/mirror/winof/.git/blobdiff_plain/6c86da078c80dce17a39d37dfaf2c9dc6a18919e..7b16cdcc31a2a7778011bdbb0469e29123814829:/ulp/librdmacm/src/cma.cpp diff --git a/ulp/librdmacm/src/cma.cpp b/ulp/librdmacm/src/cma.cpp index 9fb0b25a..7d31c30d 100644 --- a/ulp/librdmacm/src/cma.cpp +++ b/ulp/librdmacm/src/cma.cpp @@ -38,7 +38,6 @@ #include #include "cma.h" #include "..\..\..\etc\user\comp_channel.cpp" -#include "..\..\..\etc\user\dlist.c" static struct ibvw_windata windata; @@ -92,63 +91,49 @@ struct cma_event { static struct cma_device *cma_dev_array; static int cma_dev_cnt; -static void ucma_cleanup(void) -{ - if (cma_dev_cnt > 0) { - while (cma_dev_cnt > 0) { - ibv_close_device(cma_dev_array[--cma_dev_cnt].verbs); - } - delete cma_dev_array; - cma_dev_cnt = 0; - } - if (windata.prov != NULL) { - ibvw_release_windata(&windata, IBVW_WINDATA_VERSION); - windata.prov = NULL; - } -} - static int ucma_init(void) { struct ibv_device **dev_list = NULL; struct cma_device *cma_dev; struct ibv_device_attr attr; - int i, ret; + int i, ret, dev_cnt; EnterCriticalSection(&lock); - if (cma_dev_cnt > 0) { + if (cma_dev_cnt) { goto out; } ret = ibvw_get_windata(&windata, IBVW_WINDATA_VERSION); if (ret) { - goto err; + goto err1; } - dev_list = ibv_get_device_list(&cma_dev_cnt); + dev_list = ibv_get_device_list(&dev_cnt); if (dev_list == NULL) { ret = -1; - goto err; + goto err2; } - cma_dev_array = new struct cma_device[cma_dev_cnt]; + cma_dev_array = new struct cma_device[dev_cnt]; if (cma_dev_array == NULL) { ret = -1; - goto err; + goto err3; } - for (i = 0; dev_list[i]; ++i) { + for (i = 0; dev_list[i];) { cma_dev = &cma_dev_array[i]; cma_dev->guid = ibv_get_device_guid(dev_list[i]); cma_dev->verbs = ibv_open_device(dev_list[i]); if (cma_dev->verbs == NULL) { ret = -1; - goto err; + goto err4; } + ++i; ret = ibv_query_device(cma_dev->verbs, &attr); if (ret) { - goto err; + goto err4; } cma_dev->port_cnt = attr.phys_port_cnt; @@ -156,16 +141,22 @@ static int ucma_init(void) cma_dev->max_responder_resources = (uint8_t) attr.max_qp_rd_atom; } ibv_free_device_list(dev_list); + cma_dev_cnt = dev_cnt; out: LeaveCriticalSection(&lock); return 0; -err: - ucma_cleanup(); - LeaveCriticalSection(&lock); - if (dev_list) { - ibv_free_device_list(dev_list); +err4: + while (i) { + ibv_close_device(cma_dev_array[--i].verbs); } + delete cma_dev_array; +err3: + ibv_free_device_list(dev_list); +err2: + ibvw_release_windata(&windata, IBVW_WINDATA_VERSION); +err1: + LeaveCriticalSection(&lock); return ret; } @@ -498,7 +489,16 @@ int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms) IBAT_PATH_BLOB path; HRESULT hr; - hr = IBAT::Resolve(&id->route.addr.src_addr, &id->route.addr.dst_addr, &path); + do { + hr = IBAT::Resolve(&id->route.addr.src_addr, &id->route.addr.dst_addr, &path); + if (hr != E_PENDING) { + break; + } + timeout_ms -= 10; + if (timeout_ms > 0) + Sleep(10); + } while (timeout_ms > 0); + if (FAILED(hr)) { return hr; } @@ -811,7 +811,7 @@ int rdma_disconnect(struct rdma_cm_id *id) } else { id_priv->state = cma_disconnected; } - hr = id->ep.connect->Disconnect(id->qp->conn_handle, NULL); + hr = id->ep.connect->Disconnect(NULL); if (FAILED(hr)) { return hr; } @@ -987,6 +987,7 @@ int rdma_get_cm_event(struct rdma_event_channel *channel, ret = CompChannelPoll(&channel->channel, &entry); if (ret) { + delete evt; return ret; }