On 11/23/2010 05:03 PM, Juan Quintela wrote:
From: Juan Quintela<quint...@trasno.org>

Once there, print all sections that take more than 100ms to migrate.
buffered file runs a timer at that 100ms interval.

Signed-off-by: Juan Quintela<quint...@trasno.org>
Signed-off-by: Juan Quintela<quint...@redhat.com>
---
  savevm.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++--
  1 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/savevm.c b/savevm.c
index 4e49765..ceed6de 100644
--- a/savevm.c
+++ b/savevm.c
@@ -83,6 +83,24 @@
  #include "migration.h"
  #include "qemu_socket.h"
  #include "qemu-queue.h"
+#include "buffered_file.h"
+
+//#define DEBUG_SAVEVM
+
+#ifdef DEBUG_SAVEVM
+#define DPRINTF(fmt, ...) \
+    do { printf("savevm: " fmt, ## __VA_ARGS__); } while (0)
+static int64_t start, stop;
+#define START_SAVEVM_CLOCK()   do { start = qemu_get_clock(rt_clock); } while 
(0)
+#define STOP_SAVEVM_CLOCK() \
+       do { stop = qemu_get_clock(rt_clock) - start; \
+       } while (0)
+#else
+#define DPRINTF(fmt, ...) \
+    do { } while (0)
+#define START_SAVEVM_CLOCK()  do { } while (0)
+#define STOP_SAVEVM_CLOCK()   do { } while (0)
+#endif

  #define SELF_ANNOUNCE_ROUNDS 5

@@ -1480,11 +1498,23 @@ int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f)
          if (se->save_live_state == NULL)
              continue;

+        START_SAVEVM_CLOCK();
+

No magic macros like this please.  Maybe you want to add tracepoints?

          /* Section type */
          qemu_put_byte(f, QEMU_VM_SECTION_PART);
          qemu_put_be32(f, se->section_id);

          ret = se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque);
+        STOP_SAVEVM_CLOCK();
+#ifdef DEBUG_SAVEVM
+       if (stop>  buffered_file_interval) {
+               /* buffered_file run a timer at 100ms */
+               static int times_missing = 1;
+               DPRINTF("save live iterate section id %u name %s took %ld 
milliseconds %u times\n",
+                       se->section_id,      se->idstr, stop, times_missing++);
+       }
+#endif
+
          if (!ret) {
              /* Do not proceed to the next vmstate before this one reported
                 completion of the current stage. This serializes the migration
@@ -1516,13 +1546,18 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile 
*f)
          if (se->save_live_state == NULL)
              continue;

+        START_SAVEVM_CLOCK();
          /* Section type */
          qemu_put_byte(f, QEMU_VM_SECTION_END);
          qemu_put_be32(f, se->section_id);

          se->save_live_state(mon, f, QEMU_VM_SECTION_END, se->opaque);
+        STOP_SAVEVM_CLOCK();
+        DPRINTF("save live end section id %u name %s took %ld milliseconds\n",
+               se->section_id, se->idstr, stop);
      }

+    START_SAVEVM_CLOCK();
      QTAILQ_FOREACH(se,&savevm_handlers, entry) {
          int len;

@@ -1542,12 +1577,14 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile 
*f)
          qemu_put_be32(f, se->version_id);

          r = vmstate_save(f, se);
+        DPRINTF("save section id %u name %s\n", se->section_id, se->idstr);
          if (r<  0) {
              monitor_printf(mon, "cannot migrate with device '%s'\n", 
se->idstr);
              return r;
          }
      }
-
+    STOP_SAVEVM_CLOCK();
+    DPRINTF("save devices took %ld milliseconds\n", stop);
      qemu_put_byte(f, QEMU_VM_EOF);

      if (qemu_file_has_error(f))
@@ -1746,8 +1783,11 @@ int qemu_loadvm_state(QEMUFile *f)
              le->section_id = section_id;
              le->version_id = version_id;
              QLIST_INSERT_HEAD(&loadvm_handlers, le, entry);
-
+            START_SAVEVM_CLOCK();
              ret = vmstate_load(f, le->se, le->version_id);
+            STOP_SAVEVM_CLOCK();
+            DPRINTF("load section id %u name %s took %ld milliseconds\n", 
le->section_id,
+                   le->se->idstr, stop);
              if (ret<  0) {
                  fprintf(stderr, "qemu: warning: error while loading state for 
instance 0x%x of device '%s'\n",
                          instance_id, idstr);
@@ -1769,7 +1809,11 @@ int qemu_loadvm_state(QEMUFile *f)
                  goto out;
              }

+            START_SAVEVM_CLOCK();
              ret = vmstate_load(f, le->se, le->version_id);
+            STOP_SAVEVM_CLOCK();
+            DPRINTF("load section id %u name %s took %ld milliseconds\n", 
le->section_id,
+                   le->se->idstr, stop);
              if (ret<  0) {
                  fprintf(stderr, "qemu: warning: error while loading state section 
id %d\n",
                          section_id);

Yeah, all of this should be done via tracing. Maybe Stefan can make some suggestions.

Regards,

Anthony Liguori

Reply via email to