]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
uDAPL common: add 64 bit counters for IA, EP, and EVD's.
authorArlin Davis <arlin.r.davis@intel.com>
Tue, 3 Mar 2009 17:25:26 +0000 (09:25 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Tue, 3 Mar 2009 17:25:26 +0000 (09:25 -0800)
 -DDAPL_COUNTERS to build-in counters for cma and scm providers.
 New extension calls in dat_ib_extensions.h for counters
dat_print_counters, dat_query_counters
 Counters for operations, async errors, and data
 Update dtestx (-p) with print and query counter examples

Signed-off-by: Arlin Davis <ardavis@ichips.intel.com>
49 files changed:
dapl/common/dapl_debug.c
dapl/common/dapl_ep_connect.c
dapl/common/dapl_ep_create.c
dapl/common/dapl_ep_disconnect.c
dapl/common/dapl_ep_free.c
dapl/common/dapl_ep_get_status.c
dapl/common/dapl_ep_post_rdma_read.c
dapl/common/dapl_ep_post_rdma_write.c
dapl/common/dapl_ep_post_recv.c
dapl/common/dapl_ep_post_send.c
dapl/common/dapl_ep_util.c
dapl/common/dapl_evd_connection_callb.c
dapl/common/dapl_evd_cq_async_error_callb.c
dapl/common/dapl_evd_dequeue.c
dapl/common/dapl_evd_dto_callb.c
dapl/common/dapl_evd_free.c
dapl/common/dapl_evd_qp_async_error_callb.c
dapl/common/dapl_evd_un_async_error_callb.c
dapl/common/dapl_evd_util.c
dapl/common/dapl_ia_util.c
dapl/common/dapl_lmr_free.c
dapl/common/dapl_psp_create.c
dapl/common/dapl_psp_create_any.c
dapl/common/dapl_psp_free.c
dapl/common/dapl_pz_create.c
dapl/common/dapl_pz_free.c
dapl/common/dapl_rmr_create.c
dapl/common/dapl_rmr_free.c
dapl/common/dapl_rsp_create.c
dapl/common/dapl_rsp_free.c
dapl/common/dapl_srq_create.c
dapl/common/dapl_srq_free.c
dapl/common/dapl_timer_util.c
dapl/ibal/dapl_ibal_extensions.c
dapl/include/dapl.h
dapl/include/dapl_debug.h
dapl/openib_cma/dapl_ib_dto.h
dapl/openib_cma/dapl_ib_extensions.c
dapl/openib_cma/dapl_ib_util.c
dapl/openib_scm/dapl_ib_dto.h
dapl/openib_scm/dapl_ib_extensions.c
dapl/openib_scm/dapl_ib_util.c
dapl/udapl/dapl_evd_create.c
dapl/udapl/dapl_evd_wait.c
dapl/udapl/dapl_init.c
dapl/udapl/dapl_lmr_create.c
dapl/udapl/linux/dapl_osd.h
dat/include/dat2/dat_ib_extensions.h
test/dtest/dtestx.c

index e7175915c28864f6e39492e1da47ff1e4b48fea6..7601fc8a14a4af179c853389be727aeb75d3c29d 100644 (file)
@@ -25,7 +25,6 @@
  * and/or other materials provided with the distribution.
  */
 
-#include "dapl_debug.h"
 #include "dapl.h"
 #if !defined(__KDAPL__)
 #include <stdarg.h>
@@ -67,52 +66,177 @@ void dapl_internal_dbg_log ( DAPL_DBG_TYPE type, const char *fmt, ...)
     }
 }
 
-#if defined(DAPL_COUNTERS)
-int dapl_dbg_counters[DCNT_NUM_COUNTERS] = { 0 };
+#ifdef DAPL_COUNTERS
 
 /*
- * The order of this list must match exactly with the #defines
- * in dapl_debug.h
+ * The order of this list must match the DAT counter definitions 
  */
-char  *dapl_dbg_counter_names[] = {
-       "dapl_ep_create",
-       "dapl_ep_free",
-       "dapl_ep_connect",
-       "dapl_ep_disconnect",
-       "dapl_ep_post_send",
-       "dapl_ep_post_recv",
-       "dapl_ep_post_rdma_write",
-       "dapl_ep_post_rdma_read",
-       "dapl_evd_create",
-       "dapl_evd_free",
-       "dapl_evd_wait",
-       "dapl_evd_blocked",
-       "dapl_evd_completion_notify",
-       "dapl_evd_dto_callback",
-       "dapl_evd_connection_callback",
-       "dapl_evd_dequeue",
-       "dapl_evd_poll",
-       "dapl_evd_found",
-       "dapl_evd_not_found",
-       "dapls_timer_set",
-       "dapls_timer_cancel",
-       "dapl_extensions"
+static char *ia_cntr_names[] = {
+       "DCNT_IA_PZ_CREATE",
+       "DCNT_IA_PZ_FREE",
+       "DCNT_IA_LMR_CREATE",
+       "DCNT_IA_LMR_FREE",
+       "DCNT_IA_RMR_CREATE",
+       "DCNT_IA_RMR_FREE",
+       "DCNT_IA_PSP_CREATE",
+       "DCNT_IA_PSP_CREATE_ANY",
+       "DCNT_IA_PSP_FREE",
+       "DCNT_IA_RSP_CREATE",
+       "DCNT_IA_RSP_FREE",
+       "DCNT_IA_EVD_CREATE",
+       "DCNT_IA_EVD_FREE",
+       "DCNT_IA_EP_CREATE",
+       "DCNT_IA_EP_FREE",
+       "DCNT_IA_SRQ_CREATE",
+       "DCNT_IA_SRQ_FREE",
+       "DCNT_IA_SP_CR",
+       "DCNT_IA_SP_CR_ACCEPTED",
+       "DCNT_IA_SP_CR_REJECTED",
+       "DCNT_IA_MEM_ALLOC",
+       "DCNT_IA_MEM_ALLOC_DATA",
+       "DCNT_IA_MEM_FREE",
+       "DCNT_IA_ASYNC_ERROR",
+       "DCNT_IA_ASYNC_QP_ERROR",
+       "DCNT_IA_ASYNC_CQ_ERROR"
 };
 
-void dapl_dump_cntr( int cntr )
+static char *ep_cntr_names[] = {
+       "DCNT_EP_CONNECT",
+       "DCNT_EP_DISCONNECT",
+       "DCNT_EP_POST_SEND",
+       "DCNT_EP_POST_SEND_DATA",
+       "DCNT_EP_POST_SEND_UD",
+       "DCNT_EP_POST_SEND_UD_DATA",
+       "DCNT_EP_POST_RECV",
+       "DCNT_EP_POST_RECV_DATA",
+       "DCNT_EP_POST_WRITE",
+       "DCNT_EP_POST_WRITE_DATA",
+       "DCNT_EP_POST_WRITE_IMM",
+       "DCNT_EP_POST_WRITE_IMM_DATA",
+       "DCNT_EP_POST_READ",
+       "DCNT_EP_POST_READ_DATA",
+       "DCNT_EP_POST_CMP_SWAP",
+       "DCNT_EP_POST_FETCH_ADD",
+       "DCNT_EP_RECV",
+       "DCNT_EP_RECV_DATA",
+       "DCNT_EP_RECV_UD",
+       "DCNT_EP_RECV_UD_DATA",
+       "DCNT_EP_RECV_IMM",
+       "DCNT_EP_RECV_IMM_DATA",
+       "DCNT_EP_RECV_RDMA_IMM",
+       "DCNT_EP_RECV_RDMA_IMM_DATA",
+};
+
+static char *evd_cntr_names[] = {
+       "DCNT_EVD_WAIT",
+       "DCNT_EVD_WAIT_BLOCKED",
+       "DCNT_EVD_WAIT_NOTIFY",
+       "DCNT_EVD_DEQUEUE",
+       "DCNT_EVD_DEQUEUE_FOUND",
+       "DCNT_EVD_DEQUEUE_NOT_FOUND",
+       "DCNT_EVD_DEQUEUE_POLL",
+       "DCNT_EVD_DEQUEUE_POLL_FOUND",
+       "DCNT_EVD_CONN_CALLBACK",
+       "DCNT_EVD_DTO_CALLBACK",
+};
+
+DAT_RETURN dapl_query_counter(DAT_HANDLE dh, 
+                             int counter, 
+                             void *p_cntrs_out,
+                             int reset) 
 {
-    int i;
+       int i, max;
+       DAT_UINT64 *p_cntrs;
+       DAT_HANDLE_TYPE type = 0;
+               
+       dat_get_handle_type(dh, &type);
 
-    for ( i = 0; i < DCNT_NUM_COUNTERS; i++ )
-    {
-        if (( cntr == i ) || ( cntr == DCNT_ALL_COUNTERS ))
-        {
-            dapl_dbg_log (  DAPL_DBG_TYPE_CNTR,
-                            "DAPL Counter: %s = %lu \n",
-                            dapl_dbg_counter_names[i],
-                            dapl_dbg_counters[i] );
+       switch(type) {
+               case DAT_HANDLE_TYPE_IA:
+                       max = DCNT_IA_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_IA*)dh)->cntrs;
+                       break;
+               case DAT_HANDLE_TYPE_EP:
+                       max = DCNT_EP_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_EP*)dh)->cntrs;
+                       break;
+               case DAT_HANDLE_TYPE_EVD:
+                       max = DCNT_EVD_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_EVD*)dh)->cntrs;
+                       break;
+               default:
+                       return DAT_INVALID_HANDLE;
+       }
+                              
+       for (i=0; i < max; i++) {
+               if ((counter == i) || (counter == max)) {
+                       ((DAT_UINT64*)p_cntrs_out)[i] = p_cntrs[i];
+                       if (reset) p_cntrs[i]=0;
+               }
+       }
+       return DAT_SUCCESS;
+}
+
+char *dapl_query_counter_name(DAT_HANDLE dh, int counter) 
+{
+       DAT_HANDLE_TYPE type = 0;
+               
+       dat_get_handle_type(dh, &type);
+
+       switch(type) {
+               case DAT_HANDLE_TYPE_IA:
+                       if (counter < DCNT_IA_ALL_COUNTERS)
+                               return ia_cntr_names[counter];
+                       break;
+               case DAT_HANDLE_TYPE_EP:
+                       if (counter < DCNT_EP_ALL_COUNTERS)
+                               return ep_cntr_names[counter];
+                       break;
+               case DAT_HANDLE_TYPE_EVD:
+                       if (counter < DCNT_EVD_ALL_COUNTERS)
+                               return evd_cntr_names[counter];
+                       break;
+               default:
+                       return NULL;
+       }
+       return NULL;
+}
+
+#include <inttypes.h>
+void dapl_print_counter(DAT_HANDLE dh, int counter, int reset)
+{
+       int i, max;
+       DAT_UINT64 *p_cntrs;
+       DAT_HANDLE_TYPE type = 0;
+               
+       dat_get_handle_type(dh, &type);
+
+       switch(type) {
+               case DAT_HANDLE_TYPE_IA:
+                       max = DCNT_IA_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_IA*)dh)->cntrs;
+                       break;
+               case DAT_HANDLE_TYPE_EP:
+                       max = DCNT_EP_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_EP*)dh)->cntrs;
+                       break;
+               case DAT_HANDLE_TYPE_EVD:
+                       max = DCNT_EVD_ALL_COUNTERS;
+                       p_cntrs = ((DAPL_EVD*)dh)->cntrs;
+                       break;
+               default:
+                       return;
+       }
+                              
+       for (i=0; i < max; i++) {
+               if ((counter == i) || (counter == max)) {
+                       printf( " %s = " F64u " \n",
+                               dapl_query_counter_name(dh, i),
+                               p_cntrs[i] );
+                       if (reset) p_cntrs[i]=0;
+               }
         }
-    }
+       return;
 }
 
 #endif /* DAPL_COUNTERS */
index 0c3f10abcbe3840c8d25bfcd6107b7af50596c0f..9a72531538677beee649ed8dcf31de317928a4be 100755 (executable)
@@ -97,7 +97,6 @@ dapl_ep_connect (
                private_data,
                qos,
                connect_flags);
-    DAPL_CNTR (DCNT_EP_CONNECT);
 
     dat_status = DAT_SUCCESS;
     ep_ptr = (DAPL_EP *) ep_handle;
@@ -124,6 +123,7 @@ dapl_ep_connect (
        dat_status = DAT_ERROR (DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
        goto bail;
     }
+    DAPL_CNTR (ep_ptr, DCNT_EP_CONNECT);
 
     /*
      * If the endpoint needs a QP, associated the QP with it.
index ff233b0a87aa3caee339521ade18f3cdd2dcfae7..89828761c48475d88a1ab1827370e87181744af9 100644 (file)
@@ -89,7 +89,6 @@ dapl_ep_create (
                  connect_evd_handle, 
                  ep_attr, 
                  ep_handle);
-    DAPL_CNTR(DCNT_EP_CREATE);
 
     ia_ptr = (DAPL_IA *)ia_handle;
     dat_status = DAT_SUCCESS;
@@ -102,6 +101,7 @@ dapl_ep_create (
        dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
        goto bail;
     }
+    DAPL_CNTR(ia_ptr, DCNT_IA_EP_CREATE);
 
     /*
      * Verify non-required parameters.
index fabce926926d981029f16c04ce970f743d7bca87..631d809e2fa4ced2d5b84c9c2ad3070c3c678e52 100644 (file)
@@ -75,7 +75,6 @@ dapl_ep_disconnect (
                 "dapl_ep_disconnect (%p, %x)\n",
                  ep_handle,
                  disconnect_flags);
-    DAPL_CNTR(DCNT_EP_DISCONNECT);
 
     ep_ptr = (DAPL_EP *) ep_handle;
 
@@ -87,6 +86,7 @@ dapl_ep_disconnect (
        dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
        goto bail;
     }
+    DAPL_CNTR(ep_ptr, DCNT_EP_DISCONNECT);
 
     /*
      * Do the verification of parameters and the state change
index 62d96443b24aac5a9571e07e5ff551fdb38518f5..76b34f0426c274a861829831238c86e7a454120f 100644 (file)
@@ -73,7 +73,6 @@ dapl_ep_free (
 
     dapl_dbg_log (DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,
                   "dapl_ep_free (%p)\n", ep_handle);
-    DAPL_CNTR(DCNT_EP_FREE);
 
     ep_ptr = (DAPL_EP *) ep_handle;
     param = &ep_ptr->param;
@@ -86,6 +85,7 @@ dapl_ep_free (
        dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
        goto bail;
     }
+    DAPL_CNTR(ep_ptr->header.owner_ia, DCNT_IA_EP_FREE);
 
     if ( ep_ptr->param.ep_state == DAT_EP_STATE_RESERVED ||
         ep_ptr->param.ep_state == DAT_EP_STATE_PASSIVE_CONNECTION_PENDING ||
index 3af7f9ab8d7258f51b9bd4bfd3d14c8a2f6ebc6c..3f856d30f0218ec3750c57253ccb18619db037a8 100644 (file)
@@ -99,12 +99,12 @@ dapl_ep_get_status (
 
     if ( in_dto_idle != NULL )
     {
-       *in_dto_idle = (dapls_cb_pending(&ep_ptr->recv_buffer)) ? DAT_FALSE : DAT_TRUE;
+       *in_dto_idle = dapls_cb_pending(&ep_ptr->recv_buffer);
     }
 
     if ( out_dto_idle != NULL )
     {
-       *out_dto_idle = (dapls_cb_pending(&ep_ptr->req_buffer)) ? DAT_FALSE : DAT_TRUE;
+       *out_dto_idle = dapls_cb_pending(&ep_ptr->req_buffer);
     }
 
  bail:
index 95a7e0528e8b75aa98553a23ad95ea2880cde9a0..dc6c39c0d5560ea79c34c59b8ed35ee68a8c3bd4 100644 (file)
@@ -86,7 +86,6 @@ dapl_ep_post_rdma_read (
                  user_cookie.as_64,
                  remote_iov, 
                  completion_flags);
-    DAPL_CNTR(DCNT_POST_RDMA_READ);
 
     dat_status = dapl_ep_post_send_req(ep_handle, 
                                  num_segments, 
index 6b9ae9401511d2549d0a1d4cabedccacd07684a3..ef79d0cde307974e2cbf3b56c27a58df53b32cb6 100644 (file)
@@ -85,7 +85,6 @@ dapl_ep_post_rdma_write (
                  user_cookie.as_64,
                  remote_iov, 
                  completion_flags);
-    DAPL_CNTR(DCNT_POST_RDMA_WRITE);
 
     dat_status = dapl_ep_post_send_req(ep_handle, 
                                  num_segments, 
index 12724cddc7fc80a33bf3ac8f4c6d969f3326a4d3..b11eb96324fb65931dd664575ba160b5377f61ea 100644 (file)
@@ -85,7 +85,6 @@ dapl_ep_post_recv (
                  local_iov,
                  user_cookie.as_64,
                  completion_flags);
-    DAPL_CNTR (DCNT_POST_RECV);
 
     if ( DAPL_BAD_HANDLE (ep_handle, DAPL_MAGIC_EP) )
     {
index c13a0956a1a84078fac39fc039135d6e7b3c6ac5..022913208dbd9a56cae7e30f8bd4369df992229c 100644 (file)
@@ -84,7 +84,6 @@ dapl_ep_post_send (
                  local_iov, 
                  user_cookie.as_64,
                  completion_flags);
-    DAPL_CNTR(DCNT_POST_SEND);
 
     dat_status = dapl_ep_post_send_req(ep_handle,
                                  num_segments,
index 782e09ad6514c7cf1e6f8524d3927e98873b4e86..f75c0592a6785ccc1c8b9862737761e79bd71708 100644 (file)
@@ -125,6 +125,16 @@ dapl_ep_alloc (
     /* zero the structure */
     dapl_os_memzero (ep_ptr, sizeof (DAPL_EP) + sizeof (DAT_SOCK_ADDR));
 
+#ifdef DAPL_COUNTERS
+    /* Allocate counters */
+    ep_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS);
+    if (ep_ptr->cntrs == NULL) {
+       dapl_os_free(ep_ptr, sizeof (DAPL_EP) + sizeof (DAT_SOCK_ADDR));
+       return (NULL);
+    }
+    dapl_os_memzero (ep_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     /*
      * initialize the header
      */
@@ -227,6 +237,11 @@ dapl_ep_dealloc (
         ep_ptr->ibal_cm_handle = NULL;
     }
 #endif
+
+#ifdef DAPL_COUNTERS
+    dapl_os_free(ep_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     dapl_os_free (ep_ptr, sizeof (DAPL_EP) + sizeof (DAT_SOCK_ADDR) );
 }
 
index 7f994b0e013bc071de4b2edb9087e3e8914c4ce8..d5a9750d5a9f73b8d5108328515bcdc992c0db52 100644 (file)
@@ -84,8 +84,6 @@ dapl_evd_connection_callback (
        ib_cm_event,
        (void *) ib_cm_handle );
 
-    DAPL_CNTR(DCNT_EVD_CONN_CALLBACK);
-
     /*
      * Determine the type of handle passed back to us in the context
      * and sort out key parameters.
@@ -101,6 +99,7 @@ dapl_evd_connection_callback (
      */
     ep_ptr  = (DAPL_EP *) context;
     evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle;
+    DAPL_CNTR(evd_ptr, DCNT_EVD_CONN_CALLBACK);
 
     prd_ptr = (DAPL_PRIVATE *)private_data_ptr;
     private_data_size = 0;
index 2b0251ad7904d67ef87beb8bfb4445b278072d49..ca4bc8dca0905559393aa3ff8d9768896b66cba1 100644 (file)
@@ -79,6 +79,7 @@ dapl_evd_cq_async_error_callback (
 
     evd = (DAPL_EVD *) context;
     async_evd = evd->header.owner_ia->async_error_evd;
+    DAPL_CNTR(evd->header.owner_ia, DCNT_IA_ASYNC_CQ_ERROR);
 
     dat_status = dapls_evd_post_async_error_event(
        async_evd,
index f6faeebdd33c9ddf1c3b8e44037e67e02856bb0e..5a409f37fe5ebfdd0371df3e1d712499be29faed 100644 (file)
@@ -75,7 +75,6 @@ DAT_RETURN DAT_API dapl_evd_dequeue (
                  "dapl_evd_dequeue (%p, %p)\n",
                  evd_handle, 
                  event);
-    DAPL_CNTR(DCNT_EVD_DEQUEUE);
 
     evd_ptr = (DAPL_EVD *)evd_handle;
     dat_status = DAT_SUCCESS;
@@ -91,6 +90,7 @@ DAT_RETURN DAT_API dapl_evd_dequeue (
        dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG2);
        goto bail;
     }
+    DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE);
 
     /*
      * We need to dequeue under lock, as the IB OS Access API
@@ -122,17 +122,18 @@ DAT_RETURN DAT_API dapl_evd_dequeue (
        *event = *local_event;
        dat_status = dapls_rbuf_add (&evd_ptr->free_event_queue, 
                                     local_event);
-       DAPL_CNTR(DCNT_EVD_DEQUEUE_FOUND);
+       DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_FOUND);
+
     }
     else if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE)
     {
        dat_status = dapls_evd_cq_poll_to_event(evd_ptr, event);
-       DAPL_CNTR(DCNT_EVD_DEQUEUE_POLL);
+       DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_POLL);
     }
     else
     {
        dat_status = DAT_ERROR (DAT_QUEUE_EMPTY,0);
-       DAPL_CNTR(DCNT_EVD_DEQUEUE_NOT_FOUND);
+       DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_NOT_FOUND);
     }
 
     dapl_os_unlock ( &evd_ptr->header.lock );
index bb3e1f8fb78250203432fef64a239d4a006f36eb..347c2e900434f4a382b2eaa95ac0ee889731c64b 100755 (executable)
@@ -84,9 +84,9 @@ dapl_evd_dto_callback (
                  hca_handle, 
                  cq_handle, 
                  user_context);
-    DAPL_CNTR(DCNT_EVD_DTO_CALLBACK);
 
     evd_ptr = (DAPL_EVD *) user_context;
+    DAPL_CNTR(evd_ptr, DCNT_EVD_DTO_CALLBACK);
 
     dapl_os_assert (hca_handle == evd_ptr->header.owner_ia->hca_ptr->ib_hca_handle);
     dapl_os_assert (evd_ptr->ib_cq_handle == cq_handle);
index 4d126b2183811492b87eedd4f14ef086967b96cd..8e4d08235b77114d96bfc14fc99d394934d5a167 100755 (executable)
@@ -68,7 +68,6 @@ DAT_RETURN DAT_API dapl_evd_free (
     DAT_RETURN  dat_status;
 
     dapl_dbg_log (DAPL_DBG_TYPE_API, "dapl_evd_free (%p)\n", evd_handle);
-    DAPL_CNTR (DCNT_EVD_FREE);
 
     dat_status = DAT_SUCCESS;
     evd_ptr = (DAPL_EVD *)evd_handle;
@@ -79,6 +78,8 @@ DAT_RETURN DAT_API dapl_evd_free (
        goto bail;
     }
 
+    DAPL_CNTR(evd_ptr->header.owner_ia, DCNT_IA_EVD_FREE);
+
     if (dapl_os_atomic_read (&evd_ptr->evd_ref_count) != 0)
     {
        dat_status = DAT_ERROR (DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE);
index b14db3ce0598a24fd78b1413370eebd0e85ebd4b..27b6ddc024632dff32103846df06973362c17fa1 100644 (file)
@@ -114,6 +114,7 @@ dapl_evd_qp_async_error_callback (
 
     ia_ptr    = ep_ptr->header.owner_ia;
     async_evd = (DAPL_EVD *) ia_ptr->async_error_evd;
+    DAPL_CNTR(ia_ptr, DCNT_IA_ASYNC_QP_ERROR);
 
     dapl_dbg_log (
        DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION,
index 5ba0f3e2d5f8d8b6bc6e6b5f3198690f4f1bc206..987aee20ec206e73c389e8d48a0bd113ffbe4ec2 100644 (file)
@@ -78,6 +78,7 @@ dapl_evd_un_async_error_callback (
     }
 
     async_evd = (DAPL_EVD *) context;
+    DAPL_CNTR(async_evd->header.owner_ia, DCNT_IA_ASYNC_ERROR);
 
     dat_status = dapls_ib_get_async_event(cause_ptr, &async_event);
 
index c6c74630c3ee282d443ecceb28c0fb116402db4b..ad3d13dde1f5f6b7a6d96b13ecd5d4e9f2da0e7f 100644 (file)
@@ -273,6 +273,17 @@ dapls_evd_alloc (
     /* zero the structure */
     dapl_os_memzero (evd_ptr, sizeof (DAPL_EVD));
 
+#ifdef DAPL_COUNTERS
+    /* Allocate counters */
+    evd_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
+    if (evd_ptr->cntrs == NULL) {
+       dapl_os_free(evd_ptr, sizeof(DAPL_EVD));
+       return (NULL);
+    }
+    dapl_os_memzero(evd_ptr->cntrs, 
+                   sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     /*
      * initialize the header
      */
@@ -542,6 +553,10 @@ dapls_evd_dealloc (
     }
 #endif
 
+#ifdef DAPL_COUNTERS
+    dapl_os_free(evd_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     dapl_os_free (evd_ptr, sizeof (DAPL_EVD));
 
 bail:
index 7b03afc2cb1b2b5b95b02826c8a4a750006066a8..a42063b085f98a80488d6ba3fcb4aab2c83f9318 100755 (executable)
@@ -78,6 +78,16 @@ dapl_ia_alloc ( DAT_PROVIDER * provider, DAPL_HCA * hca_ptr )
     /* zero the structure */
     dapl_os_memzero (ia_ptr, sizeof (DAPL_IA));
 
+#ifdef DAPL_COUNTERS
+    /* Allocate counters */
+    ia_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS);
+    if (ia_ptr->cntrs == NULL) {
+       dapl_os_free (ia_ptr, sizeof(DAPL_IA));
+       return (NULL);
+    }
+    dapl_os_memzero(ia_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     /*
      * initialize the header
      */
@@ -596,6 +606,10 @@ dapls_ia_free ( DAPL_IA *ia_ptr )
     ia_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */
     dapl_os_lock_destroy (&ia_ptr->header.lock);
 
+#ifdef DAPL_COUNTERS
+    dapl_os_free(ia_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS);
+#endif /* DAPL_COUNTERS */
+
     dapl_os_free (ia_ptr, sizeof (DAPL_IA));
 }
 
index f4106b40738411aece8ac3d4808ec0a5e7132c86..3fa67b28e3f6f8bae821b9d85f2a345ce51575c7 100644 (file)
@@ -62,6 +62,7 @@ dapl_lmr_free (
     IN DAT_LMR_HANDLE  lmr_handle )
 {
     DAPL_LMR           *lmr;
+    DAPL_PZ            *pz;
     DAT_RETURN         dat_status;
 
     dapl_dbg_log (DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle);
@@ -72,7 +73,10 @@ dapl_lmr_free (
        goto bail;
     }
 
-    lmr = (DAPL_LMR *) lmr_handle;
+    lmr = (DAPL_LMR *)lmr_handle;
+    pz = (DAPL_PZ *)lmr->param.pz_handle;
+    
+    DAPL_CNTR(pz->header.owner_ia, DCNT_IA_LMR_FREE);
 
     switch (lmr->param.mem_type)
     {
@@ -85,8 +89,6 @@ dapl_lmr_free (
        case DAT_MEM_TYPE_VIRTUAL:
        case DAT_MEM_TYPE_LMR:
        {
-           DAPL_PZ     *pz;
-
            if ( 0 != dapl_os_atomic_read (&lmr->lmr_ref_count) )
            {
                return DAT_INVALID_STATE;
@@ -103,10 +105,7 @@ dapl_lmr_free (
 
            if (dat_status == DAT_SUCCESS)
            {
-
-               pz = (DAPL_PZ *) lmr->param.pz_handle;
                dapl_os_atomic_dec (&pz->pz_ref_count);
-
                dapl_lmr_dealloc (lmr);
            }
            else
index 9d2e945aa34c9341e6ee49c319ff8d8605c6bf04..a6eb31c47c8748b51f98d93c795f056edad05971 100644 (file)
@@ -114,7 +114,8 @@ dapl_psp_create (
        dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG4);
        goto bail;
     }
-       
+
+    DAPL_CNTR(ia_ptr, DCNT_IA_PSP_CREATE);     
 
     /*
      * See if we have a quiescent listener to use for this PSP, else
index e2faa4a1b0fa91d0a9b420c9dd1668f061f09136..9b9b575759a75a64944c375f293c8d7a549ce563 100644 (file)
@@ -133,6 +133,8 @@ dapl_psp_create_any (
        goto bail;
     }
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_PSP_CREATE_ANY); 
+
     /*
      * Fill out the args for a PSP
      */
index 28913b487c8432f30cebc521d4ac8c794e1a0361..0117e19b633e9f9ce1b4894379f996be34553d54 100644 (file)
@@ -82,6 +82,8 @@ dapl_psp_free (
 
     ia_ptr = sp_ptr->header.owner_ia;
 
+    DAPL_CNTR(ia_ptr->header.owner_ia, DCNT_IA_PSP_FREE);
+
     /* 
      * Remove the connection listener if it has been established
      * and there are no current connections in progress.
index a7105aadde2dbedfda5cc7715e8ffc6f2cfbda86..efca31160c53ed3e7e27254b6795e9b3f0ac738e 100644 (file)
@@ -90,6 +90,7 @@ dapl_pz_create (
        dat_status = DAT_ERROR (DAT_INSUFFICIENT_RESOURCES,DAT_RESOURCE_MEMORY);
        goto bail;
     }
+    DAPL_CNTR(ia, DCNT_IA_PZ_CREATE);
 
     dat_status = dapls_ib_pd_alloc (ia, pz);
     if ( DAT_SUCCESS != dat_status )
index b2510f70064aedfc6a519970de5f6496cf9a08a2..270dd38c3c760fbfe680f9bb34edcd9ef46ca8d2 100644 (file)
@@ -72,6 +72,8 @@ dapl_pz_free (
 
     pz = (DAPL_PZ *) pz_handle;
 
+    DAPL_CNTR(pz->header.owner_ia, DCNT_IA_PZ_FREE);
+
     if ( 0 != dapl_os_atomic_read (&pz->pz_ref_count) )
     {
        dat_status = DAT_ERROR (DAT_INVALID_STATE,DAT_INVALID_STATE_PZ_IN_USE);
index 9a7dbd91e33fcadd0654becff6a4e82413f03d91..d3e1661e95efecd7cc7a89d4ec1445d2eeae160f 100755 (executable)
@@ -71,7 +71,6 @@ dapl_rmr_create (
     }
 
     pz = (DAPL_PZ *) pz_handle;
-
     rmr = dapl_rmr_alloc (pz);
 
     if ( rmr == NULL )
@@ -79,6 +78,7 @@ dapl_rmr_create (
        dat_status = DAT_ERROR (DAT_INSUFFICIENT_RESOURCES,DAT_RESOURCE_MEMORY);
        goto bail;
     }
+    DAPL_CNTR(pz->header.owner_ia, DCNT_IA_RMR_CREATE);
 
     dat_status = dapls_ib_mw_alloc (rmr);
 
index a4edb13ff37240df18cee756dbfa98571aae8385..f75aaeda93fc5f56e46ff704bb8a1a876c091ca9 100644 (file)
@@ -58,6 +58,7 @@ dapl_rmr_free (
     IN DAT_RMR_HANDLE  rmr_handle )
 {
     DAPL_RMR           *rmr;
+    DAPL_PZ            *pz;
     DAT_RETURN         dat_status;
 
     dat_status = DAT_SUCCESS;
@@ -69,6 +70,8 @@ dapl_rmr_free (
     }
 
     rmr = (DAPL_RMR *) rmr_handle;
+    pz = (DAPL_PZ *)rmr->param.pz_handle;
+    DAPL_CNTR(pz->header.owner_ia, DCNT_IA_RMR_FREE);
 
     /*
      * If the user did not perform an unbind op, release
index a9c9b5f85648ead5c3087b11fdd03509f2926fe0..cf41dd9162bf08ec3263008cd607477b7efb41ef 100644 (file)
@@ -126,6 +126,8 @@ dapl_rsp_create (
        goto bail;
     }
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_RSP_CREATE);     
+
     sp_ptr = dapls_ia_sp_search (ia_ptr, conn_qual, DAT_FALSE);
     sp_found = DAT_TRUE;
     if (sp_ptr == NULL)
index b7bc40c09e8ac2681dda941a8563040e387d64fc..e016f0df706e3f312400cd582ca894bfd10cdb62 100644 (file)
@@ -85,6 +85,8 @@ dapl_rsp_free (
     /* ia_ptr = (DAPL_IA *)sp_ptr->header.owner_ia; */
     ia_ptr = sp_ptr->header.owner_ia;
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_RSP_FREE);       
+
     /*
      * Remove the connection listener if there are no connections.  If
      * we defer removing the sp it becomes something of a zombie
index b03bbd64c752a8300f0126ba66e3204a015b1524..ef45826f953d8fc7c42a475a65c902feb1ed4d6a 100644 (file)
@@ -97,6 +97,8 @@ dapl_srq_create (
        goto bail;
     }
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_SRQ_CREATE);
+
     /*
      * Verify non-required parameters.
      * N.B. Assumption: any parameter that can be
index 55d74fce6fcf56d0fa1000e10fdf38ce89d5975b..9decf54e01125d299f0334a7f6b6930f5ebaf2bc 100644 (file)
@@ -96,6 +96,8 @@ dapl_srq_free (
 
     ia_ptr = srq_ptr->header.owner_ia;
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_SRQ_FREE);
+
     /*
      * Do verification of parameters and the state change atomically.
      */
index c7407c1c3ec1b77e18ff8c7eef787d560f1af040..12c41bc5decad164228725a7d92a00c58bb69e38 100644 (file)
@@ -107,7 +107,6 @@ dapls_timer_set (
     DAPL_OS_TIMEVAL            cur_time;
     DAT_BOOLEAN                        wakeup_tmo_thread;
 
-    DAPL_CNTR(DCNT_TIMER_SET);
     /*
      * Start the timer thread the first time we need a timer
      */
@@ -216,7 +215,6 @@ void
 dapls_timer_cancel (
        IN  DAPL_OS_TIMER               *timer)
 {
-    DAPL_CNTR(DCNT_TIMER_CANCEL);
     dapl_os_lock ( &g_daplTimerHead.lock );
     /*
      * make sure the entry has not been removed by another thread
index b05c0bb111a93a2677846c094bd4a2f7baff0841..643125daba97dac581971568fe53803ed6ebcb39 100644 (file)
@@ -93,8 +93,6 @@ dapl_extensions(IN DAT_HANDLE         dat_handle,
                     "dapl_extensions(hdl %p operation %d, ...)\n",
                     dat_handle, ext_op);
 
-       DAPL_CNTR(DCNT_EXTENSION);
-
        switch ((int)ext_op)
        {
        
index e2025ce7dbc57cb28675c10f4b0ae5306fc5560a..b13c96311f0e80e809c3a57d9adb919841ee04bb 100755 (executable)
@@ -313,6 +313,9 @@ struct dapl_ia
     DAPL_LLIST_HEAD    psp_list_head;          /* PSP queue */
     DAPL_LLIST_HEAD    rsp_list_head;          /* RSP queue */
     DAPL_LLIST_HEAD    srq_list_head;          /* SRQ queue */
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
 };
 
 /* DAPL_CNO maps to DAT_CNO_HANDLE */
@@ -388,6 +391,10 @@ struct dapl_evd
 
     DAT_COUNT          threshold;
     DAPL_EVD_COMPLETION        completion_type;
+
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
 };
 
 /* DAPL_PRIVATE used to pass private data in a connection */
@@ -472,6 +479,9 @@ struct dapl_ep
     DAT_BOOLEAN         sent_discreq;
     dp_ib_cm_handle_t   ibal_cm_handle;
 #endif
+#ifdef DAPL_COUNTERS
+    void               *cntrs;
+#endif
 };
 
 /* DAPL_SRQ maps to DAT_SRQ_HANDLE */
index f0de7c8aee71fed2785cbec07c4b51474c56b0b7..d0342274b343527b341cf7df279e43fecade34fc 100644 (file)
@@ -99,50 +99,25 @@ static __inline void dapl_dbg_log ( DAPL_DBG_TYPE type,  const char *fmt,  ...)
 
 #endif /* !DAPL_DBG */
 
-/*
- * Counters
- */
-#define DCNT_EP_CREATE                 0
-#define DCNT_EP_FREE                   1
-#define DCNT_EP_CONNECT                        2
-#define DCNT_EP_DISCONNECT             3
-#define DCNT_POST_SEND                 4
-#define DCNT_POST_RECV                 5
-#define DCNT_POST_RDMA_WRITE           6
-#define DCNT_POST_RDMA_READ            7
-#define DCNT_EVD_CREATE                        8
-#define DCNT_EVD_FREE                  9
-#define DCNT_EVD_WAIT                  10
-#define DCNT_EVD_WAIT_BLOCKED          11
-#define DCNT_EVD_WAIT_CMP_NTFY         12
-#define DCNT_EVD_DTO_CALLBACK          13
-#define DCNT_EVD_CONN_CALLBACK         14
-#define DCNT_EVD_DEQUEUE               15
-#define DCNT_EVD_DEQUEUE_POLL          16
-#define DCNT_EVD_DEQUEUE_FOUND         17
-#define DCNT_EVD_DEQUEUE_NOT_FOUND     18
-#define DCNT_TIMER_SET                 19
-#define DCNT_TIMER_CANCEL              20
-#define DCNT_EXTENSION                 21
-#define DCNT_NUM_COUNTERS              22
-#define DCNT_ALL_COUNTERS               DCNT_NUM_COUNTERS
-
-#if defined(DAPL_COUNTERS)
-
-extern void dapl_dump_cntr( int cntr );
-extern int dapl_dbg_counters[];
-
-#define DAPL_CNTR(cntr)         dapl_os_atomic_inc (&dapl_dbg_counters[cntr]);
-#define DAPL_DUMP_CNTR(cntr)    dapl_dump_cntr( cntr );
-#define DAPL_COUNTERS_INIT()
+#include <dat2/dat_ib_extensions.h>
+
+#ifdef DAPL_COUNTERS
+
+#define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++
+#define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data
+
+DAT_RETURN dapl_query_counter(DAT_HANDLE dh, 
+                             int counter, 
+                             void *p_cntrs_out,
+                             int reset);
+char *dapl_query_counter_name(DAT_HANDLE dh, int counter);
+void dapl_print_counter(DAT_HANDLE dh, int counter, int reset);
 
 #else
 
-#define DAPL_CNTR(cntr)
-#define DAPL_DUMP_CNTR(cntr) 
-#define DAPL_COUNTERS_INIT()
+#define DAPL_CNTR(handle, cntr)
+#define DAPL_CNTR_DATA(handle, cntr, data)
 
 #endif /* DAPL_COUNTERS */
 
-
 #endif /* _DAPL_DEBUG_H_ */
index 2b01963abdf101af47c20b8a648d531d44c7445b..eba19b7ca8a88658601a0e9e10e596bb2516badd 100644 (file)
@@ -89,7 +89,7 @@ dapls_ib_post_recv (
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
-       
+
        /* setup work request */
        total_len = 0;
        wr.next = 0;
@@ -126,6 +126,9 @@ dapls_ib_post_recv (
        if (ret)
                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);
+
        return DAT_SUCCESS;
 }
 
@@ -237,6 +240,25 @@ dapls_ib_post_send (
        if (ret)
                return( dapl_convert_errno(errno,"ibv_send") );
 
+#ifdef DAPL_COUNTERS
+       switch (op_type) {
+       case OP_SEND:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len);
+               break;
+       case OP_RDMA_WRITE:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len);
+               break;  
+       case OP_RDMA_READ:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len);
+               break;
+       default:
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }
@@ -416,7 +438,25 @@ dapls_ib_post_ext_send (
 
        if (ret)
                return( dapl_convert_errno(errno,"ibv_send") );
-       
+
+#ifdef DAPL_COUNTERS
+       switch (op_type) {
+       case OP_RDMA_WRITE_IMM:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM);
+               DAPL_CNTR_DATA(ep_ptr, 
+                              DCNT_EP_POST_WRITE_IMM_DATA, total_len);
+               break;
+       case OP_COMP_AND_SWAP:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP);
+               break;  
+       case OP_FETCH_AND_ADD:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD);
+               break;
+       default:
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }
@@ -434,6 +474,10 @@ dapls_ib_optional_prv_dat(
 /* map Work Completions to DAPL WR operations */
 STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
 {
+#ifdef DAPL_COUNTERS
+       DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id;
+#endif /* DAPL_COUNTERS */
+
        switch (cqe_p->opcode) {
        case IBV_WC_SEND:
                return (OP_SEND);
@@ -451,11 +495,21 @@ STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
        case IBV_WC_BIND_MW:
                return (OP_BIND_MW);
        case IBV_WC_RECV:
-               if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
+               if (cqe_p->wc_flags & IBV_WC_WITH_IMM) {
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM);
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, 
+                                      cqe_p->byte_len);
                        return (OP_RECEIVE_IMM);
-               else
+               } else {
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV);
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, 
+                                      cqe_p->byte_len);
                        return (OP_RECEIVE);
+               }
        case IBV_WC_RECV_RDMA_WITH_IMM:
+               DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM);
+               DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, 
+                              cqe_p->byte_len);
                return (OP_RECEIVE_IMM);
        default:
                return (OP_INVALID);
index 1402057b82fa9a642aae05363b497eacaaa291ab..af34128d6fac62e07951a3a90ba86c9f1b8556be 100755 (executable)
@@ -94,8 +94,6 @@ dapl_extensions(IN DAT_HANDLE         dat_handle,
                     "dapl_extensions(hdl %p operation %d, ...)\n",
                     dat_handle, ext_op);
 
-       DAPL_CNTR(DCNT_EXTENSION);
-
        switch ((int)ext_op)
        {
        
@@ -150,6 +148,39 @@ dapl_extensions(IN DAT_HANDLE              dat_handle,
 
                break;
 
+#ifdef DAPL_COUNTERS
+       case DAT_QUERY_COUNTERS_OP:
+       {
+               int cntr, reset;
+               DAT_UINT64 * p_cntr_out;
+
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN, 
+                            " Query counter extension call\n");
+               
+               cntr = va_arg(args, int);
+               p_cntr_out = va_arg(args, DAT_UINT64*);
+               reset  = va_arg(args, int);
+                               
+               status = dapl_query_counter(dat_handle, cntr, 
+                                           p_cntr_out, reset);
+               break;
+       }
+       case DAT_PRINT_COUNTERS_OP:
+       {
+               int cntr, reset;
+               
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN, 
+                            " Print counter extension call\n");
+               
+               cntr = va_arg(args, int);
+               reset  = va_arg(args, int);
+
+               dapl_print_counter(dat_handle, cntr, reset);
+               status = DAT_SUCCESS;
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        default:
                dapl_dbg_log(DAPL_DBG_TYPE_ERR, 
                             "unsupported extension(%d)\n", (int)ext_op);
index 36b534e6dcc0c593edc2457d9d7099adc38910bc..c5641f0177095ed269f6737d41d26a097f5d4097 100755 (executable)
@@ -970,6 +970,11 @@ DAT_NAMED_ATTR     ib_attrs[] = {
     {
        DAT_IB_ATTR_IMMED_DATA, "TRUE"
     },
+#ifdef DAPL_COUNTERS
+    {
+        DAT_ATTR_COUNTERS, "TRUE"
+    },
+#endif /* DAPL_COUNTERS */
 #endif
 };
 
index fa19d01ddefd8b13d4d48addc67079dabb4c51df..ff338fcdecb223807ebeca06d4e59dc4a444fde4 100644 (file)
@@ -92,7 +92,7 @@ dapls_ib_post_recv (
 
        if (NULL == ds_array_p)
                return (DAT_INSUFFICIENT_RESOURCES);
-       
+
        /* setup work request */
        total_len = 0;
        wr.next = 0;
@@ -129,6 +129,9 @@ dapls_ib_post_recv (
        if (ret)
                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);
+
        return DAT_SUCCESS;
 }
 
@@ -244,6 +247,25 @@ dapls_ib_post_send (
        if (ret)
                return( dapl_convert_errno(errno,"ibv_send") );
 
+#ifdef DAPL_COUNTERS
+       switch (op_type) {
+       case OP_SEND:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len);
+               break;
+       case OP_RDMA_WRITE:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len);
+               break;  
+       case OP_RDMA_READ:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len);
+               break;
+       default:
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
        return DAT_SUCCESS;
 }
@@ -452,8 +474,30 @@ dapls_ib_post_ext_send (
        if (ret)
                return( dapl_convert_errno(errno,"ibv_send") );
        
+#ifdef DAPL_COUNTERS
+       switch (op_type) {
+       case OP_RDMA_WRITE_IMM:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM);
+               DAPL_CNTR_DATA(ep_ptr, 
+                              DCNT_EP_POST_WRITE_IMM_DATA, total_len);
+               break;
+       case OP_COMP_AND_SWAP:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP);
+               break;  
+       case OP_FETCH_AND_ADD:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD);
+               break;
+       case OP_SEND_UD:
+               DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND_UD);
+               DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_UD_DATA, total_len);
+               break;
+       default:
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n");
-       return DAT_SUCCESS;
+        return DAT_SUCCESS;
 }
 #endif
 
@@ -470,6 +514,10 @@ dapls_ib_optional_prv_dat(
 /* map Work Completions to DAPL WR operations */
 STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
 {
+#ifdef DAPL_COUNTERS
+       DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id;
+#endif /* DAPL_COUNTERS */
+
        switch (cqe_p->opcode) {
        case IBV_WC_SEND:
                if (CQE_WR_TYPE_UD(cqe_p->wr_id))
@@ -490,13 +538,27 @@ STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p)
        case IBV_WC_BIND_MW:
                return (OP_BIND_MW);
        case IBV_WC_RECV:
-               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) 
+               if (CQE_WR_TYPE_UD(cqe_p->wr_id)) {
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_UD);
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_UD_DATA, 
+                                      cqe_p->byte_len);
                        return (OP_RECV_UD);
-               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM)
-                       return (OP_RECEIVE_MSG_IMM);
-               else
+               }
+               else if (cqe_p->wc_flags & IBV_WC_WITH_IMM) {
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM);
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, 
+                                      cqe_p->byte_len);
+                       return (OP_RECEIVE_IMM);
+               } else {
+                       DAPL_CNTR(cookie->ep, DCNT_EP_RECV);
+                       DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, 
+                                      cqe_p->byte_len);
                        return (OP_RECEIVE);
+               }
        case IBV_WC_RECV_RDMA_WITH_IMM:
+               DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM);
+               DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, 
+                              cqe_p->byte_len);
                return (OP_RECEIVE_IMM);
        default:
                return (OP_INVALID);
index 692c8a8dab92f511f0f29997f4e07898fae11d05..1d23ca360029a2f3c5b578b2c26bdf1d42340dc6 100755 (executable)
@@ -96,8 +96,6 @@ dapl_extensions(IN DAT_HANDLE         dat_handle,
                     "dapl_extensions(hdl %p operation %d, ...)\n",
                     dat_handle, ext_op);
 
-       DAPL_CNTR(DCNT_EXTENSION);
-
        switch ((int)ext_op)
        {
        
@@ -167,6 +165,39 @@ dapl_extensions(IN DAT_HANDLE              dat_handle,
                                        OP_SEND_UD, comp_flags, ah);
                break;
 
+#ifdef DAPL_COUNTERS
+       case DAT_QUERY_COUNTERS_OP:
+       {
+               int cntr, reset;
+               DAT_UINT64 * p_cntr_out;
+
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN, 
+                            " Query counter extension call\n");
+               
+               cntr = va_arg(args, int);
+               p_cntr_out = va_arg(args, DAT_UINT64*);
+               reset  = va_arg(args, int);
+                               
+               status = dapl_query_counter(dat_handle, cntr, 
+                                           p_cntr_out, reset);
+               break;
+       }
+       case DAT_PRINT_COUNTERS_OP:
+       {
+               int cntr, reset;
+               
+               dapl_dbg_log(DAPL_DBG_TYPE_RTN, 
+                            " Print counter extension call\n");
+               
+               cntr = va_arg(args, int);
+               reset  = va_arg(args, int);
+                               
+               dapl_print_counter(dat_handle, cntr, reset);
+               status = DAT_SUCCESS;
+               break;
+       }
+#endif /* DAPL_COUNTERS */
+
        default:
                dapl_dbg_log(DAPL_DBG_TYPE_ERR, 
                             "unsupported extension(%d)\n", (int)ext_op);
index d82d3f5060f13e7668bda26ac277e6e2db80c8f0..7623529a74b3268197c1327f7ca69f4f628ddd50 100644 (file)
@@ -618,6 +618,11 @@ DAT_NAMED_ATTR  ib_attrs[] = {
     {
         DAT_IB_ATTR_UD, "TRUE"
     },
+#ifdef DAPL_COUNTERS
+    {
+        DAT_ATTR_COUNTERS, "TRUE"
+    },
+#endif /* DAPL_COUNTERS */
 #endif
 };
 
index 7687a81bf12b5d1d62e21584ab3da06ed10ddf7a..5ca5c225498acffd7b09e1f3d608825dad84d630 100644 (file)
@@ -95,7 +95,6 @@ DAT_RETURN DAT_API dapl_evd_create (
                  cno_handle, 
                  evd_flags, 
                  evd_handle);
-    DAPL_CNTR(DCNT_EVD_CREATE);
 
     ia_ptr      = (DAPL_IA *)ia_handle;
     cno_ptr     = (DAPL_CNO *)cno_handle;
@@ -109,6 +108,8 @@ DAT_RETURN DAT_API dapl_evd_create (
        goto bail;
     }
 
+    DAPL_CNTR(ia_ptr, DCNT_IA_EVD_CREATE);
+
     if ( evd_min_qlen <= 0 )
     {
        dat_status = DAT_ERROR (DAT_INVALID_PARAMETER,DAT_INVALID_ARG2);
index 578041a8456c62a77480cbbefefb3418be59c346..9fc0ba23428b2619cbf9a343b798c8bb3df6e9e6 100644 (file)
@@ -85,7 +85,6 @@ DAT_RETURN DAT_API dapl_evd_wait (
                  threshold, 
                  event, 
                  nmore);
-    DAPL_CNTR(DCNT_EVD_WAIT);
 
     evd_ptr = (DAPL_EVD *)evd_handle;
     dat_status = DAT_SUCCESS;
@@ -122,6 +121,7 @@ DAT_RETURN DAT_API dapl_evd_wait (
        dat_status = DAT_ERROR (DAT_INVALID_STATE,0);
        goto bail;
     }
+    DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT);
 
     dapl_dbg_log (DAPL_DBG_TYPE_EVD, 
                  "dapl_evd_wait: EVD %p, CQ %p\n", 
@@ -206,7 +206,7 @@ DAT_RETURN DAT_API dapl_evd_wait (
                (evd_ptr->completion_type == DAPL_EVD_STATE_SOLICITED_WAIT) ?
                     IB_NOTIFY_ON_SOLIC_COMP : IB_NOTIFY_ON_NEXT_COMP );  
 
-           DAPL_CNTR(DCNT_EVD_WAIT_CMP_NTFY);
+           DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT_NOTIFY);
            /* FIXME report error */
            dapl_os_assert(dat_status == DAT_SUCCESS);
 
@@ -225,7 +225,7 @@ DAT_RETURN DAT_API dapl_evd_wait (
         */
        evd_ptr->threshold = threshold; 
 
-       DAPL_CNTR(DCNT_EVD_WAIT_BLOCKED);
+       DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT_BLOCKED);
 
 #ifdef CQ_WAIT_OBJECT
        if (evd_ptr->cq_wait_obj_handle)
index a4afba53d9657cb925fedbd0c8a2f7b871563dc7..f19468bad4de8d660d8833022e011fd9feb47e51 100644 (file)
@@ -115,8 +115,6 @@ void dapl_init ( void )
        goto bail;
     }
 
-    DAPL_COUNTERS_INIT();
-
     return;
 
 bail:
index 99b184ae30923e58e30e2398d763f8391173bd5c..dd93445a9bebd6e8de555809d09102230be4c5b7 100644 (file)
@@ -489,6 +489,8 @@ dapl_lmr_create (
     ia = (DAPL_IA *) ia_handle;
     pz = (DAPL_PZ *) pz_handle;
 
+    DAPL_CNTR(ia, DCNT_IA_LMR_CREATE); 
+
     switch (mem_type)
     {
        case DAT_MEM_TYPE_VIRTUAL:
index ae029446afacf81963144f70e88768406a2befa7..974a0f0a383c0e3a81f00541874086bbf9f37d30 100644 (file)
@@ -539,10 +539,11 @@ DAT_RETURN dapl_os_get_time (DAPL_OS_TIMEVAL *);
  * ability to define 64 bit formats, which unfortunatly are non standard
  * in the C compiler world. E.g. %llx for gcc, %I64x for Windows
  */
-#define F64d   "%lld"
-#define F64u   "%llu"
-#define F64x   "%llx"
-#define F64X   "%llX"
+#include <inttypes.h>
+#define F64d   "%"PRId64
+#define F64u   "%"PRIu64
+#define F64x   "%"PRIx64
+#define F64X   "%"PRIX64
 
 
 /*
index eb10714849c204a73d74a18c6e847112afd4f5d4..2c082b1b295347161d2c66e0411b7be5909555ca 100755 (executable)
  *     DAT_NAMED_ATTR  name == extended operations and version, 
  *                     version_value = version number of extension API
  */
-#define DAT_IB_EXTENSION_VERSION       202     /* 2.0.2 */
+
+/* 2.0.1 - Initial IB extension support, atomic and immed data
+ *         dat_ib_post_fetch_and_add()
+ *         dat_ib_post_cmp_and_swap()
+ *         dat_ib_post_rdma_write_immed()
+ *             
+ * 2.0.2 - Add UD support, post send and remote_ah via connect events 
+ *         dat_ib_post_send_ud()
+ *
+ * 2.0.3 - Add query/print counter support for IA, EP, and EVD's 
+ *         dat_query_counters(), dat_print_counters()
+ *
+ */
+#define DAT_IB_EXTENSION_VERSION       203     /* 2.0.3 */
+#define DAT_ATTR_COUNTERS              "DAT_COUNTERS"
 #define DAT_IB_ATTR_FETCH_AND_ADD      "DAT_IB_FETCH_AND_ADD"
 #define DAT_IB_ATTR_CMP_AND_SWAP       "DAT_IB_CMP_AND_SWAP"
 #define DAT_IB_ATTR_IMMED_DATA         "DAT_IB_IMMED_DATA"
@@ -87,7 +101,9 @@ typedef enum dat_ib_op
        DAT_IB_FETCH_AND_ADD_OP,
        DAT_IB_CMP_AND_SWAP_OP,
        DAT_IB_RDMA_WRITE_IMMED_OP,
-       DAT_IB_UD_SEND_OP
+       DAT_IB_UD_SEND_OP,
+       DAT_QUERY_COUNTERS_OP,
+       DAT_PRINT_COUNTERS_OP
        
 } DAT_IB_OP;
 
@@ -247,6 +263,92 @@ typedef enum dat_ib_service_type
 
 } DAT_IB_SERVICE_TYPE;
 
+/*
+ * Definitions for 64-bit IA Counters
+ */
+typedef enum dat_ia_counters
+{
+       DCNT_IA_PZ_CREATE,
+       DCNT_IA_PZ_FREE,
+       DCNT_IA_LMR_CREATE,
+       DCNT_IA_LMR_FREE,
+       DCNT_IA_RMR_CREATE,
+       DCNT_IA_RMR_FREE,
+       DCNT_IA_PSP_CREATE,
+       DCNT_IA_PSP_CREATE_ANY,
+       DCNT_IA_PSP_FREE,
+       DCNT_IA_RSP_CREATE,
+       DCNT_IA_RSP_FREE,
+       DCNT_IA_EVD_CREATE,
+       DCNT_IA_EVD_FREE,
+       DCNT_IA_EP_CREATE,
+       DCNT_IA_EP_FREE,
+       DCNT_IA_SRQ_CREATE,
+       DCNT_IA_SRQ_FREE,
+       DCNT_IA_SP_CR,
+       DCNT_IA_SP_CR_ACCEPTED,
+       DCNT_IA_SP_CR_REJECTED,
+       DCNT_IA_MEM_ALLOC,
+       DCNT_IA_MEM_ALLOC_DATA,
+       DCNT_IA_MEM_FREE,
+       DCNT_IA_ASYNC_ERROR,
+       DCNT_IA_ASYNC_QP_ERROR,
+       DCNT_IA_ASYNC_CQ_ERROR,
+       DCNT_IA_ALL_COUNTERS,  /* MUST be last */
+
+} DAT_IA_COUNTERS;
+
+/*
+ * Definitions for 64-bit EP Counters
+ */
+typedef enum dat_ep_counters
+{
+       DCNT_EP_CONNECT,
+       DCNT_EP_DISCONNECT,
+       DCNT_EP_POST_SEND,
+       DCNT_EP_POST_SEND_DATA,
+       DCNT_EP_POST_SEND_UD,
+       DCNT_EP_POST_SEND_UD_DATA,
+       DCNT_EP_POST_RECV,
+       DCNT_EP_POST_RECV_DATA,
+       DCNT_EP_POST_WRITE,
+       DCNT_EP_POST_WRITE_DATA,
+       DCNT_EP_POST_WRITE_IMM,
+       DCNT_EP_POST_WRITE_IMM_DATA,
+       DCNT_EP_POST_READ,
+       DCNT_EP_POST_READ_DATA,
+       DCNT_EP_POST_CMP_SWAP,
+       DCNT_EP_POST_FETCH_ADD,
+       DCNT_EP_RECV,
+       DCNT_EP_RECV_DATA,
+       DCNT_EP_RECV_UD,
+       DCNT_EP_RECV_UD_DATA,
+       DCNT_EP_RECV_IMM,
+       DCNT_EP_RECV_IMM_DATA,
+       DCNT_EP_RECV_RDMA_IMM,
+       DCNT_EP_RECV_RDMA_IMM_DATA,
+       DCNT_EP_ALL_COUNTERS,  /* MUST be last */
+
+} DAT_EP_COUNTERS;
+
+/*
+ * Definitions for 64-bit EVD Counters
+ */
+typedef enum dat_evd_counters
+{
+       DCNT_EVD_WAIT,
+       DCNT_EVD_WAIT_BLOCKED,
+       DCNT_EVD_WAIT_NOTIFY,
+       DCNT_EVD_DEQUEUE,
+       DCNT_EVD_DEQUEUE_FOUND,
+       DCNT_EVD_DEQUEUE_NOT_FOUND,
+       DCNT_EVD_DEQUEUE_POLL,
+       DCNT_EVD_DEQUEUE_POLL_FOUND,
+       DCNT_EVD_CONN_CALLBACK,
+       DCNT_EVD_DTO_CALLBACK,
+       DCNT_EVD_ALL_COUNTERS,  /* MUST be last */
+
+} DAT_EVD_COUNTERS;
 
 /* Extended RETURN and EVENT STATUS string helper functions */
 
@@ -370,5 +472,32 @@ dat_strerror_ext_status (
                                (cookie), \
                                (flgs))
 
+
+/* 
+ * Query counter(s):  
+ * Provide IA, EP, or EVD and call will return appropriate counters
+ *     DAT_HANDLE dat_handle, enum cntr, *DAT_UINT64 p_cntrs_out, int reset
+ *
+ * use _ALL_COUNTERS to query all
+ */
+#define dat_query_counters(dat_handle, cntr, p_cntrs_out, reset) \
+            dat_extension_op(  dat_handle, \
+                               DAT_QUERY_COUNTERS_OP, \
+                               (cntr), \
+                               (p_cntrs_out), \
+                               (reset))
+/* 
+ * Print counter(s):  
+ * Provide IA, EP, or EVD and call will print appropriate counters
+ *     DAT_HANDLE dat_handle, int cntr, int reset
+ * 
+ * use _ALL_COUNTERS to print all
+ */
+#define dat_print_counters(dat_handle, cntr, reset) \
+            dat_extension_op(  dat_handle, \
+                               DAT_PRINT_COUNTERS_OP, \
+                               (cntr), \
+                               (reset))
+
 #endif /* _DAT_IB_EXTENSIONS_H_ */
 
index 032cadd95d7f4ef96909e918d4f7a2072d363624..eafc1c9e976c09aef0924433d7340373a8c96342 100755 (executable)
@@ -60,6 +60,7 @@
 
 #define DAPL_PROVIDER "ofa-v2-ib0"
 #define F64x "%"PRIx64""
+#define F64u "%"PRIu64""
 
 #endif
 
@@ -74,6 +75,7 @@ int disconnect_ep(void);
        if (status != DAT_SUCCESS) {\
                dat_strerror(status, &maj_msg, &min_msg);\
                fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\
+               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\
                exit(1);\
        } else if (verbose) {\
                printf("dtestx: %s success\n",str);\
@@ -86,6 +88,7 @@ int disconnect_ep(void);
        if (status != DAT_SUCCESS) {\
                dat_strerror(status, &maj_msg, &min_msg);\
                fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\
+               dat_ia_close(ia, DAT_CLOSE_DEFAULT);\
                exit(1);\
        } else if (verbose) {\
                printf("dtestx: %s\n",str);\
@@ -162,6 +165,7 @@ DAT_EVD_HANDLE              con_evd = DAT_HANDLE_NULL;
 DAT_EVD_HANDLE         dto_evd = DAT_HANDLE_NULL;
 DAT_PSP_HANDLE         psp = DAT_HANDLE_NULL;
 int                    server = 1;
+int                    remote_host = 0;
 int                    ud_test = 0;
 int                    multi_eps = 0;
 int                    buf_size = BUF_SIZE;
@@ -171,6 +175,8 @@ char                        hostname[256] = { 0 };
 DAT_IB_ADDR_HANDLE     remote_ah[MAX_EP_COUNT];
 int                    eps = 1;
 int                    verbose = 0;
+int                    counters = 0;
+int                    counters_ok = 0;
 
 #define LOGPRINTF if (verbose) printf
 
@@ -178,11 +184,12 @@ void print_usage(void)
 {
     printf("\n dtestx usage \n\n");
     printf("v: verbose\n");
+    printf("p: print counters\n");
     printf("u  unreliable datagram test\n");
     printf("U: unreliable datagram test, UD endpoint count\n");
     printf("m  unreliable datagram test, multiple Server endpoints\n");
     printf("b: buf length to allocate\n");
-    printf("h: hostname/address of Server, specified on Client\n");
+    printf("h: hostname/address of Server, client and UDP server\n");
     printf("c: Client\n");
     printf("s: Server, default\n");
     printf("P: provider name (default = ofa-v2-ib0)\n");
@@ -400,6 +407,7 @@ connect_ep(char *hostname)
        DAT_RMR_TRIPLET         *r_iov;
        DAT_DTO_COOKIE          cookie;
        DAT_CONN_QUAL           conn_qual;
+       DAT_BOOLEAN             in,out;
        int                     i,ii,pdata,ctx;
        DAT_PROVIDER_ATTR       prov_attrs;
         DAT_DTO_COMPLETION_EVENT_DATA *dto_event = 
@@ -418,6 +426,19 @@ connect_ep(char *hostname)
                LOGPRINTF(" Provider Specific Attribute[%d] %s=%s\n",
                          i, prov_attrs.provider_specific_attr[i].name,
                          prov_attrs.provider_specific_attr[i].value);
+               
+               /* check for counter support */
+               status = strcmp(prov_attrs.provider_specific_attr[i].name,
+                               "DAT_COUNTERS");
+               if (!status) 
+                       counters_ok = 1;
+       }
+
+       /* make sure provider supports counters */
+       if ((counters) && (!counters_ok)) { 
+               printf("Disable dat_query_counters:"
+                      " Provider not built with counters\n");
+               counters = 0;
        }
        
        status = dat_pz_create(ia, &pz);
@@ -632,6 +653,9 @@ connect_ep(char *hostname)
                 cookie,
                 DAT_COMPLETION_SUPPRESS_FLAG);
 
+       dat_ep_get_status(ep[0],NULL,&in,&out);
+       printf("EP[0] status: posted buffers: Req=%d, Rcv=%d\n",in,out);
+
        /*
         *  Wait for their RMR
         */
@@ -730,9 +754,49 @@ disconnect_ep(void)
                _OK2(status, "dat_lmr_free_atomic");
        }
        for (i=0;i<eps;i++) {
+               if (counters) { /* examples of query and print */
+                       int ii;
+                       DAT_UINT64 ep_cntrs[DCNT_EP_ALL_COUNTERS];
+
+                       dat_query_counters(ep[i], DCNT_EP_ALL_COUNTERS, 
+                                          ep_cntrs, 0);
+                       printf(" EP[%d] Cntrs:",i);
+                       for (ii=0;ii<DCNT_EP_ALL_COUNTERS;ii++)
+                               printf(" "F64u"", ep_cntrs[ii]);
+                       printf("\n");
+                       dat_print_counters(ep[i],DCNT_EP_ALL_COUNTERS,0);
+               }
                status = dat_ep_free(ep[i]);
                _OK2(status, "dat_ep_free");
        }
+       if (counters) { /* examples of query and print */
+               int ii;
+               DAT_UINT64 evd_cntrs[DCNT_EVD_ALL_COUNTERS];
+
+               dat_query_counters(dto_evd, DCNT_EVD_ALL_COUNTERS, 
+                                  evd_cntrs, 0);
+               printf(" DTO_EVD Cntrs:");
+                       for (ii=0;ii<DCNT_EVD_ALL_COUNTERS;ii++)
+                               printf(" "F64u"", evd_cntrs[ii]);
+               printf("\n");
+               dat_print_counters(dto_evd,DCNT_EVD_ALL_COUNTERS,0);
+               
+               dat_query_counters(con_evd, DCNT_EVD_ALL_COUNTERS, 
+                                  evd_cntrs, 0);
+               printf(" CONN_EVD Cntrs:");
+                       for (ii=0;ii<DCNT_EVD_ALL_COUNTERS;ii++)
+                               printf(" "F64u"", evd_cntrs[ii]);
+               printf("\n");
+               dat_print_counters(con_evd,DCNT_EVD_ALL_COUNTERS,0);
+               
+               dat_query_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, 
+                                  evd_cntrs, 0);
+               printf(" CR_EVD Cntrs:");
+                       for (ii=0;ii<DCNT_EVD_ALL_COUNTERS;ii++)
+                               printf(" "F64u"", evd_cntrs[ii]);
+               printf("\n");
+               dat_print_counters(cr_evd,DCNT_EVD_ALL_COUNTERS,0);
+       }
        status = dat_evd_free(dto_evd);
        _OK2(status, "dat_evd_free DTO");
        
@@ -745,6 +809,17 @@ disconnect_ep(void)
        status = dat_pz_free(pz);
        _OK2(status, "dat_pz_free");
 
+       if (counters) { /* examples of query and print */
+               int ii;
+               DAT_UINT64 ia_cntrs[DCNT_IA_ALL_COUNTERS];
+
+               dat_query_counters(ia, DCNT_IA_ALL_COUNTERS, ia_cntrs, 0);
+               printf(" IA Cntrs:");
+                       for (ii=0;ii<DCNT_IA_ALL_COUNTERS;ii++)
+                               printf(" "F64u"", ia_cntrs[ii]);
+               printf("\n");
+               dat_print_counters(ia, DCNT_IA_ALL_COUNTERS, 0);
+}
        status = dat_ia_close(ia, DAT_CLOSE_DEFAULT);
        _OK2(status, "dat_ia_close");
 
@@ -1168,7 +1243,7 @@ main(int argc, char **argv)
        int rc;
        
        /* parse arguments */
-       while ((rc = getopt(argc, argv, "csvumU:h:b:P:")) != -1)
+       while ((rc = getopt(argc, argv, "csvumpU:h:b:P:")) != -1)
        {
                switch(rc)
                {
@@ -1185,8 +1260,11 @@ main(int argc, char **argv)
                        case 's':
                                server = 1;
                                break;
+                       case 'p':
+                               counters = 1;
+                               break;
                        case 'h':
-                               server = 0;
+                               remote_host = 1;
                                strcpy (hostname, optarg);
                                break;
                        case 'b':
@@ -1222,6 +1300,9 @@ main(int argc, char **argv)
                }
        }
 #endif
+       /* for non UD tests, -h is always client */
+       if (remote_host && !ud_test)
+               server = 0;
 
        if (!server) {
                printf("\nRunning as Client - %s %s %d endpoint(s)\n",
@@ -1230,6 +1311,7 @@ main(int argc, char **argv)
                printf("\nRunning as Server - %s %s %d endpoint(s)\n",
                        provider, ud_test?"UD test":"", eps);
        }
+
        /*
         * connect
         */