Skip to content

Commit

Permalink
vfio/migration: Block VFIO migration with postcopy migration
Browse files Browse the repository at this point in the history
VFIO migration is not compatible with postcopy migration. A VFIO device
in the destination can't handle page faults for pages that have not been
sent yet.

Doing such migration will cause the VM to crash in the destination:

qemu-system-x86_64: VFIO_MAP_DMA failed: Bad address
qemu-system-x86_64: vfio_dma_map(0x55a28c7659d0, 0xc0000, 0xb000, 0x7f1b11a00000) = -14 (Bad address)
qemu: hardware error: vfio: DMA mapping failed, unable to continue

To prevent this, block VFIO migration with postcopy migration.

Reported-by: Yanghang Liu <yanghliu@redhat.com>
Signed-off-by: Avihai Horon <avihaih@nvidia.com>
Tested-by: Yanghang Liu <yanghliu@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
  • Loading branch information
avihai1122 authored and legoater committed Sep 11, 2023
1 parent 08fc4cb commit bf7ef7a
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions hw/vfio/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,27 @@ static bool vfio_precopy_supported(VFIODevice *vbasedev)

/* ---------------------------------------------------------------------- */

static int vfio_save_prepare(void *opaque, Error **errp)
{
VFIODevice *vbasedev = opaque;

/*
* Snapshot doesn't use postcopy, so allow snapshot even if postcopy is on.
*/
if (runstate_check(RUN_STATE_SAVE_VM)) {
return 0;
}

if (migrate_postcopy_ram()) {
error_setg(
errp, "%s: VFIO migration is not supported with postcopy migration",
vbasedev->name);
return -EOPNOTSUPP;
}

return 0;
}

static int vfio_save_setup(QEMUFile *f, void *opaque)
{
VFIODevice *vbasedev = opaque;
Expand Down Expand Up @@ -640,6 +661,7 @@ static bool vfio_switchover_ack_needed(void *opaque)
}

static const SaveVMHandlers savevm_vfio_handlers = {
.save_prepare = vfio_save_prepare,
.save_setup = vfio_save_setup,
.save_cleanup = vfio_save_cleanup,
.state_pending_estimate = vfio_state_pending_estimate,
Expand Down

0 comments on commit bf7ef7a

Please sign in to comment.