[Qemu-devel] [PULL 27/57] Modify save_live_pending for postcopy

2015-11-10 Thread Juan Quintela
From: "Dr. David Alan Gilbert" 

Modify save_live_pending to return separate postcopiable and
non-postcopiable counts.

Signed-off-by: Dr. David Alan Gilbert 
Reviewed-by: Juan Quintela 
Reviewed-by: Amit Shah 
Signed-off-by: Juan Quintela 
---
 include/migration/vmstate.h |  5 +++--
 include/sysemu/sysemu.h |  4 +++-
 migration/block.c   |  7 +--
 migration/migration.c   |  9 +++--
 migration/ram.c |  8 ++--
 migration/savevm.c  | 17 +
 trace-events|  2 +-
 7 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 9986ccc..7f16a38 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -54,8 +54,9 @@ typedef struct SaveVMHandlers {

 /* This runs outside the iothread lock!  */
 int (*save_live_setup)(QEMUFile *f, void *opaque);
-uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t 
max_size);
-
+void (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size,
+  uint64_t *non_postcopiable_pending,
+  uint64_t *postcopiable_pending);
 LoadStateHandler *load_state;
 } SaveVMHandlers;

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index c27b926..70835d0 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -112,7 +112,9 @@ void qemu_savevm_state_header(QEMUFile *f);
 int qemu_savevm_state_iterate(QEMUFile *f);
 void qemu_savevm_state_cleanup(void);
 void qemu_savevm_state_complete_precopy(QEMUFile *f);
-uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
+void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
+   uint64_t *res_non_postcopiable,
+   uint64_t *res_postcopiable);
 void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command,
   uint16_t len, uint8_t *data);
 void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
diff --git a/migration/block.c b/migration/block.c
index 4fb9b7c..310e2b3 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -748,7 +748,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
 return 0;
 }

-static uint64_t block_save_pending(QEMUFile *f, void *opaque, uint64_t 
max_size)
+static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
+   uint64_t *non_postcopiable_pending,
+   uint64_t *postcopiable_pending)
 {
 /* Estimate pending number of bytes to send */
 uint64_t pending;
@@ -767,7 +769,8 @@ static uint64_t block_save_pending(QEMUFile *f, void 
*opaque, uint64_t max_size)
 qemu_mutex_unlock_iothread();

 DPRINTF("Enter save live pending  %" PRIu64 "\n", pending);
-return pending;
+/* We don't do postcopy */
+*non_postcopiable_pending += pending;
 }

 static int block_load(QEMUFile *f, void *opaque, int version_id)
diff --git a/migration/migration.c b/migration/migration.c
index 7097e5b..bb4c92e 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1288,8 +1288,13 @@ static void *migration_thread(void *opaque)
 uint64_t pending_size;

 if (!qemu_file_rate_limit(s->file)) {
-pending_size = qemu_savevm_state_pending(s->file, max_size);
-trace_migrate_pending(pending_size, max_size);
+uint64_t pend_post, pend_nonpost;
+
+qemu_savevm_state_pending(s->file, max_size, _nonpost,
+  _post);
+pending_size = pend_nonpost + pend_post;
+trace_migrate_pending(pending_size, max_size,
+  pend_post, pend_nonpost);
 if (pending_size && pending_size >= max_size) {
 qemu_savevm_state_iterate(s->file);
 } else {
diff --git a/migration/ram.c b/migration/ram.c
index 4fa44a7..0e53325 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1383,7 +1383,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
 return 0;
 }

-static uint64_t ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size)
+static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
+ uint64_t *non_postcopiable_pending,
+ uint64_t *postcopiable_pending)
 {
 uint64_t remaining_size;

@@ -1397,7 +1399,9 @@ static uint64_t ram_save_pending(QEMUFile *f, void 
*opaque, uint64_t max_size)
 qemu_mutex_unlock_iothread();
 remaining_size = ram_save_remaining() * TARGET_PAGE_SIZE;
 }
-return remaining_size;
+
+/* We can do postcopy, and all the data is postcopiable */
+*postcopiable_pending += remaining_size;
 }

 static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void 

[Qemu-devel] [PULL 27/57] Modify save_live_pending for postcopy

2015-11-09 Thread Juan Quintela
From: "Dr. David Alan Gilbert" 

Modify save_live_pending to return separate postcopiable and
non-postcopiable counts.

Signed-off-by: Dr. David Alan Gilbert 
Reviewed-by: Juan Quintela 
Reviewed-by: Amit Shah 
Signed-off-by: Juan Quintela 
---
 include/migration/vmstate.h |  5 +++--
 include/sysemu/sysemu.h |  4 +++-
 migration/block.c   |  7 +--
 migration/migration.c   |  9 +++--
 migration/ram.c |  8 ++--
 migration/savevm.c  | 17 +
 trace-events|  2 +-
 7 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 9986ccc..7f16a38 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -54,8 +54,9 @@ typedef struct SaveVMHandlers {

 /* This runs outside the iothread lock!  */
 int (*save_live_setup)(QEMUFile *f, void *opaque);
-uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t 
max_size);
-
+void (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size,
+  uint64_t *non_postcopiable_pending,
+  uint64_t *postcopiable_pending);
 LoadStateHandler *load_state;
 } SaveVMHandlers;

diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index c27b926..70835d0 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -112,7 +112,9 @@ void qemu_savevm_state_header(QEMUFile *f);
 int qemu_savevm_state_iterate(QEMUFile *f);
 void qemu_savevm_state_cleanup(void);
 void qemu_savevm_state_complete_precopy(QEMUFile *f);
-uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
+void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
+   uint64_t *res_non_postcopiable,
+   uint64_t *res_postcopiable);
 void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command,
   uint16_t len, uint8_t *data);
 void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
diff --git a/migration/block.c b/migration/block.c
index 4fb9b7c..310e2b3 100644
--- a/migration/block.c
+++ b/migration/block.c
@@ -748,7 +748,9 @@ static int block_save_complete(QEMUFile *f, void *opaque)
 return 0;
 }

-static uint64_t block_save_pending(QEMUFile *f, void *opaque, uint64_t 
max_size)
+static void block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
+   uint64_t *non_postcopiable_pending,
+   uint64_t *postcopiable_pending)
 {
 /* Estimate pending number of bytes to send */
 uint64_t pending;
@@ -767,7 +769,8 @@ static uint64_t block_save_pending(QEMUFile *f, void 
*opaque, uint64_t max_size)
 qemu_mutex_unlock_iothread();

 DPRINTF("Enter save live pending  %" PRIu64 "\n", pending);
-return pending;
+/* We don't do postcopy */
+*non_postcopiable_pending += pending;
 }

 static int block_load(QEMUFile *f, void *opaque, int version_id)
diff --git a/migration/migration.c b/migration/migration.c
index 74477a0..28eaf4b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1288,8 +1288,13 @@ static void *migration_thread(void *opaque)
 uint64_t pending_size;

 if (!qemu_file_rate_limit(s->file)) {
-pending_size = qemu_savevm_state_pending(s->file, max_size);
-trace_migrate_pending(pending_size, max_size);
+uint64_t pend_post, pend_nonpost;
+
+qemu_savevm_state_pending(s->file, max_size, _nonpost,
+  _post);
+pending_size = pend_nonpost + pend_post;
+trace_migrate_pending(pending_size, max_size,
+  pend_post, pend_nonpost);
 if (pending_size && pending_size >= max_size) {
 qemu_savevm_state_iterate(s->file);
 } else {
diff --git a/migration/ram.c b/migration/ram.c
index 4fa44a7..0e53325 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1383,7 +1383,9 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
 return 0;
 }

-static uint64_t ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size)
+static void ram_save_pending(QEMUFile *f, void *opaque, uint64_t max_size,
+ uint64_t *non_postcopiable_pending,
+ uint64_t *postcopiable_pending)
 {
 uint64_t remaining_size;

@@ -1397,7 +1399,9 @@ static uint64_t ram_save_pending(QEMUFile *f, void 
*opaque, uint64_t max_size)
 qemu_mutex_unlock_iothread();
 remaining_size = ram_save_remaining() * TARGET_PAGE_SIZE;
 }
-return remaining_size;
+
+/* We can do postcopy, and all the data is postcopiable */
+*postcopiable_pending += remaining_size;
 }

 static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void