diff options
author | Steve Sistare <steven.sistare@oracle.com> | 2025-06-10 08:39:18 -0700 |
---|---|---|
committer | Cédric Le Goater <clg@redhat.com> | 2025-06-11 14:01:58 +0200 |
commit | 1faadd96306b428f2e8e35f71761c333a6777f55 (patch) | |
tree | b4bb9338abcfedad3358087739bb6e1076ed5c7b | |
parent | c29a65ed68535288551d2bf70ae32f3df371a57d (diff) | |
download | qemu-1faadd96306b428f2e8e35f71761c333a6777f55.zip qemu-1faadd96306b428f2e8e35f71761c333a6777f55.tar.gz qemu-1faadd96306b428f2e8e35f71761c333a6777f55.tar.bz2 |
vfio/container: discard old DMA vaddr
In the container pre_save handler, discard the virtual addresses in DMA
mappings with VFIO_DMA_UNMAP_FLAG_VADDR, because guest RAM will be
remapped at a different VA after in new QEMU. DMA to already-mapped
pages continues.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Link: https://lore.kernel.org/qemu-devel/1749569991-25171-6-git-send-email-steven.sistare@oracle.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
-rw-r--r-- | hw/vfio/cpr-legacy.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/hw/vfio/cpr-legacy.c b/hw/vfio/cpr-legacy.c index ac4a9ab..ef106d0 100644 --- a/hw/vfio/cpr-legacy.c +++ b/hw/vfio/cpr-legacy.c @@ -15,6 +15,22 @@ #include "migration/vmstate.h" #include "qapi/error.h" +static bool vfio_dma_unmap_vaddr_all(VFIOContainer *container, Error **errp) +{ + struct vfio_iommu_type1_dma_unmap unmap = { + .argsz = sizeof(unmap), + .flags = VFIO_DMA_UNMAP_FLAG_VADDR | VFIO_DMA_UNMAP_FLAG_ALL, + .iova = 0, + .size = 0, + }; + if (ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, &unmap)) { + error_setg_errno(errp, errno, "vfio_dma_unmap_vaddr_all"); + return false; + } + return true; +} + + static bool vfio_cpr_supported(VFIOContainer *container, Error **errp) { if (!ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UPDATE_VADDR)) { @@ -30,10 +46,23 @@ static bool vfio_cpr_supported(VFIOContainer *container, Error **errp) } } +static int vfio_container_pre_save(void *opaque) +{ + VFIOContainer *container = opaque; + Error *local_err = NULL; + + if (!vfio_dma_unmap_vaddr_all(container, &local_err)) { + error_report_err(local_err); + return -1; + } + return 0; +} + static const VMStateDescription vfio_container_vmstate = { .name = "vfio-container", .version_id = 0, .minimum_version_id = 0, + .pre_save = vfio_container_pre_save, .needed = cpr_incoming_needed, .fields = (VMStateField[]) { VMSTATE_END_OF_LIST() |