mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-09-08 16:07:39 -06:00
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>
This commit is contained in:
parent
c29a65ed68
commit
1faadd9630
1 changed files with 29 additions and 0 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue