Blame SOURCES/kvm-memory-Fix-incorrect-calls-of-log_global_start-stop.patch

dc1fe0
From b169059c8fbf15c3ffeec0f68b938cb9febd8db7 Mon Sep 17 00:00:00 2001
dc1fe0
From: Peter Xu <peterx@redhat.com>
dc1fe0
Date: Tue, 30 Nov 2021 16:00:28 +0800
dc1fe0
Subject: [PATCH 5/6] memory: Fix incorrect calls of log_global_start/stop
dc1fe0
MIME-Version: 1.0
dc1fe0
Content-Type: text/plain; charset=UTF-8
dc1fe0
Content-Transfer-Encoding: 8bit
dc1fe0
dc1fe0
RH-Author: Peter Xu <peterx@redhat.com>
dc1fe0
RH-MergeRequest: 77: memory: Fix qemu crash on continuous migrations of stopped VM
dc1fe0
RH-Commit: [1/2] 6271ee689266b24d29d4c87f60e5b096ef5f5d63 (peterx/qemu-kvm)
dc1fe0
RH-Bugzilla: 2044818
dc1fe0
RH-Acked-by: Paolo Bonzini <None>
dc1fe0
RH-Acked-by: David Hildenbrand <david@redhat.com>
dc1fe0
RH-Acked-by: quintela1 <quintela@redhat.com>
dc1fe0
dc1fe0
We should only call the log_global_start/stop when the global dirty track
dc1fe0
bitmask changes from zero<->non-zero.
dc1fe0
dc1fe0
No real issue reported for this yet probably because no immediate user to
dc1fe0
enable both dirty rate measurement and migration at the same time.  However
dc1fe0
it'll be good to be prepared for it.
dc1fe0
dc1fe0
Fixes: 63b41db4bc ("memory: make global_dirty_tracking a bitmask")
dc1fe0
Cc: qemu-stable@nongnu.org
dc1fe0
Cc: Hyman Huang <huangy81@chinatelecom.cn>
dc1fe0
Cc: Paolo Bonzini <pbonzini@redhat.com>
dc1fe0
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
dc1fe0
Cc: Juan Quintela <quintela@redhat.com>
dc1fe0
Cc: David Hildenbrand <david@redhat.com>
dc1fe0
Signed-off-by: Peter Xu <peterx@redhat.com>
dc1fe0
Reviewed-by: David Hildenbrand <david@redhat.com>
dc1fe0
Message-Id: <20211130080028.6474-1-peterx@redhat.com>
dc1fe0
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
dc1fe0
(cherry picked from commit 7b0538ed3a22ce30817f818449d10701fb0821f9)
dc1fe0
Signed-off-by: Peter Xu <peterx@redhat.com>
dc1fe0
---
dc1fe0
 softmmu/memory.c | 27 ++++++++++++++-------------
dc1fe0
 1 file changed, 14 insertions(+), 13 deletions(-)
dc1fe0
dc1fe0
diff --git a/softmmu/memory.c b/softmmu/memory.c
dc1fe0
index 7340e19ff5..81d4bf1454 100644
dc1fe0
--- a/softmmu/memory.c
dc1fe0
+++ b/softmmu/memory.c
dc1fe0
@@ -2773,6 +2773,8 @@ static VMChangeStateEntry *vmstate_change;
dc1fe0
 
dc1fe0
 void memory_global_dirty_log_start(unsigned int flags)
dc1fe0
 {
dc1fe0
+    unsigned int old_flags = global_dirty_tracking;
dc1fe0
+
dc1fe0
     if (vmstate_change) {
dc1fe0
         qemu_del_vm_change_state_handler(vmstate_change);
dc1fe0
         vmstate_change = NULL;
dc1fe0
@@ -2781,15 +2783,14 @@ void memory_global_dirty_log_start(unsigned int flags)
dc1fe0
     assert(flags && !(flags & (~GLOBAL_DIRTY_MASK)));
dc1fe0
     assert(!(global_dirty_tracking & flags));
dc1fe0
     global_dirty_tracking |= flags;
dc1fe0
-
dc1fe0
     trace_global_dirty_changed(global_dirty_tracking);
dc1fe0
 
dc1fe0
-    MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
dc1fe0
-
dc1fe0
-    /* Refresh DIRTY_MEMORY_MIGRATION bit.  */
dc1fe0
-    memory_region_transaction_begin();
dc1fe0
-    memory_region_update_pending = true;
dc1fe0
-    memory_region_transaction_commit();
dc1fe0
+    if (!old_flags) {
dc1fe0
+        MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
dc1fe0
+        memory_region_transaction_begin();
dc1fe0
+        memory_region_update_pending = true;
dc1fe0
+        memory_region_transaction_commit();
dc1fe0
+    }
dc1fe0
 }
dc1fe0
 
dc1fe0
 static void memory_global_dirty_log_do_stop(unsigned int flags)
dc1fe0
@@ -2800,12 +2801,12 @@ static void memory_global_dirty_log_do_stop(unsigned int flags)
dc1fe0
 
dc1fe0
     trace_global_dirty_changed(global_dirty_tracking);
dc1fe0
 
dc1fe0
-    /* Refresh DIRTY_MEMORY_MIGRATION bit.  */
dc1fe0
-    memory_region_transaction_begin();
dc1fe0
-    memory_region_update_pending = true;
dc1fe0
-    memory_region_transaction_commit();
dc1fe0
-
dc1fe0
-    MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
dc1fe0
+    if (!global_dirty_tracking) {
dc1fe0
+        memory_region_transaction_begin();
dc1fe0
+        memory_region_update_pending = true;
dc1fe0
+        memory_region_transaction_commit();
dc1fe0
+        MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse);
dc1fe0
+    }
dc1fe0
 }
dc1fe0
 
dc1fe0
 static void memory_vm_change_state_handler(void *opaque, bool running,
dc1fe0
-- 
dc1fe0
2.27.0
dc1fe0