diff mbox series

[v2,01/15] migration: Take bitmap mutex when completing ram migration

Message ID 20221011215559.602584-2-peterx@redhat.com (mailing list archive)
State New, archived
Headers show
Series migration: Postcopy Preempt-Full | expand

Commit Message

Peter Xu Oct. 11, 2022, 9:55 p.m. UTC
Any call to ram_find_and_save_block() needs to take the bitmap mutex.  We
used to not take it for most of ram_save_complete() because we thought
we're the only one left using the bitmap, but it's not true after the
preempt full patchset applied, since the return path can be taking it too.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 migration/ram.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Dr. David Alan Gilbert Oct. 12, 2022, 4:14 p.m. UTC | #1
* Peter Xu (peterx@redhat.com) wrote:
> Any call to ram_find_and_save_block() needs to take the bitmap mutex.  We
> used to not take it for most of ram_save_complete() because we thought
> we're the only one left using the bitmap, but it's not true after the
> preempt full patchset applied, since the return path can be taking it too.
> 
> Signed-off-by: Peter Xu <peterx@redhat.com>

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

> ---
>  migration/ram.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/migration/ram.c b/migration/ram.c
> index 1338e47665..cfeb571800 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -3406,6 +3406,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
>          /* try transferring iterative blocks of memory */
>  
>          /* flush all remaining blocks regardless of rate limiting */
> +        qemu_mutex_lock(&rs->bitmap_mutex);
>          while (true) {
>              int pages;
>  
> @@ -3419,6 +3420,7 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
>                  break;
>              }
>          }
> +        qemu_mutex_unlock(&rs->bitmap_mutex);
>  
>          flush_compressed_data(rs);
>          ram_control_after_iterate(f, RAM_CONTROL_FINISH);
> -- 
> 2.37.3
>
Juan Quintela Nov. 14, 2022, 3:06 p.m. UTC | #2
Peter Xu <peterx@redhat.com> wrote:
> Any call to ram_find_and_save_block() needs to take the bitmap mutex.  We
> used to not take it for most of ram_save_complete() because we thought
> we're the only one left using the bitmap, but it's not true after the
> preempt full patchset applied, since the return path can be taking it too.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>
diff mbox series

Patch

diff --git a/migration/ram.c b/migration/ram.c
index 1338e47665..cfeb571800 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -3406,6 +3406,7 @@  static int ram_save_complete(QEMUFile *f, void *opaque)
         /* try transferring iterative blocks of memory */
 
         /* flush all remaining blocks regardless of rate limiting */
+        qemu_mutex_lock(&rs->bitmap_mutex);
         while (true) {
             int pages;
 
@@ -3419,6 +3420,7 @@  static int ram_save_complete(QEMUFile *f, void *opaque)
                 break;
             }
         }
+        qemu_mutex_unlock(&rs->bitmap_mutex);
 
         flush_compressed_data(rs);
         ram_control_after_iterate(f, RAM_CONTROL_FINISH);