Blame SOURCES/0002-vddk-Extend-D-vddk.stats-1-to-show-number-of-calls-a.patch

3beab2
From edfdfff0dae54a41bbfca30fa60f4fa6438d45b9 Mon Sep 17 00:00:00 2001
7084e2
From: "Richard W.M. Jones" <rjones@redhat.com>
7084e2
Date: Thu, 21 Oct 2021 15:10:00 +0100
7084e2
Subject: [PATCH] vddk: Extend -D vddk.stats=1 to show number of calls and
7084e2
 bytes transferred
7084e2
MIME-Version: 1.0
7084e2
Content-Type: text/plain; charset=UTF-8
7084e2
Content-Transfer-Encoding: 8bit
7084e2
7084e2
The new output looks like this:
7084e2
7084e2
nbdkit: debug: VDDK function stats (-D vddk.stats=1):
7084e2
nbdkit: debug: VixDiskLib_...                        µs calls           bytes
7084e2
nbdkit: debug:   Exit                           1000854     1
7084e2
nbdkit: debug:   InitEx                           79304     1
7084e2
nbdkit: debug:   Flush                            13577     1
7084e2
nbdkit: debug:   Write                            12534    21        10485760
7084e2
nbdkit: debug:   Open                              4753     3
7084e2
nbdkit: debug:   Read                               966    20         5242880
7084e2
nbdkit: debug:   Close                              574     3
7084e2
nbdkit: debug:   QueryAllocatedBlocks               116     4
7084e2
nbdkit: debug:   ConnectEx                          103     3
7084e2
nbdkit: debug:   Disconnect                          88     3
7084e2
nbdkit: debug:   GetTransportMode                    68     3
7084e2
nbdkit: debug:   GetInfo                             46     3
7084e2
nbdkit: debug:   FreeConnectParams                   36     3
7084e2
nbdkit: debug:   FreeInfo                            36     3
7084e2
nbdkit: debug:   FreeBlockList                       22     4
7084e2
nbdkit: debug:   AllocateConnectParams               22     3
7084e2
(cherry picked from commit 5c80f0d290db45a679d55baf37ff39bacb8ce7ec)
7084e2
---
7084e2
 plugins/vddk/nbdkit-vddk-plugin.pod |  3 +--
7084e2
 plugins/vddk/vddk.c                 | 41 +++++++++++++++++++++++++----
7084e2
 2 files changed, 37 insertions(+), 7 deletions(-)
7084e2
7084e2
diff --git a/plugins/vddk/nbdkit-vddk-plugin.pod b/plugins/vddk/nbdkit-vddk-plugin.pod
7084e2
index 078badcc..e53d3286 100644
7084e2
--- a/plugins/vddk/nbdkit-vddk-plugin.pod
7084e2
+++ b/plugins/vddk/nbdkit-vddk-plugin.pod
7084e2
@@ -517,8 +517,7 @@ Suppress debugging of datapath calls (C<Read> and C<Write>).
7084e2
 
7084e2
 =item B<-D vddk.stats=1>
7084e2
 
7084e2
-When the plugin exits print some statistics about the amount of time
7084e2
-spent waiting on each VDDK call.
7084e2
+When the plugin exits print some statistics about each VDDK call.
7084e2
 
7084e2
 =back
7084e2
 
7084e2
diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
7084e2
index 3d751544..5f1d223b 100644
7084e2
--- a/plugins/vddk/vddk.c
7084e2
+++ b/plugins/vddk/vddk.c
7084e2
@@ -106,6 +106,8 @@ static bool is_remote;
7084e2
 struct vddk_stat {
7084e2
   const char *name;             /* function name */
7084e2
   int64_t usecs;                /* total number of usecs consumed */
7084e2
+  uint64_t calls;               /* number of times called */
7084e2
+  uint64_t bytes;               /* bytes transferred, datapath calls only */
7084e2
 };
7084e2
 static pthread_mutex_t stats_lock = PTHREAD_MUTEX_INITIALIZER;
7084e2
 static void display_stats (void);
7084e2
@@ -141,6 +143,17 @@ static void display_stats (void);
7084e2
     gettimeofday (&end_t, NULL);                        \
7084e2
     ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&stats_lock);       \
7084e2
     stats_##fn.usecs += tvdiff_usec (&start_t, &end_t); \
7084e2
+    stats_##fn.calls++;                                 \
7084e2
+  }                                                     \
7084e2
+  } while (0)
7084e2
+#define VDDK_CALL_END_DATAPATH(fn, bytes_)              \
7084e2
+  while (0);                                            \
7084e2
+  if (vddk_debug_stats) {                               \
7084e2
+    gettimeofday (&end_t, NULL);                        \
7084e2
+    ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&stats_lock);       \
7084e2
+    stats_##fn.usecs += tvdiff_usec (&start_t, &end_t); \
7084e2
+    stats_##fn.calls++;                                 \
7084e2
+    stats_##fn.bytes += bytes_;                         \
7084e2
   }                                                     \
7084e2
   } while (0)
7084e2
 
7084e2
@@ -191,6 +204,12 @@ stat_compare (const void *vp1, const void *vp2)
7084e2
   else return 0;
7084e2
 }
7084e2
 
7084e2
+static const char *
7084e2
+api_name_without_prefix (const char *name)
7084e2
+{
7084e2
+  return strncmp (name, "VixDiskLib_", 11) == 0 ? name + 11 : name;
7084e2
+}
7084e2
+
7084e2
 static void
7084e2
 display_stats (void)
7084e2
 {
7084e2
@@ -206,10 +225,22 @@ display_stats (void)
7084e2
   qsort (stats.ptr, stats.size, sizeof stats.ptr[0], stat_compare);
7084e2
 
7084e2
   nbdkit_debug ("VDDK function stats (-D vddk.stats=1):");
7084e2
-  nbdkit_debug ("%-40s  %9s", "", "µs");
7084e2
+  nbdkit_debug ("%-24s  %15s %5s %15s",
7084e2
+                "VixDiskLib_...", "µs", "calls", "bytes");
7084e2
   for (i = 0; i < stats.size; ++i) {
7084e2
-    if (stats.ptr[i].usecs)
7084e2
-      nbdkit_debug ("%-40s %9" PRIi64, stats.ptr[i].name, stats.ptr[i].usecs);
7084e2
+    if (stats.ptr[i].usecs) {
7084e2
+      if (stats.ptr[i].bytes > 0)
7084e2
+        nbdkit_debug ("  %-22s %15" PRIi64 " %5" PRIu64 " %15" PRIu64,
7084e2
+                      api_name_without_prefix (stats.ptr[i].name),
7084e2
+                      stats.ptr[i].usecs,
7084e2
+                      stats.ptr[i].calls,
7084e2
+                      stats.ptr[i].bytes);
7084e2
+      else
7084e2
+        nbdkit_debug ("  %-22s %15" PRIi64 " %5" PRIu64,
7084e2
+                      api_name_without_prefix (stats.ptr[i].name),
7084e2
+                      stats.ptr[i].usecs,
7084e2
+                      stats.ptr[i].calls);
7084e2
+    }
7084e2
   }
7084e2
   statlist_reset (&stats);
7084e2
 }
7084e2
@@ -831,7 +862,7 @@ vddk_pread (void *handle, void *buf, uint32_t count, uint64_t offset,
7084e2
                             "%" PRIu32 " sectors, buffer",
7084e2
                             offset, count) {
7084e2
     err = VixDiskLib_Read (h->handle, offset, count, buf);
7084e2
-  } VDDK_CALL_END (VixDiskLib_Read);
7084e2
+  } VDDK_CALL_END_DATAPATH (VixDiskLib_Read, count * VIXDISKLIB_SECTOR_SIZE);
7084e2
   if (err != VIX_OK) {
7084e2
     VDDK_ERROR (err, "VixDiskLib_Read");
7084e2
     return -1;
7084e2
@@ -871,7 +902,7 @@ vddk_pwrite (void *handle, const void *buf, uint32_t count, uint64_t offset,
7084e2
                             "%" PRIu32 " sectors, buffer",
7084e2
                             offset, count) {
7084e2
     err = VixDiskLib_Write (h->handle, offset, count, buf);
7084e2
-  } VDDK_CALL_END (VixDiskLib_Write);
7084e2
+  } VDDK_CALL_END_DATAPATH (VixDiskLib_Write, count * VIXDISKLIB_SECTOR_SIZE);
7084e2
   if (err != VIX_OK) {
7084e2
     VDDK_ERROR (err, "VixDiskLib_Write");
7084e2
     return -1;
7084e2
-- 
7084e2
2.31.1
7084e2