diff mbox series

[v4,2/2] migration: Make dirty_bytes_last_sync atomic

Message ID 20230424135509.71605-3-quintela@redhat.com
State New
Headers show
Series [v4,1/2] migration: Make dirty_pages_rate atomic | expand

Commit Message

Juan Quintela April 24, 2023, 1:55 p.m. UTC
As we set its value, it needs to be operated with atomics.
We rename it from remaining to better reflect its meaning.

Statistics always return the real reamaining bytes.  This was used to
store how much pages where dirty on the previous generation, so we can
calculate the expected downtime as: dirty_bytes_last_sync /
current_bandwith.

If we use the actual remaining bytes, we would see a very small value
at the end of the iteration.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>

---

I am open to use ram_bytes_remaining() in its only use and be more
"optimistic" about the downtime.

Change aligned_uint64_t to size_t to make (some) 32bit hosts happy.
---
 migration/migration.c | 4 +++-
 migration/ram.c       | 3 ++-
 migration/ram.h       | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/migration/migration.c b/migration/migration.c
index 4cded4e0ae..1dd848015d 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -3183,7 +3183,9 @@  static void migration_update_counters(MigrationState *s,
      */
     if (qatomic_read__nocheck(&ram_counters.dirty_pages_rate) &&
         transferred > 10000) {
-        s->expected_downtime = ram_counters.remaining / bandwidth;
+        s->expected_downtime =
+            qatomic_read__nocheck(&ram_counters.dirty_bytes_last_sync) /
+                                  bandwidth;
     }
 
     qemu_file_reset_rate_limit(s->to_dst_file);
diff --git a/migration/ram.c b/migration/ram.c
index e6f14023e4..3862ec0853 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1223,7 +1223,8 @@  static void migration_bitmap_sync(RAMState *rs)
         RAMBLOCK_FOREACH_NOT_IGNORED(block) {
             ramblock_sync_dirty_bitmap(rs, block);
         }
-        ram_counters.remaining = ram_bytes_remaining();
+        qatomic_set__nocheck(&ram_counters.dirty_bytes_last_sync,
+                             ram_bytes_remaining());
     }
     qemu_mutex_unlock(&rs->bitmap_mutex);
 
diff --git a/migration/ram.h b/migration/ram.h
index d7f534162d..801732ff13 100644
--- a/migration/ram.h
+++ b/migration/ram.h
@@ -41,6 +41,7 @@ 
  * one thread).
  */
 typedef struct {
+    size_t dirty_bytes_last_sync;
     size_t dirty_pages_rate;
     Stat64 dirty_sync_count;
     Stat64 dirty_sync_missed_zero_copy;
@@ -51,7 +52,6 @@  typedef struct {
     Stat64 postcopy_bytes;
     Stat64 postcopy_requests;
     Stat64 precopy_bytes;
-    int64_t remaining;
     Stat64 transferred;
 } RAMStats;