Message ID | 20211005080751.3797161-2-eesposit@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Migration: fix missing iothread locking | expand |
Emanuele Giuseppe Esposito <eesposit@redhat.com> wrote: > init_dirty_bitmap_migration assumes the iothread lock (BQL) > to be held, but instead it isn't. > > Instead of adding the lock to qemu_savevm_state_setup(), > follow the same pattern as the other ->save_setup callbacks > and lock+unlock inside dirty_bitmap_save_setup(). > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> queued.
Juan Quintela <quintela@redhat.com> wrote: > Emanuele Giuseppe Esposito <eesposit@redhat.com> wrote: >> init_dirty_bitmap_migration assumes the iothread lock (BQL) >> to be held, but instead it isn't. >> >> Instead of adding the lock to qemu_savevm_state_setup(), >> follow the same pattern as the other ->save_setup callbacks >> and lock+unlock inside dirty_bitmap_save_setup(). >> >> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> >> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > > Reviewed-by: Juan Quintela <quintela@redhat.com> And I realized that this patch is already on the tree, just not through the migration tree. Ignore the noise. Later, Juan.
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c index 35f5ef688d..9aba7d9c22 100644 --- a/migration/block-dirty-bitmap.c +++ b/migration/block-dirty-bitmap.c @@ -1215,7 +1215,10 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) { DBMSaveState *s = &((DBMState *)opaque)->save; SaveBitmapState *dbms = NULL; + + qemu_mutex_lock_iothread(); if (init_dirty_bitmap_migration(s) < 0) { + qemu_mutex_unlock_iothread(); return -1; } @@ -1223,7 +1226,7 @@ static int dirty_bitmap_save_setup(QEMUFile *f, void *opaque) send_bitmap_start(f, s, dbms); } qemu_put_bitmap_flags(f, DIRTY_BITMAP_MIG_FLAG_EOS); - + qemu_mutex_unlock_iothread(); return 0; }