]> git.proxmox.com Git - qemu.git/commitdiff
rdma: introduce qemu_update_position()
authorMichael R. Hines <mrhines@us.ibm.com>
Wed, 26 Jun 2013 01:35:28 +0000 (21:35 -0400)
committerJuan Quintela <quintela@redhat.com>
Thu, 27 Jun 2013 00:38:35 +0000 (02:38 +0200)
RDMA writes happen asynchronously, and thus the performance accounting
also needs to be able to occur asynchronously. This allows anybody
to call into savevm.c to update both f->pos as well as into arch_init.c
to update the acct_info structure with up-to-date values when
the RDMA transfer actually completes.

Reviewed-by: Juan Quintela <quintela@redhat.com>
Tested-by: Chegu Vinod <chegu_vinod@hp.com>
Tested-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
arch_init.c
include/migration/migration.h
include/migration/qemu-file.h
savevm.c

index 4dd17f4ff316d72b38a24232cd7ed72fd91132d0..ea9ddad697d19facd9e76a676ef994f97d1cdb57 100644 (file)
@@ -493,6 +493,18 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
 
 static uint64_t bytes_transferred;
 
+void acct_update_position(QEMUFile *f, size_t size, bool zero)
+{
+    uint64_t pages = size / TARGET_PAGE_SIZE;
+    if (zero) {
+        acct_info.dup_pages += pages;
+    } else {
+        acct_info.norm_pages += pages;
+        bytes_transferred += size;
+        qemu_update_position(f, size);
+    }
+}
+
 static ram_addr_t ram_save_remaining(void)
 {
     return migration_dirty_pages;
index e2acec64c0b1c95e53fdccaa2a64657509bb9d06..0be28a288a835843a71af7dc6c28f1ff3e39ba7c 100644 (file)
@@ -92,6 +92,8 @@ uint64_t ram_bytes_remaining(void);
 uint64_t ram_bytes_transferred(void);
 uint64_t ram_bytes_total(void);
 
+void acct_update_position(QEMUFile *f, size_t size, bool zero);
+
 extern SaveVMHandlers savevm_ram_handlers;
 
 uint64_t dup_mig_bytes_transferred(void);
index 75194641926e7376bc7d3aa1fd8b339d70e6dbc1..8fab0dd752e63182b887f48790f5e10ab4611adb 100644 (file)
@@ -93,6 +93,7 @@ void qemu_put_be32(QEMUFile *f, unsigned int v);
 void qemu_put_be64(QEMUFile *f, uint64_t v);
 int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
 int qemu_get_byte(QEMUFile *f);
+void qemu_update_position(QEMUFile *f, size_t size);
 
 static inline unsigned int qemu_get_ubyte(QEMUFile *f)
 {
index 48cc2a995f0eed202cc56001f67068180a07d2d2..9b5577ef6c392a5a981e0d84d47b2486910be039 100644 (file)
--- a/savevm.c
+++ b/savevm.c
@@ -671,6 +671,11 @@ int qemu_get_fd(QEMUFile *f)
     return -1;
 }
 
+void qemu_update_position(QEMUFile *f, size_t size)
+{
+    f->pos += size;
+}
+
 /** Closes the file
  *
  * Returns negative error value if any error happened on previous operations or