]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
Fix memory leak in provider specific post send/recv if there's
authorPatrick Marchand Latifi <patrick.latifi@qlogic.com>
Wed, 20 Feb 2008 00:49:45 +0000 (16:49 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Sat, 23 Feb 2008 00:21:35 +0000 (16:21 -0800)
more than DEFAULT_DS_ENTRIES iovecs.

Signed-off-by: Patrick Marchand Latifi <patrick.latifi@qlogic.com>
dapl/openib/dapl_ib_dto.h
dapl/openib_cma/dapl_ib_dto.h
dapl/openib_scm/dapl_ib_dto.h

index c42ea8d6220524e41b1d881d3cebe113029d1bd0..8b0e8fef2bdfa3606f2b4242da33c20bb9a2463d 100644 (file)
@@ -67,10 +67,11 @@ dapls_ib_post_recv (
        IN  DAT_LMR_TRIPLET     *local_iov )
 {
        ib_data_segment_t       ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t       *ds_array_p;
+       ib_data_segment_t       *ds_array_p, *ds_array_start_p;
        struct ibv_recv_wr      wr;
        struct ibv_recv_wr      *bad_wr;
        DAT_COUNT               i, total_len;
+       int                     ret;
        
        dapl_dbg_log (DAPL_DBG_TYPE_EP,
                      " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
@@ -79,7 +80,8 @@ dapls_ib_post_recv (
        if ( segments <= DEFAULT_DS_ENTRIES ) 
                ds_array_p = ds_array;
        else
-               ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t));
+               ds_array_start_p = ds_array_p =
+                       dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
@@ -112,9 +114,14 @@ dapls_ib_post_recv (
        if (cookie != NULL) 
                cookie->val.dto.size = total_len;
 
-       if (ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+       ret = ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr);
        
+       if (segments > DEFAULT_DS_ENTRIES)
+               dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+
        return DAT_SUCCESS;
 }
 
@@ -140,11 +147,12 @@ dapls_ib_post_send (
                      remote_iov, completion_flags);
 
        ib_data_segment_t       ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t       *ds_array_p;
+       ib_data_segment_t       *ds_array_p, *ds_array_start_p;
        struct ibv_send_wr      wr;
        struct ibv_send_wr      *bad_wr;
        ib_hca_transport_t      *ibt_ptr = &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
        DAT_COUNT               i, total_len;
+       int                     ret;
        
        dapl_dbg_log (DAPL_DBG_TYPE_EP,
                      " post_snd: ep %p cookie %p segs %d l_iov %p\n",
@@ -153,7 +161,8 @@ dapls_ib_post_send (
        if( segments <= DEFAULT_DS_ENTRIES ) 
                ds_array_p = ds_array;
        else
-               ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t));
+               ds_array_start_p = ds_array_p =
+                       dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
@@ -213,9 +222,14 @@ dapls_ib_post_send (
                      " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
                        wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
 
-       if (ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);
        
+       if (segments > DEFAULT_DS_ENTRIES)
+               dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_send") );
+
        dapl_dbg_log (DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }
index c61ef615bcef8e687171eac266dfa446cee8fde6..4f077de0b9fe3a39d386c7dbaa8e29a79d6563dd 100644 (file)
@@ -67,10 +67,11 @@ dapls_ib_post_recv (
        IN  DAT_LMR_TRIPLET     *local_iov )
 {
        ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p;
+       ib_data_segment_t *ds_array_p, *ds_array_start_p;
        struct ibv_recv_wr wr;
        struct ibv_recv_wr *bad_wr;
        DAT_COUNT i, total_len;
+       int ret;
        
        dapl_dbg_log(DAPL_DBG_TYPE_EP,
                     " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
@@ -79,7 +80,7 @@ dapls_ib_post_recv (
        if (segments <= DEFAULT_DS_ENTRIES) 
                ds_array_p = ds_array;
        else
-               ds_array_p = 
+               ds_array_start_p = ds_array_p = 
                        dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
@@ -113,9 +114,14 @@ dapls_ib_post_recv (
        if (cookie != NULL) 
                cookie->val.dto.size = total_len;
 
-       if (ibv_post_recv(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+       ret = ibv_post_recv(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
        
+       if (segments > DEFAULT_DS_ENTRIES)
+           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+
        return DAT_SUCCESS;
 }
 
@@ -142,12 +148,13 @@ dapls_ib_post_send (
                     remote_iov, completion_flags);
 
        ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p;
+       ib_data_segment_t *ds_array_p, *ds_array_start_p;
        struct ibv_send_wr wr;
        struct ibv_send_wr *bad_wr;
        ib_hca_transport_t *ibt_ptr = 
                &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
        DAT_COUNT i, total_len;
+       int ret;
        
        dapl_dbg_log(DAPL_DBG_TYPE_EP,
                     " post_snd: ep %p cookie %p segs %d l_iov %p\n",
@@ -156,7 +163,7 @@ dapls_ib_post_send (
        if(segments <= DEFAULT_DS_ENTRIES) 
                ds_array_p = ds_array;
        else
-               ds_array_p = 
+               ds_array_start_p = ds_array_p = 
                        dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
@@ -217,9 +224,14 @@ dapls_ib_post_send (
                     " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
                     wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
 
-       if (ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
-       
+       ret = ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
+
+       if (segments > DEFAULT_DS_ENTRIES)
+           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_send") );
+
        dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }
index c019cc8eb5428a4f1549bc6c8db64eb98537dbf9..cede8762d99438ea7bf1d21de0db2326b4070d1f 100644 (file)
@@ -67,10 +67,11 @@ dapls_ib_post_recv (
        IN  DAT_LMR_TRIPLET     *local_iov )
 {
        ib_data_segment_t       ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t       *ds_array_p;
+       ib_data_segment_t       *ds_array_p, *ds_array_start_p;
        struct ibv_recv_wr      wr;
        struct ibv_recv_wr      *bad_wr;
        DAT_COUNT               i, total_len;
+       int                     ret;
        
        dapl_dbg_log (DAPL_DBG_TYPE_EP,
                      " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
@@ -79,7 +80,8 @@ dapls_ib_post_recv (
        if ( segments <= DEFAULT_DS_ENTRIES ) 
                ds_array_p = ds_array;
        else
-               ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t));
+               ds_array_start_p = ds_array_p =
+                       dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
@@ -112,9 +114,14 @@ dapls_ib_post_recv (
        if (cookie != NULL) 
                cookie->val.dto.size = total_len;
 
-       if (ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+       ret = ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr);
        
+       if (segments > DEFAULT_DS_ENTRIES)
+               dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+
        return DAT_SUCCESS;
 }
 
@@ -140,11 +147,12 @@ dapls_ib_post_send (
                      remote_iov, completion_flags);
 
        ib_data_segment_t       ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t       *ds_array_p;
+       ib_data_segment_t       *ds_array_p, *ds_array_start_p;
        struct ibv_send_wr      wr;
        struct ibv_send_wr      *bad_wr;
        ib_hca_transport_t      *ibt_ptr = &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
        DAT_COUNT               i, total_len;
+       int                     ret;
        
        dapl_dbg_log (DAPL_DBG_TYPE_EP,
                      " post_snd: ep %p cookie %p segs %d l_iov %p\n",
@@ -153,7 +161,8 @@ dapls_ib_post_send (
        if( segments <= DEFAULT_DS_ENTRIES ) 
                ds_array_p = ds_array;
        else
-               ds_array_p = dapl_os_alloc(segments * sizeof(ib_data_segment_t));
+               ds_array_start_p = ds_array_p =
+                       dapl_os_alloc(segments * sizeof(ib_data_segment_t));
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
@@ -213,9 +222,14 @@ dapls_ib_post_send (
                      " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", 
                        wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge);
 
-       if (ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr))
-               return( dapl_convert_errno(EFAULT,"ibv_recv") );
+       ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);
        
+       if (segments > DEFAULT_DS_ENTRIES)
+               dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
+
+       if (ret)
+               return( dapl_convert_errno(EFAULT,"ibv_send") );
+
        dapl_dbg_log (DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }