James Lentini wrote:
void dapli_destroy_conn(struct dapl_cm_id *conn)
{
        int in_callback;
+       struct rdma_cm_id *cm_id;

dapl_dbg_log(DAPL_DBG_TYPE_CM, " destroy_conn: conn %p id %d\n",
                     conn,conn->cm_id);
-
        dapl_os_lock(&conn->lock);
        conn->destroy = 1;
        in_callback = conn->in_callback;
-       dapl_os_unlock(&conn->lock);
-
-       if (!in_callback) {
-               if (conn->ep)
-                       conn->ep->cm_handle = IB_INVALID_HANDLE;
-               if (conn->cm_id) {
-                       if (conn->cm_id->qp)
-                               rdma_destroy_qp(conn->cm_id);
-                       rdma_destroy_id(conn->cm_id);
+       do {
+               if (in_callback) {
+                       dapl_os_unlock(&conn->lock);
+                       usleep(10);
+                       dapl_os_lock(&conn->lock);

In general this doesn't work. The calling thread may be the callback thread, which would lead to deadlock. This is why we don't just call rdma_destroy_id() directly, and let it wait for the callback to complete.

- Sean

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to