]> git.proxmox.com Git - mirror_qemu.git/commitdiff
multifd: Fix a race on reading MultiFDPages_t.block
authorZhenzhong Duan <zhenzhong.duan@intel.com>
Mon, 17 Oct 2022 07:53:50 +0000 (15:53 +0800)
committerJuan Quintela <quintela@redhat.com>
Mon, 6 Feb 2023 18:22:57 +0000 (19:22 +0100)
In multifd_queue_page() MultiFDPages_t.block is checked twice.
Between the two checks, MultiFDPages_t.block may be reset to NULL
by multifd thread. This lead to the 2nd check always true then a
redundant page submitted to multifd thread again.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
migration/multifd.c

index eeb4fb87eed87ed73cb5ed8c7ad0469019c13ced..ad89293b4e10c42c95a9eb628ea4650e366ec5a8 100644 (file)
@@ -442,6 +442,7 @@ static int multifd_send_pages(QEMUFile *f)
 int multifd_queue_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset)
 {
     MultiFDPages_t *pages = multifd_send_state->pages;
+    bool changed = false;
 
     if (!pages->block) {
         pages->block = block;
@@ -454,14 +455,16 @@ int multifd_queue_page(QEMUFile *f, RAMBlock *block, ram_addr_t offset)
         if (pages->num < pages->allocated) {
             return 1;
         }
+    } else {
+        changed = true;
     }
 
     if (multifd_send_pages(f) < 0) {
         return -1;
     }
 
-    if (pages->block != block) {
-        return  multifd_queue_page(f, block, offset);
+    if (changed) {
+        return multifd_queue_page(f, block, offset);
     }
 
     return 1;