>From 5b22095ed47d62355c14441c3aaf7e9db7829f95 Mon Sep 17 00:00:00 2001
From: Ira K. Weiny <[EMAIL PROTECTED]>
Date: Fri, 17 Aug 2007 14:47:58 -0700
Subject: [PATCH] opensm configure: add perf-mgr-profile option and clean up 
"#if 0" debug code

   This option does some time stamping on the perfmgr data colection and
   reports it under OSM_LOG_INFO level.

Signed-off-by: Ira K. Weiny <[EMAIL PROTECTED]>
---
 opensm/config/osmvsel.m4         |   16 ++++++-
 opensm/include/opensm/osm_madw.h |    2 +-
 opensm/opensm/osm_perfmgr.c      |   97 ++++++++++++++++++++++++++++++--------
 3 files changed, 92 insertions(+), 23 deletions(-)

diff --git a/opensm/config/osmvsel.m4 b/opensm/config/osmvsel.m4
index 3cdccc6..47ad36f 100644
--- a/opensm/config/osmvsel.m4
+++ b/opensm/config/osmvsel.m4
@@ -215,10 +215,22 @@ AC_ARG_ENABLE(perf-mgr,
      no)  perf_mgr=no ;;
    esac],
    perf_mgr=no)
+AC_ARG_ENABLE(perf-mgr-profile,
+[  --enable-perf-mgr-profile Enable the performance manager profiling (default 
no)],
+       [case $enableval in
+       yes) perf_mgr_profile=yes ;;
+       no)  perf_mgr_profile=no ;;
+       esac],
+       perf_mgr_profile=no)
 if test $perf_mgr = yes; then
   AC_DEFINE(ENABLE_OSM_PERF_MGR,
-           1,
-           [Define as 1 if you want to enable the performance manager])
+       1,
+       [Define as 1 if you want to enable the performance manager])
+  if test $perf_mgr_profile = yes; then
+       AC_DEFINE(ENABLE_OSM_PERF_MGR_PROFILE,
+               1,
+               [Define as 1 if you want to enable the performance manager 
profiling code])
+  fi
 fi
 # --- END OPENIB_OSM_PERF_MGR_SEL ---
 ]) dnl OPENIB_OSM_PERF_MGR_SEL
diff --git a/opensm/include/opensm/osm_madw.h b/opensm/include/opensm/osm_madw.h
index b996037..bdaa7bc 100644
--- a/opensm/include/opensm/osm_madw.h
+++ b/opensm/include/opensm/osm_madw.h
@@ -314,7 +314,7 @@ typedef struct _osm_perfmgr_context {
        uint64_t node_guid;
        uint16_t port;
        uint8_t mad_method;     /* was this a get or a set */
-#if 0
+#if ENABLE_OSM_PERF_MGR_PROFILE
        struct timeval query_start;
 #endif
 } osm_perfmgr_context_t;
diff --git a/opensm/opensm/osm_perfmgr.c b/opensm/opensm/osm_perfmgr.c
index f1c6ca0..37baf7c 100644
--- a/opensm/opensm/osm_perfmgr.c
+++ b/opensm/opensm/osm_perfmgr.c
@@ -61,9 +61,62 @@
 #include <opensm/osm_node.h>
 #include <complib/cl_thread.h>
 #include <vendor/osm_vendor_api.h>
+#include <float.h>
 
 #define OSM_PERFMGR_INITIAL_TID_VALUE 0xcafe
 
+#if ENABLE_OSM_PERF_MGR_PROFILE
+struct {
+       double   fastest_us;
+       double   slowest_us;
+       double   avg_us;
+       uint64_t num;
+} perfmgr_mad_stats =
+{
+       fastest_us: DBL_MAX,
+       slowest_us: DBL_MIN,
+       avg_us: 0,
+       num: 0
+};
+
+/* diff must be something which can fit in a susecond_t */
+static inline void update_mad_stats(struct timeval *diff)
+{
+       double new = (diff->tv_sec * 1000000) + diff->tv_usec;
+       if (new < perfmgr_mad_stats.fastest_us)
+               perfmgr_mad_stats.fastest_us = new;
+       if (new > perfmgr_mad_stats.slowest_us)
+               perfmgr_mad_stats.slowest_us = new;
+
+       perfmgr_mad_stats.avg_us = ((perfmgr_mad_stats.avg_us * 
perfmgr_mad_stats.num) + new)
+                                       /(perfmgr_mad_stats.num+1);
+       perfmgr_mad_stats.num++;
+}
+
+static inline void perfmgr_clear_mad_stats(void)
+{
+       perfmgr_mad_stats.fastest_us = DBL_MAX;
+       perfmgr_mad_stats.slowest_us = DBL_MIN;
+       perfmgr_mad_stats.avg_us = 0;
+       perfmgr_mad_stats.num = 0;
+}
+
+/* after and diff can be the same struct */
+static inline void diff_time(struct timeval *before,
+                       struct timeval *after,
+                       struct timeval *diff)
+{
+       struct timeval tmp = *after;
+       if (tmp.tv_usec < before->tv_usec) {
+               tmp.tv_sec--;
+               tmp.tv_usec += 1000000;
+       }
+       diff->tv_sec = tmp.tv_sec - before->tv_sec;
+       diff->tv_usec = tmp.tv_usec - before->tv_usec;
+}
+
+#endif
+
 /**********************************************************************
  * Internal helper functions.
  **********************************************************************/
@@ -130,16 +183,6 @@ osm_perfmgr_mad_recv_callback(osm_madw_t * p_madw, void 
*bind_context,
                        "PerfMgr Dispatcher post failed\n");
                osm_mad_pool_put(pm->mad_pool, p_madw);
        }
-#if 0
-       do {
-               struct timeval rcv_time;
-               gettimeofday(&rcv_time, NULL);
-               osm_log(pm->log, OSM_LOG_INFO,
-                       "perfmgr rcv time %ld\n",
-                       rcv_time.tv_usec -
-                       p_madw->context.perfmgr_context.query_start.tv_usec);
-       } while (0);
-#endif
        OSM_LOG_EXIT(pm->log);
 }
 
@@ -506,7 +549,7 @@ __osm_perfmgr_query_counters(cl_map_item_t * const 
p_map_item, void *context)
                mad_context.perfmgr_context.node_guid = node_guid;
                mad_context.perfmgr_context.port = port;
                mad_context.perfmgr_context.mad_method = IB_MAD_METHOD_GET;
-#if 0
+#if ENABLE_OSM_PERF_MGR_PROFILE
                gettimeofday(&(mad_context.perfmgr_context.query_start), NULL);
 #endif
                osm_log(pm->log, OSM_LOG_VERBOSE,
@@ -554,7 +597,7 @@ void __osm_perfmgr_sweeper(void *p_ptr)
                 */
                if (pm->subn->sm_state == IB_SMINFO_STATE_MASTER &&
                    pm->state == PERFMGR_STATE_ENABLED) {
-#if 0
+#if ENABLE_OSM_PERF_MGR_PROFILE
                        struct timeval before, after;
                        gettimeofday(&before, NULL);
 #endif
@@ -579,11 +622,25 @@ void __osm_perfmgr_sweeper(void *p_ptr)
                         * sweep
                         */
                        __remove_marked_nodes(pm);
-#if 0
+
+#if ENABLE_OSM_PERF_MGR_PROFILE
+                       /* spin on outstanding queries */
+                       while (pm->outstanding_queries > 0)
+                               cl_event_wait_on(&pm->sig_sweep, 1000, TRUE);
+
                        gettimeofday(&after, NULL);
+                       diff_time(&before, &after, &after);
                        osm_log(pm->log, OSM_LOG_INFO,
-                               "PerfMgr total sweep time : %ld us\n",
-                               after.tv_usec - before.tv_usec);
+                               "PerfMgr total sweep time : %ld.%06ld s\n"
+                               "        fastest mad      : %g us\n"
+                               "        slowest mad      : %g us\n"
+                               "        average mad      : %g us\n"
+                               ,
+                               after.tv_sec, after.tv_usec,
+                               perfmgr_mad_stats.fastest_us,
+                               perfmgr_mad_stats.slowest_us,
+                               perfmgr_mad_stats.avg_us);
+                       perfmgr_clear_mad_stats();
 #endif
                }
 
@@ -950,14 +1007,14 @@ static void osm_pc_rcv_process(void *context, void *data)
 
        osm_perfmgr_check_overflow(pm, node_guid, port, wire_read);
 
-#if 0
+#if ENABLE_OSM_PERF_MGR_PROFILE
        do {
                struct timeval proc_time;
                gettimeofday(&proc_time, NULL);
-               osm_log(pm->log, OSM_LOG_INFO,
-                       "PerfMgr done: processing time %ld\n",
-                       proc_time.tv_usec -
-                       p_madw->context.perfmgr_context.query_start.tv_usec);
+               diff_time(&(p_madw->context.perfmgr_context.query_start),
+                               &proc_time,
+                               &proc_time);
+               update_mad_stats(&proc_time);
        } while (0);
 #endif
 
-- 
1.5.2

Attachment: 0001-opensm-configure-add-perf-mgr-profile-option-and-cl.patch
Description: Binary data

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to