]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
r5529: Fix to destroy QPs in all cases and close the HCA.
authorJames Lentini <jlentini@netapp.com>
Tue, 28 Feb 2006 15:41:03 +0000 (15:41 +0000)
committerJames Lentini <jlentini@netapp.com>
Tue, 28 Feb 2006 15:41:03 +0000 (15:41 +0000)
Signed-off by: Arlin Davis <ardavis@ichips.intel.com>
Signed-off by: James Lentini <jlentini@netapp.com>

dapl/openib_cma/dapl_ib_cm.c
dapl/openib_cma/dapl_ib_cq.c
dapl/openib_cma/dapl_ib_util.c
dapl/openib_cma/dapl_ib_util.h

index 0cb1668a1ed8de417809c508041ee21444021e1e..3ae8742217f38d83e5b6fcf70ea28351404c5339 100644 (file)
@@ -306,15 +306,6 @@ static int dapli_cm_active_cb(struct dapl_cm_id *conn,
        destroy = conn->destroy;
        conn->in_callback = conn->destroy;
        dapl_os_unlock(&conn->lock);
-       if (destroy) {
-               dapl_dbg_log(DAPL_DBG_TYPE_CM, 
-                            " active_cb: DESTROY conn %p id %d \n",
-                            conn, conn->cm_id );
-               if (conn->ep)
-                       conn->ep->cm_handle = IB_INVALID_HANDLE;
-               
-               dapl_os_free(conn, sizeof(*conn));
-       }
        return(destroy);
 }
 
@@ -389,12 +380,6 @@ static int dapli_cm_passive_cb(struct dapl_cm_id *conn,
        destroy = conn->destroy;
        conn->in_callback = conn->destroy;
        dapl_os_unlock(&conn->lock);
-       if (destroy) {
-               if (conn->ep)
-                       conn->ep->cm_handle = IB_INVALID_HANDLE;
-
-               dapl_os_free(conn, sizeof(*conn));
-       }
        return(destroy);
 }
 
@@ -1080,10 +1065,21 @@ void dapli_cma_event_cb(void)
                                ret = dapli_cm_passive_cb(conn,event);
                        else 
                                ret = dapli_cm_active_cb(conn,event);
-                       
-                       if (ret) 
+
+                       /* destroy both qp and cm_id */
+                       if (ret) {
+                               dapl_dbg_log(DAPL_DBG_TYPE_CM, 
+                                            " cma_cb: DESTROY conn %p" 
+                                            " cm_id %p qp %p\n",
+                                            conn, conn->cm_id, 
+                                            conn->cm_id->qp);
+       
+                               if (conn->cm_id->qp)
+                                       rdma_destroy_qp(conn->cm_id);
+
                                rdma_destroy_id(conn->cm_id);
-                       
+                               dapl_os_free(conn, sizeof(*conn));
+                       }
                        break;
                case RDMA_CM_EVENT_CONNECT_RESPONSE:
                default:
@@ -1095,7 +1091,7 @@ void dapli_cma_event_cb(void)
                }
                rdma_ack_cm_event(event);
        } else {
-               dapl_dbg_log(DAPL_DBG_TYPE_WARN,
+               dapl_dbg_log(DAPL_DBG_TYPE_CM,
                        " cm_event: ERROR: rdma_get_cm_event() %d %d %s\n",
                        ret, errno, strerror(errno));
        }
index 5aca8f2e010519961334d4c6bb9bc0ad14c91b65..68dd8f76139af709c9f36e08b34d15b9ba4538db 100644 (file)
@@ -498,7 +498,10 @@ dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,
        if (timeout != DAT_TIMEOUT_INFINITE)
                timeout_ms = timeout/1000;
 
-       status = poll(&cq_fd, 1, timeout_ms);
+       /* restart syscall */
+       while ((status = poll(&cq_fd, 1, timeout_ms)) == -1 )
+               if (errno == EINTR)
+                       continue;
 
        /* returned event */
        if (status > 0) {
@@ -511,13 +514,15 @@ dapls_ib_wait_object_wait(IN ib_wait_obj_handle_t p_cq_wait_obj_handle,
        /* timeout */
        } else if (status == 0) 
                status = ETIMEDOUT;
+       else 
+               status = errno;
        
        dapl_dbg_log(DAPL_DBG_TYPE_UTIL, 
                     " cq_object_wait: RET evd %p ibv_cq %p ibv_ctx %p %s\n",
                     evd_ptr, ibv_cq,ibv_ctx,strerror(errno));
        
        return(dapl_convert_errno(status,"cq_wait_object_wait"));
-       
+
 }
 #endif
 
index 39ceb70e5d0c8809ac3943395e5638f9a0beba18..9083cc3df0768d9115839c8de748250b687986b6 100644 (file)
@@ -330,6 +330,13 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA *hca_ptr)
                hca_ptr->ib_hca_handle = IB_INVALID_HANDLE;
        }
 
+       dapl_os_lock(&g_hca_lock);
+       if (g_ib_thread_state != IB_THREAD_RUN) {
+               dapl_os_unlock(&g_hca_lock);
+               goto bail;
+       }
+       dapl_os_unlock(&g_hca_lock);
+
        /* 
         * Remove hca from async and CQ event processing list
         * Wakeup work thread to remove from polling list
@@ -342,10 +349,12 @@ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA *hca_ptr)
                struct timespec sleep, remain;
                sleep.tv_sec = 0;
                sleep.tv_nsec = 10000000; /* 10 ms */
+               write(g_ib_pipe[1], "w", sizeof "w");
                dapl_dbg_log(DAPL_DBG_TYPE_UTIL, 
                             " ib_thread_destroy: wait on hca %p destroy\n");
                nanosleep (&sleep, &remain);
        }
+bail:
        return (DAT_SUCCESS);
 }
   
index 170cfdd7498cdc83c164dbba15e288f462a2a764..90c55227ee07c3b7e6780e84c56640f32a55ed45 100644 (file)
@@ -295,7 +295,8 @@ dapl_convert_errno( IN int err, IN const char *str )
     if (!err)  return DAT_SUCCESS;
        
 #if DAPL_DBG
-    if ((err != EAGAIN) && (err != ETIME) && (err != ETIMEDOUT))
+    if ((err != EAGAIN) && (err != ETIME) && 
+       (err != ETIMEDOUT) && (err != EINTR))
        dapl_dbg_log (DAPL_DBG_TYPE_ERR," %s %s\n", str, strerror(err));
 #endif