migrate_add_blocker() fails when running with --only-migratable, and when migration is in progress.
qxl.c continues after migrate_add_blocker() fails: { /* * Windows 8 drivers place qxl commands in the vram * (instead of the ram) bar. We can't live migrate such a * guest, so add a migration blocker in case we detect * this, to avoid triggering the assert in pre_save(). * * https://cgit.freedesktop.org/spice/win32/qxl-wddm-dod/commit/?id=f6e099db39e7d0787f294d5fd0dce328b5210faa */ void *msg = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id); if (msg != NULL && ( msg < (void *)qxl->vga.vram_ptr || msg > ((void *)qxl->vga.vram_ptr + qxl->vga.vram_size))) { if (!qxl->migration_blocker) { Error *local_err = NULL; error_setg(&qxl->migration_blocker, "qxl: guest bug: command not in ram bar"); migrate_add_blocker(qxl->migration_blocker, &local_err); if (local_err) { error_report_err(local_err); } } } } Why is this safe? If the blocker is needed to prevent a crash, as the comment says, then what prevents the crash when adding the blocker fails? Code goes back to commit 86dbcdd9c7590d06db89ca256c5eaf0b4aba8858 Author: Gerd Hoffmann <kra...@redhat.com> Date: Mon Apr 10 13:31:31 2017 +0200 qxl: add migration blocker to avoid pre-save assert Cc: 1635...@bugs.launchpad.net Signed-off-by: Gerd Hoffmann <kra...@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> Message-id: 20170410113131.2585-1-kra...@redhat.com