]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
Fix issues with IB DTO extensions
authorArlin Davis <arlin.r.davis@intel.com>
Mon, 7 May 2007 19:49:18 +0000 (12:49 -0700)
committerArlin Davis <arlin.r.davis@intel.com>
Mon, 7 May 2007 19:49:18 +0000 (12:49 -0700)
 - debug print_cqe updated for latest IBV definitions
 - dapli_evd_cq_to_event modified to handle both post and receive extensions
 - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap
 - modify cookie DTO types to support extensions properly

dapl/common/dapl_evd_util.c
dapl/include/dapl.h
dapl/openib_cma/dapl_ib_extensions.c
test/dtest/dtestx.c

index 73e6c58cca5e65cdd7dc6d67878d631dec74d012..17a05c60ae09ddbf1fd0c17c8b94cdda7152f822 100755 (executable)
@@ -504,17 +504,16 @@ dapli_evd_eh_print_cqe (
 #ifdef DAPL_DBG
     static char *optable[] =
     {
+       "OP_RDMA_WRITE",
+       "OP_RDMA_WRITE_IMM",
        "OP_SEND",
+       "OP_SEND_IMM",
        "OP_RDMA_READ",
-       "OP_RDMA_WRITE",
        "OP_COMP_AND_SWAP",
        "OP_FETCH_AND_ADD",
        "OP_RECEIVE",
+       "OP_RECEIVE_IMM",
        "OP_BIND_MW",
-#ifdef DAT_EXTENSIONS
-       "OP_COMP_AND_SWAP_RESP",
-       "OP_FETCH_AND_ADD_RESP",
-#endif
        0
     };
 
@@ -1009,6 +1008,7 @@ dapli_evd_cqe_to_event (
     DAPL_COOKIE                        *cookie;
     DAT_DTO_COMPLETION_STATUS  dto_status;
 
+    
     /*
      * All that can be relied on if the status is bad is the status
      * and WRID.
@@ -1034,6 +1034,17 @@ dapli_evd_cqe_to_event (
     {
        case DAPL_COOKIE_TYPE_DTO:
        {
+#ifdef DAT_EXTENSIONS
+           /* Extended via request post or message receive */
+           if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) ||
+               (cookie->val.dto.type == DAPL_DTO_TYPE_RECV && 
+               DAPL_GET_CQE_OPTYPE(cqe_ptr) !=  OP_RECEIVE))
+           {
+               dapls_cqe_to_event_extension(ep_ptr, cookie, 
+                                            cqe_ptr, event_ptr);
+               break;
+           }
+#endif
            DAPL_COOKIE_BUFFER  *buffer;
 
            if ( DAPL_DTO_TYPE_RECV == cookie->val.dto.type )
@@ -1054,24 +1065,6 @@ dapli_evd_cqe_to_event (
                cookie->val.dto.cookie;
            event_ptr->event_data.dto_completion_event_data.status = dto_status;
 
-#ifdef DAPL_DBG
-           if (dto_status == DAT_DTO_SUCCESS)
-           {
-               uint32_t                ibtype;
-
-               ibtype = DAPL_GET_CQE_OPTYPE (cqe_ptr);
-
-               dapl_os_assert ((ibtype == OP_SEND &&
-                                cookie->val.dto.type == DAPL_DTO_TYPE_SEND)
-                               || (ibtype == OP_RECEIVE &&
-                                   cookie->val.dto.type == DAPL_DTO_TYPE_RECV)
-                               || (ibtype == OP_RDMA_WRITE &&
-                                   cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE)
-                               || (ibtype == OP_RDMA_READ &&
-                                   cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_READ));
-               }
-#endif /* DAPL_DBG */
-
            if ( cookie->val.dto.type == DAPL_DTO_TYPE_SEND ||
                 cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE )
            {
@@ -1119,13 +1112,6 @@ dapli_evd_cqe_to_event (
            dapls_cookie_dealloc (&ep_ptr->req_buffer, cookie);
            break;
        }
-#ifdef DAT_EXTENSIONS
-       case DAPL_COOKIE_TYPE_EXTENSION:
-       {
-           dapls_cqe_to_event_extension(ep_ptr, cookie, cqe_ptr, event_ptr);
-           break;
-       }
-#endif
        default:
        {
            dapl_os_assert (!"Invalid Operation type");
index 41af96f437eed6e04bdb760e869e70f8dfac2793..2e0714d153ef4f8f22826731edc3ca5a3b62a97b 100755 (executable)
@@ -566,6 +566,9 @@ typedef enum dapl_dto_type
     DAPL_DTO_TYPE_RECV,
     DAPL_DTO_TYPE_RDMA_WRITE,
     DAPL_DTO_TYPE_RDMA_READ,
+#ifdef DAT_EXTENSIONS
+    DAPL_DTO_TYPE_EXTENSION,\r
+#endif
 } DAPL_DTO_TYPE;
 
 typedef enum dapl_cookie_type
@@ -573,9 +576,6 @@ typedef enum dapl_cookie_type
     DAPL_COOKIE_TYPE_NULL,
     DAPL_COOKIE_TYPE_DTO,
     DAPL_COOKIE_TYPE_RMR,
-#ifdef DAT_EXTENSIONS
-    DAPL_COOKIE_TYPE_EXTENSION,\r
-#endif
 } DAPL_COOKIE_TYPE;
 
 /* DAPL_DTO_COOKIE used as context for DTO WQEs */
index 73ce400bd99022ea30e56f915e7a1ae9ba119018..3132ffb3acce364ec9a65ccced744fa0a73af30b 100755 (executable)
@@ -200,7 +200,7 @@ dapli_post_ext( IN       DAT_EP_HANDLE              ep_handle,
 
                dat_status = dapls_dto_cookie_alloc(
                                                &ep_ptr->req_buffer,
-                                               DAPL_COOKIE_TYPE_EXTENSION,
+                                               DAPL_DTO_TYPE_EXTENSION,
                                                user_cookie,
                                                &cookie );
 
@@ -262,8 +262,8 @@ dapls_cqe_to_event_extension(IN DAPL_EP                     *ep_ptr,
         dto_status = dapls_ib_get_dto_status(cqe_ptr);
        
        dapl_dbg_log(DAPL_DBG_TYPE_EVD,
-                    " cqe_to_event_ext: dto_ptr %p ext_ptr %p\n",
-                    dto, ext_data);
+                    " cqe_to_event_ext: dto_ptr %p ext_ptr %p status %d\n",
+                    dto, ext_data, dto_status);
 
        event_ptr->event_number = DAT_IB_DTO_EVENT;
        dto->ep_handle = cookie->ep;
index b586ca113f11d4cef941a9749d391cfab1748e70..153ce76bc17842c975f93ab13267cd51003ddb4b 100755 (executable)
@@ -56,7 +56,7 @@
 \r
 #define DTO_TIMEOUT       (1000*1000*5)
 #define CONN_TIMEOUT      (1000*1000*10)
-#define SERVER_TIMEOUT    (1000*1000*20)\r
+#define SERVER_TIMEOUT    (1000*1000*120)\r
 #define SERVER_CONN_QUAL       31111\r
 #define BUF_SIZE               256\r
 #define BUF_SIZE_ATOMIC                8\r
@@ -90,7 +90,7 @@ DAT_PSP_HANDLE                psp = DAT_HANDLE_NULL;
 DAT_CR_HANDLE          cr = DAT_HANDLE_NULL;\r
 int                    server;\r
 \r
-char *usage = "[-s] | hostname\n";\r
+char *usage = "-s | hostname (default == -s)\n";\r
 \r
 void\r
 send_msg(\r
@@ -188,7 +188,7 @@ connect_ep(char *hostname)
                                        region,\r
                                        BUF_SIZE,\r
                                        pz,\r
-                                       DAT_MEM_PRIV_ALL_FLAG,\r
+                                       DAT_MEM_PRIV_ALL_FLAG|DAT_IB_MEM_PRIV_REMOTE_ATOMIC,\r
                                        DAT_VA_TYPE_VA,
                                        &lmr[ i ],\r
                                        &lmr_context[ i ],\r
@@ -196,8 +196,6 @@ connect_ep(char *hostname)
                                        &reg_size[ i ],\r
                                        &reg_addr[ i ]);\r
                _OK(status, "dat_lmr_create");\r
-               printf(" buf[%d]=%p, reg_addr[%d]=%p\n",\r
-                       i, buf[ i ], i, reg_addr[ i ]);\r
        }\r
 \r
        /* register atomic return buffer for original data */\r
@@ -208,7 +206,7 @@ connect_ep(char *hostname)
                                region,\r
                                BUF_SIZE_ATOMIC,\r
                                pz,\r
-                               DAT_MEM_PRIV_ALL_FLAG,\r
+                               DAT_MEM_PRIV_ALL_FLAG|DAT_IB_MEM_PRIV_REMOTE_ATOMIC,\r
                                DAT_VA_TYPE_VA,
                                &lmr_atomic,\r
                                &lmr_atomic_context,\r
@@ -360,16 +358,19 @@ int
 disconnect_ep()\r
 {\r
        DAT_RETURN      status;\r
-       int                     i;\r
+       int             i;\r
+       DAT_EVENT       event;\r
+       DAT_COUNT       nmore;\r
 \r
        status = dat_ep_disconnect(ep, DAT_CLOSE_DEFAULT);\r
        _OK(status, "dat_ep_disconnect");\r
 \r
-       printf("EP disconnected\n");\r
-\r
+       status = dat_evd_wait(con_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore);
+       _OK(status, "dat_ep_disconnect");
+       \r
        if (server) {\r
                status = dat_psp_free(psp);\r
-               _OK(status, "dat_ep_disconnect");\r
+               _OK(status, "dat_psp_free");\r
        }\r
 \r
        for (i = 0; i < REG_MEM_COUNT; i++) {\r
@@ -443,7 +444,6 @@ do_immediate()
                                                immed_data,\r
                                                DAT_COMPLETION_DEFAULT_FLAG);\r
        _OK(status, "dat_ib_post_rdma_write_immed");\r
-       printf("dat_ib_post_rdma_write_immed posted\n");\r
 \r
        /*\r
         *  Collect first event, write completion or the inbound recv with immed\r
@@ -552,13 +552,14 @@ do_immediate()
        }\r
 \r
        if (server)\r
-               printf("SUCCESS: Server received immed_data=0x%x\n", immed_data_recv);\r
+               printf("Server received immed_data=0x%x\n", immed_data_recv);\r
        else\r
-               printf("SUCCESS: Client received immed_data=0x%x\n", immed_data_recv);\r
+               printf("Client received immed_data=0x%x\n", immed_data_recv);\r
        \r
-       printf("RCV buffer %p contains: %s\n", \r
+       printf("rdma buffer %p contains: %s\n", \r
                buf[ RCV_RDMA_BUF_INDEX ], buf[ RCV_RDMA_BUF_INDEX ]);\r
 \r
+       printf("\n RDMA_WRITE_WITH_IMMEDIATE_DATA test - PASSED\n");\r
        return (0);\r
 }\r
 \r
@@ -599,7 +600,7 @@ do_cmp_swap()
                                                        DAT_COMPLETION_DEFAULT_FLAG);\r
        } else {\r
                *target = 0x54321;\r
-               sleep(1);\r
+               sleep(1); \r
                /* client does compare and should swap */\r
                status = dat_ib_post_cmp_and_swap(      ep, \r
                                                        (DAT_UINT64)0x12345, \r
@@ -610,8 +611,6 @@ do_cmp_swap()
                                                        DAT_COMPLETION_DEFAULT_FLAG);\r
        }\r
        _OK(status, "dat_ib_post_cmp_and_swap");\r
-       printf("dat_ib_post_cmp_and_swap posted\n");\r
-\r
        status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
        _OK(status, "dat_evd_wait for compare and swap");\r
        if (event.event_number != DAT_IB_DTO_EVENT) {\r
@@ -628,15 +627,25 @@ do_cmp_swap()
                *atomic_buf);\r
                exit(1);\r
        }\r
-\r
+       sleep(1); /* wait for other side to complete swap */\r
        if (server) {\r
            printf("Server got original data        = 0x%llx, expected 0x54321\n", *atomic_buf);\r
            printf("Client final result (on server) = 0x%llx, expected 0x98765\n", *target);\r
+\r
+           if (*atomic_buf != 0x54321 || *target != 0x98765) {\r
+               printf("ERROR: Server CMP_SWAP\n");\r
+               exit(1);\r
+           }\r
        } else {\r
            printf("Client got original data        = 0x%llx, expected 0x12345\n",*atomic_buf);\r
            printf("Server final result (on client) = 0x%llx, expected 0x54321\n", *target);\r
+\r
+           if (*atomic_buf != 0x12345 || *target != 0x54321) {\r
+               printf("ERROR: Client CMP_SWAP\n");\r
+               exit(1);\r
+           }\r
        }\r
-       sleep(1);\r
+       printf("\n CMP_SWAP test - PASSED\n");\r
        return(0);\r
 }\r
 \r
@@ -665,6 +674,9 @@ do_fetch_add()
 \r
        cookie.as_64 = 0x7777;\r
        if (server) {\r
+               /* Wait for client to finish cmp_swap */\r
+               while (*target != 0x98765)\r
+                       sleep(1);\r
                *target = 0x10;\r
                sleep(1);\r
                status = dat_ib_post_fetch_and_add(     ep, \r
@@ -674,6 +686,7 @@ do_fetch_add()
                                                        &r_iov, \r
                                                        DAT_COMPLETION_DEFAULT_FLAG);\r
        } else {\r
+               /* Wait for server, no swap so nothing to check */\r
                *target = 0x100;\r
                sleep(1);\r
                status = dat_ib_post_fetch_and_add(     ep, \r
@@ -684,7 +697,6 @@ do_fetch_add()
                                                        DAT_COMPLETION_DEFAULT_FLAG);\r
        }\r
        _OK(status, "dat_ib_post_fetch_and_add");\r
-       printf("dat_ib_post_fetch_and_add posted\n");\r
        status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore);\r
        _OK(status, "dat_evd_wait for fetch and add");\r
        if (event.event_number != DAT_IB_DTO_EVENT) {\r
@@ -741,28 +753,40 @@ do_fetch_add()
                exit(1);\r
        }\r
 \r
-       sleep(1);\r
+       sleep(1); /* wait for other side to complete fetch_add */\r
+\r
        if (server) {\r
            printf("Server got original data         = 0x%llx, expected 0x200\n", *atomic_buf);\r
            printf("Client final result (on server)  = 0x%llx, expected 0x30\n", *target);\r
+\r
+           if (*atomic_buf != 0x200 || *target != 0x30) {\r
+               printf("ERROR: Server FETCH_ADD\n");\r
+               exit(1);\r
+           }\r
        } else {\r
            printf("Server side original data        = 0x%llx, expected 0x20\n", *atomic_buf);\r
            printf("Server final result (on client)  = 0x%llx, expected 0x300\n", *target);\r
-       }\r
 \r
+           if (*atomic_buf != 0x20 || *target != 0x300) {\r
+               printf("ERROR: Server FETCH_ADD\n");\r
+               exit(1);\r
+           }\r
+       }\r
+       printf("\n FETCH_ADD test - PASSED\n");\r
        return(0);\r
 }\r
 \r
 int\r
 main(int argc, char **argv)\r
 {\r
-       char                                    *hostname;\r
+       char *hostname;\r
 \r
-       if (argc != 2) {\r
+       if (argc > 2) {\r
                printf(usage);\r
                exit(1);\r
        }\r
-       if (strcmp(argv[ 1 ], "-s") == 0)\r
+\r
+       if ((argc == 1) || strcmp(argv[ 1 ], "-s") == 0)\r
        {\r
                server = 1;\r
        } else {\r
@@ -770,6 +794,7 @@ main(int argc, char **argv)
                hostname = argv[ 1 ];\r
        }\r
 \r
+\r
        /*\r
         * connect\r
         */\r