]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge
authorArlin Davis <arlin.r.davis@intel.com>
Wed, 29 Apr 2009 17:49:09 +0000 (10:49 -0700)
committerArlin Davis <arlin.r.davis@intel.com>
Wed, 29 Apr 2009 17:49:09 +0000 (10:49 -0700)
no need to rebuild scatter gather list given that DAT v2.0
is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef.

Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
dapl/openib_cma/dapl_ib_dto.h
dapl/openib_cma/dapl_ib_util.h
dapl/openib_scm/dapl_ib_dto.h
dapl/openib_scm/dapl_ib_util.h

index feaba6e286ce0baa3363971498751d415ff5f7dd..d97c26b3ebbffa9497a38ddc653b34ae05683863 100644 (file)
@@ -54,8 +54,6 @@
 #include <dat2/dat_ib_extensions.h>
 #endif
 
-#define        DEFAULT_DS_ENTRIES      8
-
 STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p);
 
 /*
@@ -70,10 +68,9 @@ dapls_ib_post_recv (
        IN  DAT_COUNT           segments,
        IN  DAT_LMR_TRIPLET     *local_iov )
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_recv_wr wr;
        struct ibv_recv_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        DAT_COUNT i, total_len;
        int ret;
        
@@ -81,48 +78,26 @@ dapls_ib_post_recv (
                     " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
                     ep_ptr, cookie, segments, local_iov);
 
-       if (segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-
        /* setup work request */
        total_len = 0;
        wr.next = 0;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
-
-       for (i = 0; i < segments; i++) {
-               if (!local_iov[i].segment_length)
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_rcv: l_key 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       wr.sg_list = ds;
+
+       if (cookie != NULL) { 
+               for (i = 0; i < segments; i++) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_rcv: l_key 0x%x va %p len %d\n",
+                                    ds->lkey, ds->addr, ds->length);
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        ret = ibv_post_recv(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
        
-       if (ds_array_start_p != NULL)
-           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
-
        if (ret)
                return( dapl_convert_errno(errno,"ibv_recv") );
 
@@ -147,10 +122,9 @@ dapls_ib_post_send (
        IN  const DAT_RMR_TRIPLET       *remote_iov,
        IN  DAT_COMPLETION_FLAGS        completion_flags)
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_send_wr wr;
        struct ibv_send_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        ib_hca_transport_t *ibt_ptr = 
                &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
        DAT_COUNT i, total_len;
@@ -162,48 +136,25 @@ dapls_ib_post_send (
                     ep_ptr, op_type, cookie, segments, local_iov, 
                     remote_iov, completion_flags);
 
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       if(segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-       
        /* setup the work request */
        wr.next = 0;
        wr.opcode = op_type;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.send_flags = 0;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
+       wr.sg_list = ds;
        total_len = 0;
 
-       for (i = 0; i < segments; i++ ) {
-               if ( !local_iov[i].segment_length )
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd: lkey 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       if (cookie != NULL) {
+               for (i = 0; i < segments; i++ ) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_snd: lkey 0x%x va %p len %d\n",
+                                    ds->lkey, ds->addr, ds->length );
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        if (wr.num_sge && 
            (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) {
@@ -214,7 +165,6 @@ dapls_ib_post_send (
                             wr.wr.rdma.rkey, wr.wr.rdma.remote_addr);
        }
 
-
        /* inline data for send or write ops */
        if ((total_len <= ibt_ptr->max_inline_send) && 
           ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) 
@@ -234,9 +184,6 @@ dapls_ib_post_send (
 
        ret = ibv_post_send(ep_ptr->qp_handle->cm_id->qp, &wr, &bad_wr);
 
-       if (ds_array_start_p != NULL)
-           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
-
        if (ret)
                return( dapl_convert_errno(errno,"ibv_send") );
 
@@ -319,61 +266,37 @@ dapls_ib_post_ext_send (
        IN  DAT_UINT64                  swap,
        IN  DAT_COMPLETION_FLAGS        completion_flags)
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_send_wr wr;
        struct ibv_send_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        DAT_COUNT i, total_len;
        int ret;
        
        dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p op %d ck %p sgs",
+                    " post_ext_snd: ep %p op %d ck %p sgs",
                     "%d l_iov %p r_iov %p f %d\n",
                     ep_ptr, op_type, cookie, segments, local_iov, 
                     remote_iov, completion_flags);
 
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       if(segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-       
        /* setup the work request */
        wr.next = 0;
        wr.opcode = op_type;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.send_flags = 0;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
+       wr.sg_list = ds;
        total_len = 0;
 
-       for (i = 0; i < segments; i++ ) {
-               if ( !local_iov[i].segment_length )
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd: lkey 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       if (cookie != NULL) {
+               for (i = 0; i < segments; i++ ) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_ext_snd: lkey 0x%x va %p ln %d\n",
+                                    ds->lkey, ds->addr, ds->length);
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        switch (op_type) {
        case OP_RDMA_WRITE_IMM:
@@ -433,9 +356,6 @@ dapls_ib_post_ext_send (
 
        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(errno,"ibv_send") );
 
index 93635ef21f90321eb2b99ea767be068c30a97d42..46c9b356c9f14dde76ea979c60a5ed7534169d75 100755 (executable)
@@ -177,7 +177,7 @@ typedef struct dapl_cm_id   *dp_ib_cm_handle_t;
 typedef struct dapl_cm_id      *ib_cm_srvc_handle_t;
 
 /* Operation and state mappings */
-typedef enum   ibv_send_flags  ib_send_op_type_t;
+typedef int    ib_send_op_type_t;
 typedef        struct  ibv_sge         ib_data_segment_t;
 typedef enum   ibv_qp_state    ib_qp_state_t;
 typedef        enum    ibv_event_type  ib_async_event_type;
index ff338fcdecb223807ebeca06d4e59dc4a444fde4..9118b2ed959f5231932134ff200273399e524673 100644 (file)
@@ -73,10 +73,9 @@ dapls_ib_post_recv (
        IN  DAT_COUNT           segments,
        IN  DAT_LMR_TRIPLET     *local_iov )
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_recv_wr wr;
        struct ibv_recv_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        DAT_COUNT i, total_len;
        int ret;
        
@@ -84,50 +83,28 @@ dapls_ib_post_recv (
                     " post_rcv: ep %p cookie %p segs %d l_iov %p\n",
                     ep_ptr, cookie, segments, local_iov);
 
-       if (segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-
        /* setup work request */
        total_len = 0;
        wr.next = 0;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
-
-       for (i = 0; i < segments; i++) {
-               if (!local_iov[i].segment_length)
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_rcv: l_key 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       wr.sg_list = ds;
+
+       if (cookie != NULL) {
+               for (i = 0; i < segments; i++) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_rcv: l_key 0x%x va %p len %d\n",
+                                    ds->lkey, ds->addr, ds->length );
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        ret = ibv_post_recv(ep_ptr->qp_handle, &wr, &bad_wr);
        
-       if (ds_array_start_p != NULL)
-           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
-
        if (ret)
-               return( dapl_convert_errno(errno,"ibv_recv") );
+               return(dapl_convert_errno(errno,"ibv_recv"));
 
        DAPL_CNTR(ep_ptr, DCNT_EP_POST_RECV);
        DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_RECV_DATA, total_len);
@@ -150,10 +127,9 @@ dapls_ib_post_send (
        IN  const DAT_RMR_TRIPLET       *remote_iov,
        IN  DAT_COMPLETION_FLAGS        completion_flags)
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_send_wr wr;
        struct ibv_send_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        ib_hca_transport_t *ibt_ptr = 
                &ep_ptr->header.owner_ia->hca_ptr->ib_trans;
        DAT_COUNT i, total_len;
@@ -165,19 +141,6 @@ dapls_ib_post_send (
                     ep_ptr, op_type, cookie, segments, local_iov, 
                     remote_iov, completion_flags);
 
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       if(segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-
 #ifdef DAT_EXTENSIONS  
        if (ep_ptr->qp_handle->qp_type != IBV_QPT_RC)
                return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
@@ -185,32 +148,22 @@ dapls_ib_post_send (
        /* setup the work request */
        wr.next = 0;
        wr.opcode = op_type;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.send_flags = 0;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
+       wr.sg_list = ds;
        total_len = 0;
 
-       for (i = 0; i < segments; i++ ) {
-               if ( !local_iov[i].segment_length )
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd: lkey 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       if (cookie != NULL) {
+               for (i = 0; i < segments; i++ ) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_snd: lkey 0x%x va %p len %d\n",
+                                    ds->lkey, ds->addr, ds->length );
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        if (wr.num_sge && 
            (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) {
@@ -241,11 +194,8 @@ dapls_ib_post_send (
 
        ret = ibv_post_send(ep_ptr->qp_handle, &wr, &bad_wr);
 
-       if (ds_array_start_p != NULL)
-           dapl_os_free(ds_array_start_p, segments * sizeof(ib_data_segment_t));
-
        if (ret)
-               return( dapl_convert_errno(errno,"ibv_send") );
+               return(dapl_convert_errno(errno,"ibv_send"));
 
 #ifdef DAPL_COUNTERS
        switch (op_type) {
@@ -339,10 +289,9 @@ dapls_ib_post_ext_send (
        IN  DAT_COMPLETION_FLAGS        completion_flags,
        IN  DAT_IB_ADDR_HANDLE          *remote_ah)
 {
-       ib_data_segment_t ds_array[DEFAULT_DS_ENTRIES];
-       ib_data_segment_t *ds_array_p, *ds_array_start_p = NULL;
        struct ibv_send_wr wr;
        struct ibv_send_wr *bad_wr;
+       ib_data_segment_t *ds = (ib_data_segment_t *)local_iov;
        DAT_COUNT i, total_len;
        int ret;
        
@@ -352,48 +301,25 @@ dapls_ib_post_ext_send (
                     ep_ptr, op_type, cookie, segments, local_iov, 
                     remote_iov, completion_flags, remote_ah);
 
-       dapl_dbg_log(DAPL_DBG_TYPE_EP,
-                    " post_snd: ep %p cookie %p segs %d l_iov %p\n",
-                    ep_ptr, cookie, segments, local_iov);
-
-       if(segments <= DEFAULT_DS_ENTRIES) 
-               ds_array_p = ds_array;
-       else
-               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);
-       
        /* setup the work request */
        wr.next = 0;
        wr.opcode = op_type;
-       wr.num_sge = 0;
+       wr.num_sge = segments;
        wr.send_flags = 0;
        wr.wr_id = (uint64_t)(uintptr_t)cookie;
-       wr.sg_list = ds_array_p;
+       wr.sg_list = ds;
        total_len = 0;
 
-       for (i = 0; i < segments; i++ ) {
-               if ( !local_iov[i].segment_length )
-                       continue;
-
-               ds_array_p->addr = (uint64_t) local_iov[i].virtual_address;
-               ds_array_p->length = local_iov[i].segment_length;
-               ds_array_p->lkey = local_iov[i].lmr_context;
-               
-               dapl_dbg_log(DAPL_DBG_TYPE_EP, 
-                            " post_snd: lkey 0x%x va %p len %d\n",
-                            ds_array_p->lkey, ds_array_p->addr, 
-                            ds_array_p->length );
-
-               total_len += ds_array_p->length;
-               wr.num_sge++;
-               ds_array_p++;
-       }
-
-       if (cookie != NULL) 
+       if (cookie != NULL) {
+               for (i = 0; i < segments; i++ ) {
+                       dapl_dbg_log(DAPL_DBG_TYPE_EP, 
+                                    " post_snd: lkey 0x%x va %p len %d\n",
+                                    ds->lkey, ds->addr, ds->length );
+                       total_len += ds->length;
+                       ds++;
+               }
                cookie->val.dto.size = total_len;
+       }
 
        switch (op_type) {
        case OP_RDMA_WRITE_IMM:
@@ -468,9 +394,6 @@ dapls_ib_post_ext_send (
 
        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(errno,"ibv_send") );
        
index 7011e7c765c6dcb8ef7797a7dba7bd226643c3d9..9ddf231fad065dbb3ca51cd43da71e6714eecf3c 100644 (file)
@@ -138,7 +138,7 @@ typedef enum
 } ib_cm_events_t;
 
 /* Operation and state mappings */
-typedef enum   ibv_send_flags  ib_send_op_type_t;
+typedef int ib_send_op_type_t;
 typedef        struct  ibv_sge         ib_data_segment_t;
 typedef enum   ibv_qp_state    ib_qp_state_t;
 typedef        enum    ibv_event_type  ib_async_event_type;