conversion function is provided in ibdiag_common

Signed-off-by: Ira Weiny <wei...@llnl.gov>
---
 include/ibdiag_common.h |    7 +++++
 src/ibdiag_common.c     |   66 +++++++++++++++++++++++++++++++++++++++++++++++
 src/ibqueryerrors.c     |   30 ++++++++++++++++++---
 3 files changed, 99 insertions(+), 4 deletions(-)

diff --git a/include/ibdiag_common.h b/include/ibdiag_common.h
index 2425c94..6586cc6 100644
--- a/include/ibdiag_common.h
+++ b/include/ibdiag_common.h
@@ -86,6 +86,13 @@ extern int ibdiag_process_opts(int argc, char *const argv[], 
void *context,
 extern void ibdiag_show_usage();
 extern void iberror(const char *fn, char *msg, ...);
 
+/* convert counter values to a float with a unit specifier returned (using
+ * binary prefix)
+ * "data" is a flag indicating this counter is a byte counter multiplied by 4
+ * as per PortCounters[Extended]
+ */
+extern char *conv_cnt_human_readable(uint64_t val64, float *val, int data);
+
 /* define an SA query structure to be common
  * This is by no means optimal but it moves the saquery functionality out of
  * the saquery tool and provides it to other utilities.
diff --git a/src/ibdiag_common.c b/src/ibdiag_common.c
index e231af2..74960e1 100644
--- a/src/ibdiag_common.c
+++ b/src/ibdiag_common.c
@@ -342,6 +342,72 @@ void iberror(const char *fn, char *msg, ...)
        exit(-1);
 }
 
+char *
+conv_cnt_human_readable(uint64_t val64, float *val, int data)
+{
+       uint64_t tmp = val64;
+       int ui = 0;
+       int div = 1;
+
+       tmp /= 1024;
+       while (tmp) {
+               ui++;
+               tmp /= 1024;
+               div *= 1024;
+       }
+
+       *val = (float)(val64);
+       if (data) {
+               *val *= 4;
+               if (*val/div > 1024) {
+                       ui++;
+                       div *= 1024;
+               }
+       }
+       *val /= div;
+
+       if (data) {
+               switch (ui) {
+                       case 0:
+                               return ("B");
+                       case 1:
+                               return ("KB");
+                       case 2:
+                               return ("MB");
+                       case 3:
+                               return ("GB");
+                       case 4:
+                               return ("TB");
+                       case 5:
+                               return ("PB");
+                       case 6:
+                               return ("EB");
+                       default:
+                               return ("");
+               }
+       } else {
+               switch (ui) {
+                       case 0:
+                               return ("");
+                       case 1:
+                               return ("K");
+                       case 2:
+                               return ("M");
+                       case 3:
+                               return ("G");
+                       case 4:
+                               return ("T");
+                       case 5:
+                               return ("P");
+                       case 6:
+                               return ("E");
+                       default:
+                               return ("");
+               }
+       }
+       return ("");
+}
+
 /* define a common SA query structure
  * This is by no means optimal but it moves the saquery functionality out of
  * the saquery tool and provides it to other utilities.
diff --git a/src/ibqueryerrors.c b/src/ibqueryerrors.c
index 6de3d6f..83e3eb8 100644
--- a/src/ibqueryerrors.c
+++ b/src/ibqueryerrors.c
@@ -311,6 +311,7 @@ static int query_and_dump(char *buf, size_t size, 
ib_portid_t * portid,
        return n;
 }
 
+
 static int print_results(ib_portid_t * portid, char *node_name,
                         ibnd_node_t * node, uint8_t * pc, int portnum,
                         int *header_printed, uint8_t *pce, uint16_t cap_mask)
@@ -378,11 +379,24 @@ static int print_results(ib_portid_t * portid, char 
*node_name,
 
                        for (i = start_field; i <= end_field; i++) {
                                uint64_t val64 = 0;
+                               float val = 0;
+                               char *unit = "";
                                mad_decode_field(pkt, i, (void *)&val64);
-                               if (val64)
+                               if (val64) {
+                                       int data = 0;
+                                       if (i == IB_PC_EXT_XMT_BYTES_F ||
+                                           i == IB_PC_EXT_RCV_BYTES_F ||
+                                           i == IB_PC_XMT_BYTES_F ||
+                                           i == IB_PC_RCV_BYTES_F)
+                                               data = 1;
+                                       unit = conv_cnt_human_readable(val64,
+                                                               &val, data);
                                        n += snprintf(str + n, 1024 - n,
-                                               " [%s == %" PRIu64 "]",
-                                               mad_field_name(i), val64);
+                                               " [%s == %" PRIu64
+                                               " (%5.3f%s)]",
+                                               mad_field_name(i), val64, val,
+                                               unit);
+                               }
                        }
                }
 
@@ -479,8 +493,16 @@ static int print_data_cnts(ib_portid_t * portid, uint16_t 
cap_mask,
 
        for (i = start_field; i <= end_field; i++) {
                uint64_t val64 = 0;
+               float val = 0;
+               char *unit = "";
+               int data = 0;
                mad_decode_field(pc, i, (void *)&val64);
-               printf(" [%s == %" PRIu64 "]", mad_field_name(i), val64);
+               if (i == IB_PC_EXT_XMT_BYTES_F || i == IB_PC_EXT_RCV_BYTES_F ||
+                   i == IB_PC_XMT_BYTES_F || i == IB_PC_RCV_BYTES_F)
+                       data = 1;
+               unit = conv_cnt_human_readable(val64, &val, data);
+               printf(" [%s == %" PRIu64 " (%5.3f%s)]", mad_field_name(i),
+                       val64, val, unit);
        }
        printf("\n");
 
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to