Blame SOURCES/kvm-migration-Move-bitmap_mutex-out-of-migration_bitmap_.patch

a83cc2
From 7726f6461eebf2c4a4b129f1c98add25c0b1bee2 Mon Sep 17 00:00:00 2001
a83cc2
From: Peter Xu <peterx@redhat.com>
a83cc2
Date: Thu, 29 Jul 2021 07:42:16 -0400
a83cc2
Subject: [PATCH 12/39] migration: Move bitmap_mutex out of
a83cc2
 migration_bitmap_clear_dirty()
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-MergeRequest: 32: Synchronize with RHEL-AV 8.5 release 27 to RHEL 9
a83cc2
RH-Commit: [4/15] cc207372dab253a4db3b6d351fa2fb2f442437ad (mrezanin/centos-src-qemu-kvm)
a83cc2
RH-Bugzilla: 1957194
a83cc2
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
a83cc2
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
a83cc2
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
a83cc2
RH-Acked-by: Andrew Jones <drjones@redhat.com>
a83cc2
a83cc2
Taking the mutex every time for each dirty bit to clear is too slow, especially
a83cc2
we'll take/release even if the dirty bit is cleared.  So far it's only used to
a83cc2
sync with special cases with qemu_guest_free_page_hint() against migration
a83cc2
thread, nothing really that serious yet.  Let's move the lock to be upper.
a83cc2
a83cc2
There're two callers of migration_bitmap_clear_dirty().
a83cc2
a83cc2
For migration, move it into ram_save_iterate().  With the help of MAX_WAIT
a83cc2
logic, we'll only run ram_save_iterate() for no more than 50ms-ish time, so
a83cc2
taking the lock once there at the entry.  It also means any call sites to
a83cc2
qemu_guest_free_page_hint() can be delayed; but it should be very rare, only
a83cc2
during migration, and I don't see a problem with it.
a83cc2
a83cc2
For COLO, move it up to colo_flush_ram_cache().  I think COLO forgot to take
a83cc2
that lock even when calling ramblock_sync_dirty_bitmap(), where another example
a83cc2
is migration_bitmap_sync() who took it right.  So let the mutex cover both the
a83cc2
ramblock_sync_dirty_bitmap() and migration_bitmap_clear_dirty() calls.
a83cc2
a83cc2
It's even possible to drop the lock so we use atomic operations upon rb->bmap
a83cc2
and the variable migration_dirty_pages.  I didn't do it just to still be safe,
a83cc2
also not predictable whether the frequent atomic ops could bring overhead too
a83cc2
e.g. on huge vms when it happens very often.  When that really comes, we can
a83cc2
keep a local counter and periodically call atomic ops.  Keep it simple for now.
a83cc2
a83cc2
Cc: Wei Wang <wei.w.wang@intel.com>
a83cc2
Cc: David Hildenbrand <david@redhat.com>
a83cc2
Cc: Hailiang Zhang <zhang.zhanghailiang@huawei.com>
a83cc2
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
a83cc2
Cc: Juan Quintela <quintela@redhat.com>
a83cc2
Cc: Leonardo Bras Soares Passos <lsoaresp@redhat.com>
a83cc2
Signed-off-by: Peter Xu <peterx@redhat.com>
a83cc2
Message-Id: <20210630200805.280905-1-peterx@redhat.com>
a83cc2
Reviewed-by: Wei Wang <wei.w.wang@intel.com>
a83cc2
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
a83cc2
(cherry picked from commit 63268c4970a5f126cc9af75f3ccb8057abef5ec0)
a83cc2
Signed-off-by: Peter Xu <peterx@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 migration/ram.c | 13 +++++++++++--
a83cc2
 1 file changed, 11 insertions(+), 2 deletions(-)
a83cc2
a83cc2
diff --git a/migration/ram.c b/migration/ram.c
a83cc2
index 4682f3625c..5d64917dce 100644
a83cc2
--- a/migration/ram.c
a83cc2
+++ b/migration/ram.c
a83cc2
@@ -819,8 +819,6 @@ static inline bool migration_bitmap_clear_dirty(RAMState *rs,
a83cc2
 {
a83cc2
     bool ret;
a83cc2
 
a83cc2
-    QEMU_LOCK_GUARD(&rs->bitmap_mutex);
a83cc2
-
a83cc2
     /*
a83cc2
      * Clear dirty bitmap if needed.  This _must_ be called before we
a83cc2
      * send any of the page in the chunk because we need to make sure
a83cc2
@@ -2869,6 +2867,14 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
a83cc2
         goto out;
a83cc2
     }
a83cc2
 
a83cc2
+    /*
a83cc2
+     * We'll take this lock a little bit long, but it's okay for two reasons.
a83cc2
+     * Firstly, the only possible other thread to take it is who calls
a83cc2
+     * qemu_guest_free_page_hint(), which should be rare; secondly, see
a83cc2
+     * MAX_WAIT (if curious, further see commit 4508bd9ed8053ce) below, which
a83cc2
+     * guarantees that we'll at least released it in a regular basis.
a83cc2
+     */
a83cc2
+    qemu_mutex_lock(&rs->bitmap_mutex);
a83cc2
     WITH_RCU_READ_LOCK_GUARD() {
a83cc2
         if (ram_list.version != rs->last_version) {
a83cc2
             ram_state_reset(rs);
a83cc2
@@ -2928,6 +2934,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque)
a83cc2
             i++;
a83cc2
         }
a83cc2
     }
a83cc2
+    qemu_mutex_unlock(&rs->bitmap_mutex);
a83cc2
 
a83cc2
     /*
a83cc2
      * Must occur before EOS (or any QEMUFile operation)
a83cc2
@@ -3710,6 +3717,7 @@ void colo_flush_ram_cache(void)
a83cc2
     unsigned long offset = 0;
a83cc2
 
a83cc2
     memory_global_dirty_log_sync();
a83cc2
+    qemu_mutex_lock(&ram_state->bitmap_mutex);
a83cc2
     WITH_RCU_READ_LOCK_GUARD() {
a83cc2
         RAMBLOCK_FOREACH_NOT_IGNORED(block) {
a83cc2
             ramblock_sync_dirty_bitmap(ram_state, block);
a83cc2
@@ -3738,6 +3746,7 @@ void colo_flush_ram_cache(void)
a83cc2
         }
a83cc2
     }
a83cc2
     trace_colo_flush_ram_cache_end();
a83cc2
+    qemu_mutex_unlock(&ram_state->bitmap_mutex);
a83cc2
 }
a83cc2
 
a83cc2
 /**
a83cc2
-- 
a83cc2
2.27.0
a83cc2