iommufd: preserve DMA mappings

During cpr-transfer load in new QEMU, the vfio_memory_listener causes
spurious calls to map and unmap DMA regions, as devices are created and
the address space is built.  This memory was already already mapped by the
device in old QEMU, so suppress the map and unmap callbacks during incoming
CPR.

Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Link: https://lore.kernel.org/qemu-devel/1751493538-202042-20-git-send-email-steven.sistare@oracle.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
Steve Sistare 2025-07-02 14:58:56 -07:00 committed by Cédric Le Goater
parent 5c066c4be2
commit 6ff4cccd13

View file

@ -245,6 +245,10 @@ int iommufd_backend_map_file_dma(IOMMUFDBackend *be, uint32_t ioas_id,
.length = size, .length = size,
}; };
if (cpr_is_incoming()) {
return 0;
}
if (!readonly) { if (!readonly) {
map.flags |= IOMMU_IOAS_MAP_WRITEABLE; map.flags |= IOMMU_IOAS_MAP_WRITEABLE;
} }
@ -274,6 +278,10 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
.length = size, .length = size,
}; };
if (cpr_is_incoming()) {
return 0;
}
ret = ioctl(fd, IOMMU_IOAS_UNMAP, &unmap); ret = ioctl(fd, IOMMU_IOAS_UNMAP, &unmap);
/* /*
* IOMMUFD takes mapping as some kind of object, unmapping * IOMMUFD takes mapping as some kind of object, unmapping